All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arend van Spriel <arend.vanspriel@broadcom.com>
To: Ian Molton <ian@mnementh.co.uk>, linux-wireless@vger.kernel.org
Cc: franky.lin@broadcom.com, hante.meuleman@broadcom.com
Subject: Re: [PATCH 07/34] brcmfmac: Remove brcmf_sdiod_request_data()
Date: Mon, 7 Aug 2017 13:25:58 +0200	[thread overview]
Message-ID: <59884E46.5090000@broadcom.com> (raw)
In-Reply-To: <20170726202557.15632-8-ian@mnementh.co.uk>

On 26-07-17 22:25, Ian Molton wrote:
> This function is obfuscating how IO works on this chip. Remove it
> and push its logic into brcmf_sdiod_reg_{read,write}().
>
> Handling of -ENOMEDIUM is altered, but as that's pretty much broken anyway
> we can ignore that.

Please explain why you think it is broken.

Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
> Signed-off-by: Ian Molton <ian@mnementh.co.uk>

more comments below.

> # Conflicts:
> #	drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
> ---
>  .../wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c  | 239 ++++++++-------------
>  .../wireless/broadcom/brcm80211/brcmfmac/sdio.h    |   2 +-
>  2 files changed, 87 insertions(+), 154 deletions(-)
>
> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
> index d217b1281e0d..f703d7be6a85 100644
> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c

[...]

