2014-06-12 09:11:51

by Varka Bhadram

[permalink] [raw]
Subject: [PATCH net-next] mrf24j40: separate h/w init and add checkings

separate the mrf24j40 hardware initialisation from probe()
and adds the sanity checkings.

These checkings are required if somebody hasn't a right spi configuration
the probe function should fail. So we have to return from there.

Signed-off-by: Varka Bhadram <[email protected]>
---
drivers/net/ieee802154/mrf24j40.c | 114 +++++++++++++++++++++++++++++--------
1 file changed, 89 insertions(+), 25 deletions(-)

diff --git a/drivers/net/ieee802154/mrf24j40.c b/drivers/net/ieee802154/mrf24j40.c
index 4048062..9574d10 100644
--- a/drivers/net/ieee802154/mrf24j40.c
+++ b/drivers/net/ieee802154/mrf24j40.c
@@ -610,6 +610,92 @@ out:
return IRQ_HANDLED;
}

+static int mrf24j40_hw_init(struct mrf24j40 *devrec)
+{
+ int ret;
+ u8 val;
+
+ /* Initialize the device.
+ From datasheet section 3.2: Initialization. */
+ ret = write_short_reg(devrec, REG_SOFTRST, 0x07);
+ if (ret)
+ goto err_ret;
+
+ ret = write_short_reg(devrec, REG_PACON2, 0x98);
+ if (ret)
+ goto err_ret;
+
+ ret = write_short_reg(devrec, REG_TXSTBL, 0x95);
+ if (ret)
+ goto err_ret;
+
+ ret = write_long_reg(devrec, REG_RFCON0, 0x03);
+ if (ret)
+ goto err_ret;
+
+ ret = write_long_reg(devrec, REG_RFCON1, 0x01);
+ if (ret)
+ goto err_ret;
+
+ ret = write_long_reg(devrec, REG_RFCON2, 0x80);
+ if (ret)
+ goto err_ret;
+
+ ret = write_long_reg(devrec, REG_RFCON6, 0x90);
+ if (ret)
+ goto err_ret;
+
+ ret = write_long_reg(devrec, REG_RFCON7, 0x80);
+ if (ret)
+ goto err_ret;
+
+ ret = write_long_reg(devrec, REG_RFCON8, 0x10);
+ if (ret)
+ goto err_ret;
+
+ ret = write_long_reg(devrec, REG_SLPCON1, 0x21);
+ if (ret)
+ goto err_ret;
+
+ ret = write_short_reg(devrec, REG_BBREG2, 0x80);
+ if (ret)
+ goto err_ret;
+
+ ret = write_short_reg(devrec, REG_CCAEDTH, 0x60);
+ if (ret)
+ goto err_ret;
+
+ ret = write_short_reg(devrec, REG_BBREG6, 0x40);
+ if (ret)
+ goto err_ret;
+
+ ret = write_short_reg(devrec, REG_RFCTL, 0x04);
+ if (ret)
+ goto err_ret;
+
+ ret = write_short_reg(devrec, REG_RFCTL, 0x0);
+ if (ret)
+ goto err_ret;
+
+ udelay(192);
+
+ /* Set RX Mode. RXMCR<1:0>: 0x0 normal, 0x1 promisc, 0x2 error */
+ ret = read_short_reg(devrec, REG_RXMCR, &val);
+ if (ret)
+ goto err_ret;
+
+ val &= ~0x3; /* Clear RX mode (normal) */
+
+ ret = write_short_reg(devrec, REG_RXMCR, val);
+ if (ret)
+ goto err_ret;
+
+ return 0;
+
+err_ret:
+ return ret;
+}
+
static int mrf24j40_probe(struct spi_device *spi)
{
int ret = -ENOMEM;
@@ -650,31 +736,9 @@ static int mrf24j40_probe(struct spi_device *spi)
if (ret)
goto err_register_device;

- /* Initialize the device.
- From datasheet section 3.2: Initialization. */
- write_short_reg(devrec, REG_SOFTRST, 0x07);
- write_short_reg(devrec, REG_PACON2, 0x98);
- write_short_reg(devrec, REG_TXSTBL, 0x95);
- write_long_reg(devrec, REG_RFCON0, 0x03);
- write_long_reg(devrec, REG_RFCON1, 0x01);
- write_long_reg(devrec, REG_RFCON2, 0x80);
- write_long_reg(devrec, REG_RFCON6, 0x90);
- write_long_reg(devrec, REG_RFCON7, 0x80);
- write_long_reg(devrec, REG_RFCON8, 0x10);
- write_long_reg(devrec, REG_SLPCON1, 0x21);
- write_short_reg(devrec, REG_BBREG2, 0x80);
- write_short_reg(devrec, REG_CCAEDTH, 0x60);
- write_short_reg(devrec, REG_BBREG6, 0x40);
- write_short_reg(devrec, REG_RFCTL, 0x04);
- write_short_reg(devrec, REG_RFCTL, 0x0);
- udelay(192);
-
- /* Set RX Mode. RXMCR<1:0>: 0x0 normal, 0x1 promisc, 0x2 error */
- ret = read_short_reg(devrec, REG_RXMCR, &val);
+ ret = mrf24j40_hw_init(devrec);
if (ret)
- goto err_read_reg;
- val &= ~0x3; /* Clear RX mode (normal) */
- write_short_reg(devrec, REG_RXMCR, val);
+ return err_hw_init;

ret = devm_request_threaded_irq(&spi->dev,
spi->irq,
@@ -692,7 +756,7 @@ static int mrf24j40_probe(struct spi_device *spi)
return 0;

err_irq:
-err_read_reg:
+err_hw_init:
ieee802154_unregister_device(devrec->dev);
err_register_device:
ieee802154_free_device(devrec->dev);
--
1.7.9.5


2014-06-12 18:03:26

by David Miller

[permalink] [raw]
Subject: Re: [PATCH net-next] mrf24j40: separate h/w init and add checkings

From: Varka Bhadram <[email protected]>
Date: Thu, 12 Jun 2014 14:40:48 +0530

> separate the mrf24j40 hardware initialisation from probe()
> and adds the sanity checkings.
>
> These checkings are required if somebody hasn't a right spi configuration
> the probe function should fail. So we have to return from there.
>
> Signed-off-by: Varka Bhadram <[email protected]>

Applied, thanks.

2014-06-12 18:05:23

by David Miller

[permalink] [raw]
Subject: Re: [PATCH net-next] mrf24j40: separate h/w init and add checkings

From: David Miller <[email protected]>
Date: Thu, 12 Jun 2014 11:03:24 -0700 (PDT)

> From: Varka Bhadram <[email protected]>
> Date: Thu, 12 Jun 2014 14:40:48 +0530
>
>> separate the mrf24j40 hardware initialisation from probe()
>> and adds the sanity checkings.
>>
>> These checkings are required if somebody hasn't a right spi configuration
>> the probe function should fail. So we have to return from there.
>>
>> Signed-off-by: Varka Bhadram <[email protected]>
>
> Applied, thanks.

Reverted, did you even compile test this change?

drivers/net/ieee802154/mrf24j40.c: In function ?mrf24j40_probe?:
drivers/net/ieee802154/mrf24j40.c:741:10: error: ?err_hw_init? undeclared (first use in this function)
drivers/net/ieee802154/mrf24j40.c:741:10: note: each undeclared identifier is reported only once for each function it appears in
drivers/net/ieee802154/mrf24j40.c:759:1: warning: label ?err_hw_init? defined but not used [-Wunused-label]
drivers/net/ieee802154/mrf24j40.c:702:5: warning: unused variable ?val? [-Wunused-variable]
make[1]: *** [drivers/net/ieee802154/mrf24j40.o] Error 1
make: *** [drivers/net/ieee802154/mrf24j40.o] Error 2
????{.n?+???????+%?????ݶ??w??{.n?+????{??G?????{ay?ʇڙ?,j??f???h?????????z_??(?階?ݢj"???m??????G????????????&???~???iO???z??v?^?m???? ????????I?

2014-06-13 03:36:55

by Varka Bhadram

[permalink] [raw]
Subject: Re: [PATCH net-next] mrf24j40: separate h/w init and add checkings

Hi David,

Sorry for the noise. i will send the fixed patch.

Thanks.

-Varka Bhadram

On Thu, Jun 12, 2014 at 11:35 PM, David Miller <[email protected]> wrote:
> From: David Miller <[email protected]>
> Date: Thu, 12 Jun 2014 11:03:24 -0700 (PDT)
>
>> From: Varka Bhadram <[email protected]>
>> Date: Thu, 12 Jun 2014 14:40:48 +0530
>>
>>> separate the mrf24j40 hardware initialisation from probe()
>>> and adds the sanity checkings.
>>>
>>> These checkings are required if somebody hasn't a right spi configuration
>>> the probe function should fail. So we have to return from there.
>>>
>>> Signed-off-by: Varka Bhadram <[email protected]>
>>
>> Applied, thanks.
>
> Reverted, did you even compile test this change?
>
> drivers/net/ieee802154/mrf24j40.c: In function ‘mrf24j40_probe’:
> drivers/net/ieee802154/mrf24j40.c:741:10: error: ‘err_hw_init’ undeclared (first use in this function)
> drivers/net/ieee802154/mrf24j40.c:741:10: note: each undeclared identifier is reported only once for each function it appears in
> drivers/net/ieee802154/mrf24j40.c:759:1: warning: label ‘err_hw_init’ defined but not used [-Wunused-label]
> drivers/net/ieee802154/mrf24j40.c:702:5: warning: unused variable ‘val’ [-Wunused-variable]
> make[1]: *** [drivers/net/ieee802154/mrf24j40.o] Error 1
> make: *** [drivers/net/ieee802154/mrf24j40.o] Error 2