>  static int brcmf_sdiod_reg_write(struct brcmf_sdio_dev *sdiodev, u32 addr,
>  				 u8 regsz, void *data)
>  {
> -	u8 func;
> -	s32 retry = 0;
>  	int ret;
>
> -	if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM)
> -		return -ENOMEDIUM;
> -
>  	/*
>  	 * figure out how to read the register based on address range
>  	 * 0x00 ~ 0x7FF: function 0 CCCR and FBR
>  	 * 0x10000 ~ 0x1FFFF: function 1 miscellaneous registers
>  	 * The rest: function 1 silicon backplane core registers
> +	 * f0 writes must be bytewise
>  	 */
> -	if ((addr & ~REG_F0_REG_MASK) == 0)
> -		func = SDIO_FUNC_0;
> -	else
> -		func = SDIO_FUNC_1;
> -
> -	do {
> -		/* for retry wait for 1 ms till bus get settled down */
> -		if (retry)
> -			usleep_range(1000, 2000);
>
> -		ret = brcmf_sdiod_request_data(sdiodev, func, addr, regsz,
> -					       data, true);
> -
> -	} while (ret != 0 && ret != -ENOMEDIUM &&
> -		 retry++ < SDIOH_API_ACCESS_RETRY_LIMIT);
> +	if ((addr & ~REG_F0_REG_MASK) == 0) {
> +		if (WARN_ON(regsz > 1))
> +			return -EINVAL;
> +		ret = brcmf_sdiod_f0_writeb(sdiodev->func[0], *(u8 *)data, addr);
> +	} else {
> +		switch (regsz) {
> +		case 1:
> +			sdio_writeb(sdiodev->func[1], *(u8 *)data, addr, &ret);
> +			break;
> +		case 4:
> +			ret = brcmf_sdiod_addrprep(sdiodev, &addr);
> +			if (ret)
> +				goto done;
>
> -	if (ret == -ENOMEDIUM)
> -		brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);
> +			sdio_writel(sdiodev->func[1], *(u32 *)data, addr, &ret);
> +			break;
> +		default:
> +			BUG();

Please do not use BUG() as it simply crashes the system. You may argue 
that we never reach this unless a coding mistake is made, but still we 
prefer WARN() over BUG() in such cases.

> +			ret = -EINVAL;
> +			break;
> +		}
> +	}
>
> +done:
>  	return ret;
>  }
>
>  static int brcmf_sdiod_reg_read(struct brcmf_sdio_dev *sdiodev, u32 addr,
>  				u8 regsz, void *data)
>  {
> -	u8 func;
> -	s32 retry = 0;
>  	int ret;
>
> -	if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM)
> -		return -ENOMEDIUM;
> -
>  	/*
>  	 * figure out how to read the register based on address range
>  	 * 0x00 ~ 0x7FF: function 0 CCCR and FBR
>  	 * 0x10000 ~ 0x1FFFF: function 1 miscellaneous registers
>  	 * The rest: function 1 silicon backplane core registers
> +	 * f0 reads must be bytewise
>  	 */
> -	if ((addr & ~REG_F0_REG_MASK) == 0)
> -		func = SDIO_FUNC_0;
> -	else
> -		func = SDIO_FUNC_1;
> -
> -	do {
> -		memset(data, 0, regsz);
> -
> -		/* for retry wait for 1 ms till bus get settled down */
> -		if (retry)
> -			usleep_range(1000, 2000);
> -
> -		ret = brcmf_sdiod_request_data(sdiodev, func, addr, regsz,
> -					       data, false);
> -
> -	} while (ret != 0 && ret != -ENOMEDIUM &&
> -		 retry++ < SDIOH_API_ACCESS_RETRY_LIMIT);
> -
> -	if (ret == -ENOMEDIUM)
> -		brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);
> -
> -	return ret;
> -}
> -
> -static int
> -brcmf_sdiod_set_sbaddr_window(struct brcmf_sdio_dev *sdiodev, u32 address)
> -{
> -	int err = 0, i;
> -	u32 addr;
> -
> -	if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM)
> -		return -ENOMEDIUM;
> -
> -	addr = (address & SBSDIO_SBWINDOW_MASK) >> 8;
> -
> -	for (i = 0 ; i < 3 && !err ; i++, addr >>= 8)
> -		brcmf_sdiod_regwb(sdiodev, SBSDIO_FUNC1_SBADDRLOW + i,
> -				  addr & 0xff, &err);
> -
> -	return err;
> -}
> -
> -static int
> -brcmf_sdiod_addrprep(struct brcmf_sdio_dev *sdiodev, u32 *addr)
> -{
> -	uint bar0 = *addr & ~SBSDIO_SB_OFT_ADDR_MASK;
> -	int err = 0;
> -
> -	if (bar0 != sdiodev->sbwad) {
> -		err = brcmf_sdiod_set_sbaddr_window(sdiodev, bar0);
> -		if (err)
> -			return err;
> +	if ((addr & ~REG_F0_REG_MASK) == 0) {
> +		if (WARN_ON(regsz > 1))
> +			return -EINVAL;
> +		*(u8 *)data = sdio_f0_readb(sdiodev->func[0], addr, &ret);
> +	} else {
> +		switch (regsz) {
> +		case 1:
> +			*(u8 *)data = sdio_readb(sdiodev->func[1], addr, &ret);
> +			break;
> +		case 4:
> +			ret = brcmf_sdiod_addrprep(sdiodev, &addr);
> +			if (ret)
> +				goto done;
>
> -		sdiodev->sbwad = bar0;
> +			*(u32 *)data = sdio_readl(sdiodev->func[1], addr, &ret);
> +			break;
> +		default:
> +			BUG();

same here as with reg_write() function.

> +			ret = -EINVAL;
> +			break;
> +		}
>  	}
>
> -	*addr &= SBSDIO_SB_OFT_ADDR_MASK;
> -	*addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
> -
> -	return 0;
> +done:
> +	return ret;
>  }
>
>  u8 brcmf_sdiod_regrb(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret)
> @@ -439,15 +386,9 @@ u32 brcmf_sdiod_regrl(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret)
>  	int retval;
>
>  	brcmf_dbg(SDIO, "addr:0x%08x\n", addr);
> -	retval = brcmf_sdiod_addrprep(sdiodev, &addr);
> -	if (retval)
> -		goto done;
> -
> -	retval = brcmf_sdiod_reg_read(sdiodev, addr, 4, &data);
> -
>  	brcmf_dbg(SDIO, "data:0x%08x\n", data);

Now this debug statement move before the actual read, which makes it 
useless. You are going to remove it in a subsequent patch, but still.

> +	retval = brcmf_sdiod_reg_read(sdiodev, addr, 4, &data);
>
> -done:
>  	if (ret)
>  		*ret = retval;
>

  reply	other threads:[~2017-08-07 11:26 UTC|newest]

Thread overview: 85+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-07-26 20:25 Patch v4: Clean up brcmfmac driver Ian Molton
2017-07-26 20:25 ` [PATCH 01/34] brcmfmac: Fix parameter order in brcmf_sdiod_f0_writeb() Ian Molton
2017-08-07 11:25   ` Arend van Spriel
2017-08-19 19:52     ` Ian Molton
2017-07-26 20:25 ` [PATCH 02/34] brcmfmac: Register sizes on hardware are not dependent on compiler types Ian Molton
2017-08-07 11:25   ` Arend van Spriel
2017-07-26 20:25 ` [PATCH 03/34] brcmfmac: Split brcmf_sdiod_regrw_helper() up Ian Molton
2017-08-07 11:25   ` Arend van Spriel
2017-08-07 17:49     ` Ian Molton
2017-07-26 20:25 ` [PATCH 04/34] brcmfmac: Clean up brcmf_sdiod_set_sbaddr_window() Ian Molton
2017-08-05 20:08   ` Arend van Spriel
2017-07-26 20:25 ` [PATCH 05/34] brcmfmac: Remove dead IO code Ian Molton
2017-08-07 11:25   ` Arend van Spriel
2017-07-26 20:25 ` [PATCH 06/34] brcmfmac: Remove bandaid for SleepCSR Ian Molton
2017-08-07 11:25   ` Arend van Spriel
2017-08-19 20:57     ` Ian Molton
2017-07-26 20:25 ` [PATCH 07/34] brcmfmac: Remove brcmf_sdiod_request_data() Ian Molton
2017-08-07 11:25   ` Arend van Spriel [this message]
2017-08-07 17:51     ` Ian Molton
2017-08-19 20:02       ` Ian Molton
2017-08-30 19:32         ` Arend van Spriel
2017-07-26 20:25 ` [PATCH 08/34] brcmfmac: Fix uninitialised variable Ian Molton
2017-08-07 11:26   ` Arend van Spriel
2017-08-19 21:06     ` Ian Molton
2017-07-26 20:25 ` [PATCH 09/34] brcmfmac: Remove noisy debugging Ian Molton
2017-08-07 11:26   ` Arend van Spriel
2017-08-19 20:18     ` Ian Molton
2017-07-26 20:25 ` [PATCH 10/34] brcmfmac: Rename bcmerror to err Ian Molton
2017-08-07 11:26   ` Arend van Spriel
2017-07-26 20:25 ` [PATCH 11/34] brcmfmac: Split brcmf_sdiod_buffrw function up Ian Molton
2017-08-07 11:26   ` Arend van Spriel
2017-08-19 21:41     ` Ian Molton
2017-07-26 20:25 ` [PATCH 12/34] brcmfmac: Replace old IO functions with simpler ones Ian Molton
2017-08-07 11:26   ` Arend van Spriel
2017-08-07 17:55     ` Ian Molton
2017-08-19 21:50       ` Ian Molton
2017-07-26 20:25 ` [PATCH 13/34] brcmfmac: Tidy register definitions a little Ian Molton
2017-08-07 19:30   ` Arend van Spriel
2017-07-26 20:25 ` [PATCH 14/34] brcmfmac: Remove brcmf_sdiod_addrprep() Ian Molton
2017-08-07 11:27   ` Arend van Spriel
2017-08-19 20:27     ` Ian Molton
2017-07-26 20:25 ` [PATCH 15/34] brcmfamc: remove unnecessary call to brcmf_sdiod_set_backplane_window() Ian Molton
2017-08-07 11:11   ` Arend van Spriel
2017-08-07 11:54     ` Arend van Spriel
2017-07-26 20:25 ` [PATCH 16/34] brcmfmac: Cleanup offsetof() Ian Molton
2017-07-26 20:25 ` [PATCH 17/34] brcmfmac: Remove unused macro Ian Molton
2017-07-26 20:25 ` [PATCH 18/34] brcmfmac: Rename SOC_AI to SOC_AXI Ian Molton
2017-07-26 20:25 ` [PATCH 19/34] brcmfmac: Get rid of chip_priv and core_priv structs Ian Molton
2017-07-29 10:12   ` kbuild test robot
2017-07-26 20:25 ` [PATCH 20/34] brcmfmac: Whitespace patch Ian Molton
2017-07-26 20:25 ` [PATCH 21/34] brcmfmac: Simplify chip probe routine Ian Molton
2017-07-26 20:25 ` [PATCH 22/34] brcmfmac: Rename axi functions for clarity Ian Molton
2017-07-26 20:25 ` [PATCH 23/34] brcmfmac: HUGE cleanup of IO access functions Ian Molton
2017-07-26 20:25 ` [PATCH 24/34] brcmfmac: Rename chip.ctx -> chip.bus_priv Ian Molton
2017-07-26 20:25 ` [PATCH 25/34] brcmfmac: Remove repeated calls to brcmf_chip_get_core() Ian Molton
2017-07-26 20:25 ` [PATCH 26/34] brcmfmac: General cleaning up. whitespace and comments fix Ian Molton
2017-07-26 20:25 ` [PATCH 27/34] brcmfmac: Remove {r,w}_sdreg32 Ian Molton
2017-07-26 20:25 ` [PATCH 28/34] brcmfmac: Rename buscore->core for consistency Ian Molton
2017-07-26 20:25 ` [PATCH 29/34] brcmfmac: stabilise the value of ->sbwad in use for some xfer routines Ian Molton
2017-08-07 12:32   ` Arend van Spriel
2017-08-19 20:31     ` Ian Molton
2017-07-26 20:25 ` [PATCH 30/34] brcmfmac: Correctly handle accesses to SDIO func0 Ian Molton
2017-08-08 12:36   ` Arend van Spriel
2017-07-26 20:25 ` [PATCH 31/34] brcmfmac: Remove func0 from function array Ian Molton
2017-08-08 11:19   ` Arend van Spriel
2017-08-08 11:27     ` Ian Molton
2017-08-08 12:33       ` Arend van Spriel
2017-08-19 20:33     ` Ian Molton
2017-07-26 20:25 ` [PATCH 32/34] brcmfmac: Replace function index with function pointer Ian Molton
2017-07-28 15:55   ` [PATCH] brcmfmac: fix semicolon.cocci warnings kbuild test robot
2017-07-28 15:55   ` [PATCH 32/34] brcmfmac: Replace function index with function pointer kbuild test robot
2017-08-08 12:29   ` Arend van Spriel
2017-07-26 20:25 ` [PATCH 33/34] brcmfmac: Remove array of functions Ian Molton
2017-08-08 12:29   ` Arend van Spriel
2017-07-26 20:25 ` [PATCH 34/34] brcmfmac: Reduce the noise from repeatedly dereferencing common pointers Ian Molton
2017-08-08 12:29   ` Arend van Spriel
2017-08-19 20:39     ` Ian Molton
2017-07-27  6:17 ` Patch v4: Clean up brcmfmac driver Kalle Valo
2017-07-27  9:47   ` Ian Molton
2017-07-27  9:52     ` Arend van Spriel
2017-07-27 10:00       ` Ian Molton
2017-07-27 10:09         ` Arend van Spriel
2017-07-27 10:12           ` Ian Molton
2017-07-27 10:31     ` Kalle Valo
  -- strict thread matches above, loose matches on Subject: below --
2017-07-19 19:07 PATCH v3 brcmfmac driver cleanup Ian Molton
2017-07-19 19:07 ` [PATCH 07/34] brcmfmac: Remove brcmf_sdiod_request_data() Ian Molton

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=59884E46.5090000@broadcom.com \
    --to=arend.vanspriel@broadcom.com \
    --cc=franky.lin@broadcom.com \
    --cc=hante.meuleman@broadcom.com \
    --cc=ian@mnementh.co.uk \
    --cc=linux-wireless@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.