Re: [Tinyos-help] IRIS SPI lockup

2013-01-04 Thread Miklos Maroti
Hi Guys,

I have committed this SPI fix today (and did the same fix for the
atmega128rfa1 chip).

Best,
Miklos

On Thu, Dec 13, 2012 at 9:12 AM, Miklos Maroti mmar...@math.u-szeged.hu wrote:
 Ok, thanks! I really would like to know how it works in your situation
 before I commit to the mainline. Miklos

 On Wed, Dec 12, 2012 at 11:36 PM, Oldrine Lewis ole...@sutron.com wrote:


 Hi Miklos,

 A few other changes I had made to my program structure, seem to almost 
 eliminiate the possibility of hitting the SPI lock situation. I will have to 
 rerun the older version, of my software to replicate the previous situation 
 to test the fix. I have a release scheduled soon and will get to the test 
 the fix asap.

 Regards,
 Lewis



 -Original Message-
 From: mmar...@gmail.com [mailto:mmar...@gmail.com] On Behalf Of Miklos Maroti
 Sent: Monday, December 10, 2012 2:55 PM
 To: Oldrine Lewis
 Cc: Eric Decker; tinyos-help@millennium.berkeley.edu; Philip Levis; Janos 
 Sallai
 Subject: Re: [Tinyos-help] IRIS SPI lockup

 Hi Lewis,

 Did you have a chance to check if this fixes your race condition? Does
 the SPI work reliably now?

 Miklos

 On Thu, Dec 6, 2012 at 12:59 PM, Miklos Maroti mmar...@math.u-szeged.hu 
 wrote:
 Excellent. Thanks! Miklos

 On Thu, Dec 6, 2012 at 12:38 PM, Oldrine Lewis ole...@sutron.com wrote:
 Hi Miklos,
 Thanks for the updates. I just downloaded the new files. Will test and 
 keep you posted.
 Thanks,
 Lewis


 -Original Message-
 From: mmar...@gmail.com [mailto:mmar...@gmail.com] On Behalf Of Miklos 
 Maroti
 Sent: Wednesday, December 05, 2012 1:35 PM
 To: Eric Decker
 Cc: Oldrine Lewis; tinyos-help@millennium.berkeley.edu; Philip Levis; 
 Janos Sallai
 Subject: Re: [Tinyos-help] IRIS SPI lockup

 Dear Lewis,

 Thanks for finding this bug. Just to clarify, this happens ONLY if the
 Resource.immediateRequest is called from a task and then from an
 interrupt AND they use the SAME client id. Otherwise, the second call
 will return with fail, no? We have discussed this with Janos Sallai,
 and he says that the best option would be to initialize the SPI with
 the ResourceConfigure interface as Eric has also suggested.

 I have put together a patch that fixes this (includes some typo fixes
 in tep108):

 https://github.com/mmaroti/tinyos/commit/a45de584bd79c0be2853d011c129dc4cb4b6976c

 Lewis, can you please try this out if this works for you? (It actually
 reduces the code too)

 Best,
 Miklos

 On Sat, Dec 1, 2012 at 2:28 PM, Eric Decker cire...@gmail.com wrote:


 On Fri, Nov 30, 2012 at 11:13 PM, Oldrine Lewis ole...@sutron.com wrote:

 Atm128SpiP.nc seems to  make separate calls ( sequentially) to the
 ResourceArbiter and calls for  initializing the SPI.

 In case of Resource.request (), startSpi() is called before the call to
 ResourceArbiter.request(), This ensures that the SPI will always be
 initialized before Resource.granted()  is signaled.


 The problem with Atm128P is it doesn't use the configurator call out from
 the Arbiter.   The whole point behind the configurator call out is to 
 avoid
 this timing window when h/w is configured.

 The reason that the Atm128P use of request/granted works is because it
 cheats.   It looks to see if someother entity is using the device and if 
 not
 it starts the SPI.Then it calls ResourceArbiter.request.   Which means
 that it is touching the resource without really owning it.   Not exactly
 proper.

 Request/Granted should also use the configuration interface.   That is why
 it is there.   It lets the Arbiter configure the hardware properly 
 according
 to what the driver wants prior to switching the resource state to other 
 than
 RES_CONTROLLED which let's interrupts in.



 Incase of Resource.immediateRequest(), the resource is first locked and
 only if the lock succeeds, is the SPI initialized. This sometime leads 
 to an
 uninitialized SPI being used


 Thinking about this as locking the resource is kind of sideways.  It isn't
 like we are asking for a semaphore protecting the device and then if we 
 get
 proceeding.   Rather immediateRequest is responsible for checking to see 
 if
 the device (Resource) and be assigned and if so it will call the
 configurator that should be wired in.   If the device isn't available the
 configurator isn't called and immediateResource return FAIL.


 Agreed.   That is because Atm128SpiP does the startSPI after the return 
 from
 the ArbriterResource.immediateRequest.   That's broken and is what is
 causing your problem.

 ArbiterResource.immediateRequest (in tos/system/ArbiterP.nc) does a 
 callout
 to ResourceConfigure.configure.  This is done prior to setting the state 
 to
 other than RES_CONTROLLED.  It is the switch to other than RES_CONTROLLED
 that lets interrupts get to the device driver.

 Atm128SpiP when making use of immediateRequest, should also have wired in 
 a
 ResourceConfigure wiring which should contain the spiStart.

 In all cases, either after a granted or on return

Re: [Tinyos-help] IRIS SPI lockup

2012-12-13 Thread Miklos Maroti
Ok, thanks! I really would like to know how it works in your situation
before I commit to the mainline. Miklos

On Wed, Dec 12, 2012 at 11:36 PM, Oldrine Lewis ole...@sutron.com wrote:


 Hi Miklos,

 A few other changes I had made to my program structure, seem to almost 
 eliminiate the possibility of hitting the SPI lock situation. I will have to 
 rerun the older version, of my software to replicate the previous situation 
 to test the fix. I have a release scheduled soon and will get to the test the 
 fix asap.

 Regards,
 Lewis



 -Original Message-
 From: mmar...@gmail.com [mailto:mmar...@gmail.com] On Behalf Of Miklos Maroti
 Sent: Monday, December 10, 2012 2:55 PM
 To: Oldrine Lewis
 Cc: Eric Decker; tinyos-help@millennium.berkeley.edu; Philip Levis; Janos 
 Sallai
 Subject: Re: [Tinyos-help] IRIS SPI lockup

 Hi Lewis,

 Did you have a chance to check if this fixes your race condition? Does
 the SPI work reliably now?

 Miklos

 On Thu, Dec 6, 2012 at 12:59 PM, Miklos Maroti mmar...@math.u-szeged.hu 
 wrote:
 Excellent. Thanks! Miklos

 On Thu, Dec 6, 2012 at 12:38 PM, Oldrine Lewis ole...@sutron.com wrote:
 Hi Miklos,
 Thanks for the updates. I just downloaded the new files. Will test and keep 
 you posted.
 Thanks,
 Lewis


 -Original Message-
 From: mmar...@gmail.com [mailto:mmar...@gmail.com] On Behalf Of Miklos 
 Maroti
 Sent: Wednesday, December 05, 2012 1:35 PM
 To: Eric Decker
 Cc: Oldrine Lewis; tinyos-help@millennium.berkeley.edu; Philip Levis; Janos 
 Sallai
 Subject: Re: [Tinyos-help] IRIS SPI lockup

 Dear Lewis,

 Thanks for finding this bug. Just to clarify, this happens ONLY if the
 Resource.immediateRequest is called from a task and then from an
 interrupt AND they use the SAME client id. Otherwise, the second call
 will return with fail, no? We have discussed this with Janos Sallai,
 and he says that the best option would be to initialize the SPI with
 the ResourceConfigure interface as Eric has also suggested.

 I have put together a patch that fixes this (includes some typo fixes
 in tep108):

 https://github.com/mmaroti/tinyos/commit/a45de584bd79c0be2853d011c129dc4cb4b6976c

 Lewis, can you please try this out if this works for you? (It actually
 reduces the code too)

 Best,
 Miklos

 On Sat, Dec 1, 2012 at 2:28 PM, Eric Decker cire...@gmail.com wrote:


 On Fri, Nov 30, 2012 at 11:13 PM, Oldrine Lewis ole...@sutron.com wrote:

 Atm128SpiP.nc seems to  make separate calls ( sequentially) to the
 ResourceArbiter and calls for  initializing the SPI.

 In case of Resource.request (), startSpi() is called before the call to
 ResourceArbiter.request(), This ensures that the SPI will always be
 initialized before Resource.granted()  is signaled.


 The problem with Atm128P is it doesn't use the configurator call out from
 the Arbiter.   The whole point behind the configurator call out is to avoid
 this timing window when h/w is configured.

 The reason that the Atm128P use of request/granted works is because it
 cheats.   It looks to see if someother entity is using the device and if 
 not
 it starts the SPI.Then it calls ResourceArbiter.request.   Which means
 that it is touching the resource without really owning it.   Not exactly
 proper.

 Request/Granted should also use the configuration interface.   That is why
 it is there.   It lets the Arbiter configure the hardware properly 
 according
 to what the driver wants prior to switching the resource state to other 
 than
 RES_CONTROLLED which let's interrupts in.



 Incase of Resource.immediateRequest(), the resource is first locked and
 only if the lock succeeds, is the SPI initialized. This sometime leads to 
 an
 uninitialized SPI being used


 Thinking about this as locking the resource is kind of sideways.  It isn't
 like we are asking for a semaphore protecting the device and then if we get
 proceeding.   Rather immediateRequest is responsible for checking to see if
 the device (Resource) and be assigned and if so it will call the
 configurator that should be wired in.   If the device isn't available the
 configurator isn't called and immediateResource return FAIL.


 Agreed.   That is because Atm128SpiP does the startSPI after the return 
 from
 the ArbriterResource.immediateRequest.   That's broken and is what is
 causing your problem.

 ArbiterResource.immediateRequest (in tos/system/ArbiterP.nc) does a callout
 to ResourceConfigure.configure.  This is done prior to setting the state to
 other than RES_CONTROLLED.  It is the switch to other than RES_CONTROLLED
 that lets interrupts get to the device driver.

 Atm128SpiP when making use of immediateRequest, should also have wired in a
 ResourceConfigure wiring which should contain the spiStart.

 In all cases, either after a granted or on return from immediateRequest,
 interrupt should be handled correctly.  It is assumed that the driver is
 prepared.   In the case of Atm128SpiP that isn't the case because it hasn't
 wired in the correct

Re: [Tinyos-help] IRIS SPI lockup

2012-12-12 Thread Oldrine Lewis


Hi Miklos,

A few other changes I had made to my program structure, seem to almost 
eliminiate the possibility of hitting the SPI lock situation. I will have to 
rerun the older version, of my software to replicate the previous situation to 
test the fix. I have a release scheduled soon and will get to the test the fix 
asap. 

Regards,
Lewis



-Original Message-
From: mmar...@gmail.com [mailto:mmar...@gmail.com] On Behalf Of Miklos Maroti
Sent: Monday, December 10, 2012 2:55 PM
To: Oldrine Lewis
Cc: Eric Decker; tinyos-help@millennium.berkeley.edu; Philip Levis; Janos Sallai
Subject: Re: [Tinyos-help] IRIS SPI lockup

Hi Lewis,

Did you have a chance to check if this fixes your race condition? Does
the SPI work reliably now?

Miklos

On Thu, Dec 6, 2012 at 12:59 PM, Miklos Maroti mmar...@math.u-szeged.hu wrote:
 Excellent. Thanks! Miklos

 On Thu, Dec 6, 2012 at 12:38 PM, Oldrine Lewis ole...@sutron.com wrote:
 Hi Miklos,
 Thanks for the updates. I just downloaded the new files. Will test and keep 
 you posted.
 Thanks,
 Lewis


 -Original Message-
 From: mmar...@gmail.com [mailto:mmar...@gmail.com] On Behalf Of Miklos Maroti
 Sent: Wednesday, December 05, 2012 1:35 PM
 To: Eric Decker
 Cc: Oldrine Lewis; tinyos-help@millennium.berkeley.edu; Philip Levis; Janos 
 Sallai
 Subject: Re: [Tinyos-help] IRIS SPI lockup

 Dear Lewis,

 Thanks for finding this bug. Just to clarify, this happens ONLY if the
 Resource.immediateRequest is called from a task and then from an
 interrupt AND they use the SAME client id. Otherwise, the second call
 will return with fail, no? We have discussed this with Janos Sallai,
 and he says that the best option would be to initialize the SPI with
 the ResourceConfigure interface as Eric has also suggested.

 I have put together a patch that fixes this (includes some typo fixes
 in tep108):

 https://github.com/mmaroti/tinyos/commit/a45de584bd79c0be2853d011c129dc4cb4b6976c

 Lewis, can you please try this out if this works for you? (It actually
 reduces the code too)

 Best,
 Miklos

 On Sat, Dec 1, 2012 at 2:28 PM, Eric Decker cire...@gmail.com wrote:


 On Fri, Nov 30, 2012 at 11:13 PM, Oldrine Lewis ole...@sutron.com wrote:

 Atm128SpiP.nc seems to  make separate calls ( sequentially) to the
 ResourceArbiter and calls for  initializing the SPI.

 In case of Resource.request (), startSpi() is called before the call to
 ResourceArbiter.request(), This ensures that the SPI will always be
 initialized before Resource.granted()  is signaled.


 The problem with Atm128P is it doesn't use the configurator call out from
 the Arbiter.   The whole point behind the configurator call out is to avoid
 this timing window when h/w is configured.

 The reason that the Atm128P use of request/granted works is because it
 cheats.   It looks to see if someother entity is using the device and if not
 it starts the SPI.Then it calls ResourceArbiter.request.   Which means
 that it is touching the resource without really owning it.   Not exactly
 proper.

 Request/Granted should also use the configuration interface.   That is why
 it is there.   It lets the Arbiter configure the hardware properly according
 to what the driver wants prior to switching the resource state to other than
 RES_CONTROLLED which let's interrupts in.



 Incase of Resource.immediateRequest(), the resource is first locked and
 only if the lock succeeds, is the SPI initialized. This sometime leads to 
 an
 uninitialized SPI being used


 Thinking about this as locking the resource is kind of sideways.  It isn't
 like we are asking for a semaphore protecting the device and then if we get
 proceeding.   Rather immediateRequest is responsible for checking to see if
 the device (Resource) and be assigned and if so it will call the
 configurator that should be wired in.   If the device isn't available the
 configurator isn't called and immediateResource return FAIL.


 Agreed.   That is because Atm128SpiP does the startSPI after the return from
 the ArbriterResource.immediateRequest.   That's broken and is what is
 causing your problem.

 ArbiterResource.immediateRequest (in tos/system/ArbiterP.nc) does a callout
 to ResourceConfigure.configure.  This is done prior to setting the state to
 other than RES_CONTROLLED.  It is the switch to other than RES_CONTROLLED
 that lets interrupts get to the device driver.

 Atm128SpiP when making use of immediateRequest, should also have wired in a
 ResourceConfigure wiring which should contain the spiStart.

 In all cases, either after a granted or on return from immediateRequest,
 interrupt should be handled correctly.  It is assumed that the driver is
 prepared.   In the case of Atm128SpiP that isn't the case because it hasn't
 wired in the correct configurator.   Calling startSpi after the call to
 immediateRequest introduces a timing window and as you found out you are
 catching it.


 My C$0.02

 eric




 From: Eric Decker [mailto:cire...@gmail.com]
 Sent: Friday

Re: [Tinyos-help] IRIS SPI lockup

2012-12-10 Thread Miklos Maroti
Hi Lewis,

Did you have a chance to check if this fixes your race condition? Does
the SPI work reliably now?

Miklos

On Thu, Dec 6, 2012 at 12:59 PM, Miklos Maroti mmar...@math.u-szeged.hu wrote:
 Excellent. Thanks! Miklos

 On Thu, Dec 6, 2012 at 12:38 PM, Oldrine Lewis ole...@sutron.com wrote:
 Hi Miklos,
 Thanks for the updates. I just downloaded the new files. Will test and keep 
 you posted.
 Thanks,
 Lewis


 -Original Message-
 From: mmar...@gmail.com [mailto:mmar...@gmail.com] On Behalf Of Miklos Maroti
 Sent: Wednesday, December 05, 2012 1:35 PM
 To: Eric Decker
 Cc: Oldrine Lewis; tinyos-help@millennium.berkeley.edu; Philip Levis; Janos 
 Sallai
 Subject: Re: [Tinyos-help] IRIS SPI lockup

 Dear Lewis,

 Thanks for finding this bug. Just to clarify, this happens ONLY if the
 Resource.immediateRequest is called from a task and then from an
 interrupt AND they use the SAME client id. Otherwise, the second call
 will return with fail, no? We have discussed this with Janos Sallai,
 and he says that the best option would be to initialize the SPI with
 the ResourceConfigure interface as Eric has also suggested.

 I have put together a patch that fixes this (includes some typo fixes
 in tep108):

 https://github.com/mmaroti/tinyos/commit/a45de584bd79c0be2853d011c129dc4cb4b6976c

 Lewis, can you please try this out if this works for you? (It actually
 reduces the code too)

 Best,
 Miklos

 On Sat, Dec 1, 2012 at 2:28 PM, Eric Decker cire...@gmail.com wrote:


 On Fri, Nov 30, 2012 at 11:13 PM, Oldrine Lewis ole...@sutron.com wrote:

 Atm128SpiP.nc seems to  make separate calls ( sequentially) to the
 ResourceArbiter and calls for  initializing the SPI.

 In case of Resource.request (), startSpi() is called before the call to
 ResourceArbiter.request(), This ensures that the SPI will always be
 initialized before Resource.granted()  is signaled.


 The problem with Atm128P is it doesn't use the configurator call out from
 the Arbiter.   The whole point behind the configurator call out is to avoid
 this timing window when h/w is configured.

 The reason that the Atm128P use of request/granted works is because it
 cheats.   It looks to see if someother entity is using the device and if not
 it starts the SPI.Then it calls ResourceArbiter.request.   Which means
 that it is touching the resource without really owning it.   Not exactly
 proper.

 Request/Granted should also use the configuration interface.   That is why
 it is there.   It lets the Arbiter configure the hardware properly according
 to what the driver wants prior to switching the resource state to other than
 RES_CONTROLLED which let's interrupts in.



 Incase of Resource.immediateRequest(), the resource is first locked and
 only if the lock succeeds, is the SPI initialized. This sometime leads to 
 an
 uninitialized SPI being used


 Thinking about this as locking the resource is kind of sideways.  It isn't
 like we are asking for a semaphore protecting the device and then if we get
 proceeding.   Rather immediateRequest is responsible for checking to see if
 the device (Resource) and be assigned and if so it will call the
 configurator that should be wired in.   If the device isn't available the
 configurator isn't called and immediateResource return FAIL.


 Agreed.   That is because Atm128SpiP does the startSPI after the return from
 the ArbriterResource.immediateRequest.   That's broken and is what is
 causing your problem.

 ArbiterResource.immediateRequest (in tos/system/ArbiterP.nc) does a callout
 to ResourceConfigure.configure.  This is done prior to setting the state to
 other than RES_CONTROLLED.  It is the switch to other than RES_CONTROLLED
 that lets interrupts get to the device driver.

 Atm128SpiP when making use of immediateRequest, should also have wired in a
 ResourceConfigure wiring which should contain the spiStart.

 In all cases, either after a granted or on return from immediateRequest,
 interrupt should be handled correctly.  It is assumed that the driver is
 prepared.   In the case of Atm128SpiP that isn't the case because it hasn't
 wired in the correct configurator.   Calling startSpi after the call to
 immediateRequest introduces a timing window and as you found out you are
 catching it.


 My C$0.02

 eric




 From: Eric Decker [mailto:cire...@gmail.com]
 Sent: Friday, November 30, 2012 11:38 PM
 To: Oldrine Lewis
 Cc: tinyos-help@millennium.berkeley.edu
 Subject: Re: [Tinyos-help] IRIS SPI lockup





 I thought the ResourceArbiter.immediateRequest symantic was that the
 resource in question should be fully initilized following return from the
 call.   This should follow the same symantic as a ResourceArbiter.Request
 and Granted.   Prior to interrupts being allowed and the Granted being
 signalled the resource is set up.   To be consistent,
 ResourceArbiter.immediateRequest should follow the same symantic.





 If that premise is true.   I would assert that the Atm128SpiP
 implementation has

Re: [Tinyos-help] IRIS SPI lockup

2012-12-06 Thread Oldrine Lewis
Hi Miklos,
Thanks for the updates. I just downloaded the new files. Will test and keep you 
posted.
Thanks,
Lewis


-Original Message-
From: mmar...@gmail.com [mailto:mmar...@gmail.com] On Behalf Of Miklos Maroti
Sent: Wednesday, December 05, 2012 1:35 PM
To: Eric Decker
Cc: Oldrine Lewis; tinyos-help@millennium.berkeley.edu; Philip Levis; Janos 
Sallai
Subject: Re: [Tinyos-help] IRIS SPI lockup

Dear Lewis,

Thanks for finding this bug. Just to clarify, this happens ONLY if the
Resource.immediateRequest is called from a task and then from an
interrupt AND they use the SAME client id. Otherwise, the second call
will return with fail, no? We have discussed this with Janos Sallai,
and he says that the best option would be to initialize the SPI with
the ResourceConfigure interface as Eric has also suggested.

I have put together a patch that fixes this (includes some typo fixes
in tep108):

https://github.com/mmaroti/tinyos/commit/a45de584bd79c0be2853d011c129dc4cb4b6976c

Lewis, can you please try this out if this works for you? (It actually
reduces the code too)

Best,
Miklos

On Sat, Dec 1, 2012 at 2:28 PM, Eric Decker cire...@gmail.com wrote:


 On Fri, Nov 30, 2012 at 11:13 PM, Oldrine Lewis ole...@sutron.com wrote:

 Atm128SpiP.nc seems to  make separate calls ( sequentially) to the
 ResourceArbiter and calls for  initializing the SPI.

 In case of Resource.request (), startSpi() is called before the call to
 ResourceArbiter.request(), This ensures that the SPI will always be
 initialized before Resource.granted()  is signaled.


 The problem with Atm128P is it doesn't use the configurator call out from
 the Arbiter.   The whole point behind the configurator call out is to avoid
 this timing window when h/w is configured.

 The reason that the Atm128P use of request/granted works is because it
 cheats.   It looks to see if someother entity is using the device and if not
 it starts the SPI.Then it calls ResourceArbiter.request.   Which means
 that it is touching the resource without really owning it.   Not exactly
 proper.

 Request/Granted should also use the configuration interface.   That is why
 it is there.   It lets the Arbiter configure the hardware properly according
 to what the driver wants prior to switching the resource state to other than
 RES_CONTROLLED which let's interrupts in.



 Incase of Resource.immediateRequest(), the resource is first locked and
 only if the lock succeeds, is the SPI initialized. This sometime leads to an
 uninitialized SPI being used


 Thinking about this as locking the resource is kind of sideways.  It isn't
 like we are asking for a semaphore protecting the device and then if we get
 proceeding.   Rather immediateRequest is responsible for checking to see if
 the device (Resource) and be assigned and if so it will call the
 configurator that should be wired in.   If the device isn't available the
 configurator isn't called and immediateResource return FAIL.


 Agreed.   That is because Atm128SpiP does the startSPI after the return from
 the ArbriterResource.immediateRequest.   That's broken and is what is
 causing your problem.

 ArbiterResource.immediateRequest (in tos/system/ArbiterP.nc) does a callout
 to ResourceConfigure.configure.  This is done prior to setting the state to
 other than RES_CONTROLLED.  It is the switch to other than RES_CONTROLLED
 that lets interrupts get to the device driver.

 Atm128SpiP when making use of immediateRequest, should also have wired in a
 ResourceConfigure wiring which should contain the spiStart.

 In all cases, either after a granted or on return from immediateRequest,
 interrupt should be handled correctly.  It is assumed that the driver is
 prepared.   In the case of Atm128SpiP that isn't the case because it hasn't
 wired in the correct configurator.   Calling startSpi after the call to
 immediateRequest introduces a timing window and as you found out you are
 catching it.


 My C$0.02

 eric




 From: Eric Decker [mailto:cire...@gmail.com]
 Sent: Friday, November 30, 2012 11:38 PM
 To: Oldrine Lewis
 Cc: tinyos-help@millennium.berkeley.edu
 Subject: Re: [Tinyos-help] IRIS SPI lockup





 I thought the ResourceArbiter.immediateRequest symantic was that the
 resource in question should be fully initilized following return from the
 call.   This should follow the same symantic as a ResourceArbiter.Request
 and Granted.   Prior to interrupts being allowed and the Granted being
 signalled the resource is set up.   To be consistent,
 ResourceArbiter.immediateRequest should follow the same symantic.





 If that premise is true.   I would assert that the Atm128SpiP
 implementation has a bug and should get fixed.



 That would mean that the following as submitted is a work around and not
 an actual fix.





 thoughts?

 On Fri, Nov 30, 2012 at 12:58 PM, Oldrine Lewis ole...@sutron.com wrote:

 Recently, I have been experiencing frequent lockups with the IRIS nodes. I
 discovered that the lockup occurred

Re: [Tinyos-help] IRIS SPI lockup

2012-12-06 Thread Miklos Maroti
Excellent. Thanks! Miklos

On Thu, Dec 6, 2012 at 12:38 PM, Oldrine Lewis ole...@sutron.com wrote:
 Hi Miklos,
 Thanks for the updates. I just downloaded the new files. Will test and keep 
 you posted.
 Thanks,
 Lewis


 -Original Message-
 From: mmar...@gmail.com [mailto:mmar...@gmail.com] On Behalf Of Miklos Maroti
 Sent: Wednesday, December 05, 2012 1:35 PM
 To: Eric Decker
 Cc: Oldrine Lewis; tinyos-help@millennium.berkeley.edu; Philip Levis; Janos 
 Sallai
 Subject: Re: [Tinyos-help] IRIS SPI lockup

 Dear Lewis,

 Thanks for finding this bug. Just to clarify, this happens ONLY if the
 Resource.immediateRequest is called from a task and then from an
 interrupt AND they use the SAME client id. Otherwise, the second call
 will return with fail, no? We have discussed this with Janos Sallai,
 and he says that the best option would be to initialize the SPI with
 the ResourceConfigure interface as Eric has also suggested.

 I have put together a patch that fixes this (includes some typo fixes
 in tep108):

 https://github.com/mmaroti/tinyos/commit/a45de584bd79c0be2853d011c129dc4cb4b6976c

 Lewis, can you please try this out if this works for you? (It actually
 reduces the code too)

 Best,
 Miklos

 On Sat, Dec 1, 2012 at 2:28 PM, Eric Decker cire...@gmail.com wrote:


 On Fri, Nov 30, 2012 at 11:13 PM, Oldrine Lewis ole...@sutron.com wrote:

 Atm128SpiP.nc seems to  make separate calls ( sequentially) to the
 ResourceArbiter and calls for  initializing the SPI.

 In case of Resource.request (), startSpi() is called before the call to
 ResourceArbiter.request(), This ensures that the SPI will always be
 initialized before Resource.granted()  is signaled.


 The problem with Atm128P is it doesn't use the configurator call out from
 the Arbiter.   The whole point behind the configurator call out is to avoid
 this timing window when h/w is configured.

 The reason that the Atm128P use of request/granted works is because it
 cheats.   It looks to see if someother entity is using the device and if not
 it starts the SPI.Then it calls ResourceArbiter.request.   Which means
 that it is touching the resource without really owning it.   Not exactly
 proper.

 Request/Granted should also use the configuration interface.   That is why
 it is there.   It lets the Arbiter configure the hardware properly according
 to what the driver wants prior to switching the resource state to other than
 RES_CONTROLLED which let's interrupts in.



 Incase of Resource.immediateRequest(), the resource is first locked and
 only if the lock succeeds, is the SPI initialized. This sometime leads to an
 uninitialized SPI being used


 Thinking about this as locking the resource is kind of sideways.  It isn't
 like we are asking for a semaphore protecting the device and then if we get
 proceeding.   Rather immediateRequest is responsible for checking to see if
 the device (Resource) and be assigned and if so it will call the
 configurator that should be wired in.   If the device isn't available the
 configurator isn't called and immediateResource return FAIL.


 Agreed.   That is because Atm128SpiP does the startSPI after the return from
 the ArbriterResource.immediateRequest.   That's broken and is what is
 causing your problem.

 ArbiterResource.immediateRequest (in tos/system/ArbiterP.nc) does a callout
 to ResourceConfigure.configure.  This is done prior to setting the state to
 other than RES_CONTROLLED.  It is the switch to other than RES_CONTROLLED
 that lets interrupts get to the device driver.

 Atm128SpiP when making use of immediateRequest, should also have wired in a
 ResourceConfigure wiring which should contain the spiStart.

 In all cases, either after a granted or on return from immediateRequest,
 interrupt should be handled correctly.  It is assumed that the driver is
 prepared.   In the case of Atm128SpiP that isn't the case because it hasn't
 wired in the correct configurator.   Calling startSpi after the call to
 immediateRequest introduces a timing window and as you found out you are
 catching it.


 My C$0.02

 eric




 From: Eric Decker [mailto:cire...@gmail.com]
 Sent: Friday, November 30, 2012 11:38 PM
 To: Oldrine Lewis
 Cc: tinyos-help@millennium.berkeley.edu
 Subject: Re: [Tinyos-help] IRIS SPI lockup





 I thought the ResourceArbiter.immediateRequest symantic was that the
 resource in question should be fully initilized following return from the
 call.   This should follow the same symantic as a ResourceArbiter.Request
 and Granted.   Prior to interrupts being allowed and the Granted being
 signalled the resource is set up.   To be consistent,
 ResourceArbiter.immediateRequest should follow the same symantic.





 If that premise is true.   I would assert that the Atm128SpiP
 implementation has a bug and should get fixed.



 That would mean that the following as submitted is a work around and not
 an actual fix.





 thoughts?

 On Fri, Nov 30, 2012 at 12:58 PM, Oldrine Lewis ole...@sutron.com

Re: [Tinyos-help] IRIS SPI lockup

2012-12-05 Thread Miklos Maroti
Dear Lewis,

Thanks for finding this bug. Just to clarify, this happens ONLY if the
Resource.immediateRequest is called from a task and then from an
interrupt AND they use the SAME client id. Otherwise, the second call
will return with fail, no? We have discussed this with Janos Sallai,
and he says that the best option would be to initialize the SPI with
the ResourceConfigure interface as Eric has also suggested.

I have put together a patch that fixes this (includes some typo fixes
in tep108):

https://github.com/mmaroti/tinyos/commit/a45de584bd79c0be2853d011c129dc4cb4b6976c

Lewis, can you please try this out if this works for you? (It actually
reduces the code too)

Best,
Miklos

On Sat, Dec 1, 2012 at 2:28 PM, Eric Decker cire...@gmail.com wrote:


 On Fri, Nov 30, 2012 at 11:13 PM, Oldrine Lewis ole...@sutron.com wrote:

 Atm128SpiP.nc seems to  make separate calls ( sequentially) to the
 ResourceArbiter and calls for  initializing the SPI.

 In case of Resource.request (), startSpi() is called before the call to
 ResourceArbiter.request(), This ensures that the SPI will always be
 initialized before Resource.granted()  is signaled.


 The problem with Atm128P is it doesn't use the configurator call out from
 the Arbiter.   The whole point behind the configurator call out is to avoid
 this timing window when h/w is configured.

 The reason that the Atm128P use of request/granted works is because it
 cheats.   It looks to see if someother entity is using the device and if not
 it starts the SPI.Then it calls ResourceArbiter.request.   Which means
 that it is touching the resource without really owning it.   Not exactly
 proper.

 Request/Granted should also use the configuration interface.   That is why
 it is there.   It lets the Arbiter configure the hardware properly according
 to what the driver wants prior to switching the resource state to other than
 RES_CONTROLLED which let's interrupts in.



 Incase of Resource.immediateRequest(), the resource is first locked and
 only if the lock succeeds, is the SPI initialized. This sometime leads to an
 uninitialized SPI being used


 Thinking about this as locking the resource is kind of sideways.  It isn't
 like we are asking for a semaphore protecting the device and then if we get
 proceeding.   Rather immediateRequest is responsible for checking to see if
 the device (Resource) and be assigned and if so it will call the
 configurator that should be wired in.   If the device isn't available the
 configurator isn't called and immediateResource return FAIL.


 Agreed.   That is because Atm128SpiP does the startSPI after the return from
 the ArbriterResource.immediateRequest.   That's broken and is what is
 causing your problem.

 ArbiterResource.immediateRequest (in tos/system/ArbiterP.nc) does a callout
 to ResourceConfigure.configure.  This is done prior to setting the state to
 other than RES_CONTROLLED.  It is the switch to other than RES_CONTROLLED
 that lets interrupts get to the device driver.

 Atm128SpiP when making use of immediateRequest, should also have wired in a
 ResourceConfigure wiring which should contain the spiStart.

 In all cases, either after a granted or on return from immediateRequest,
 interrupt should be handled correctly.  It is assumed that the driver is
 prepared.   In the case of Atm128SpiP that isn't the case because it hasn't
 wired in the correct configurator.   Calling startSpi after the call to
 immediateRequest introduces a timing window and as you found out you are
 catching it.


 My C$0.02

 eric




 From: Eric Decker [mailto:cire...@gmail.com]
 Sent: Friday, November 30, 2012 11:38 PM
 To: Oldrine Lewis
 Cc: tinyos-help@millennium.berkeley.edu
 Subject: Re: [Tinyos-help] IRIS SPI lockup





 I thought the ResourceArbiter.immediateRequest symantic was that the
 resource in question should be fully initilized following return from the
 call.   This should follow the same symantic as a ResourceArbiter.Request
 and Granted.   Prior to interrupts being allowed and the Granted being
 signalled the resource is set up.   To be consistent,
 ResourceArbiter.immediateRequest should follow the same symantic.





 If that premise is true.   I would assert that the Atm128SpiP
 implementation has a bug and should get fixed.



 That would mean that the following as submitted is a work around and not
 an actual fix.





 thoughts?

 On Fri, Nov 30, 2012 at 12:58 PM, Oldrine Lewis ole...@sutron.com wrote:

 Recently, I have been experiencing frequent lockups with the IRIS nodes. I
 discovered that the lockup occurred in Atm128SpiP.nc, looping infinitely on
 while ( !( SPSR  0x80 ) );



 This bug, manifests if a task calls Resource.immediateRequest(), and an
 interrupt occurs after the task calls ResourceArbiter.immediateRequest[ id
 ]() , but before  calling startSpi(). At this moment, the task already has
 the handle for the resource and hence the ISR can also access the resource.

 If the interrupt tries to use the SPI

Re: [Tinyos-help] IRIS SPI lockup

2012-12-01 Thread Eric Decker
On Fri, Nov 30, 2012 at 11:13 PM, Oldrine Lewis ole...@sutron.com wrote:

 Atm128SpiP.nc seems to  make separate calls ( sequentially) to the
 ResourceArbiter and calls for  initializing the SPI.

 In case of Resource.request (), startSpi() is called before the call to
 ResourceArbiter.request(), This ensures that the SPI will always be
 initialized before* Resource.granted() * is signaled.


The problem with Atm128P is it doesn't use the configurator call out from
the Arbiter.   The whole point behind the configurator call out is to avoid
this timing window when h/w is configured.

The reason that the Atm128P use of request/granted works is because it
cheats.   It looks to see if someother entity is using the device and if
not it starts the SPI.Then it calls ResourceArbiter.request.   Which
means that it is touching the resource without really owning it.   Not
exactly proper.

Request/Granted should also use the configuration interface.   That is why
it is there.   It lets the Arbiter configure the hardware properly
according to what the driver wants prior to switching the resource state to
other than RES_CONTROLLED which let's interrupts in.





 Incase of Resource.immediateRequest(), the resource is first locked and
 only if the lock succeeds, is the SPI initialized. This sometime leads to
 an uninitialized SPI being used


Thinking about this as locking the resource is kind of sideways.  It isn't
like we are asking for a semaphore protecting the device and then if we get
proceeding.   Rather immediateRequest is responsible for checking to see if
the device (Resource) and be assigned and if so it will call the
configurator that should be wired in.   If the device isn't available the
configurator isn't called and immediateResource return FAIL.


Agreed.   That is because Atm128SpiP does the startSPI after the return
from the ArbriterResource.immediateRequest.   That's broken and is what is
causing your problem.

ArbiterResource.immediateRequest (in tos/system/ArbiterP.nc) does a callout
to ResourceConfigure.configure.  This is done prior to setting the state to
other than RES_CONTROLLED.  It is the switch to other than RES_CONTROLLED
that lets interrupts get to the device driver.

Atm128SpiP when making use of immediateRequest, should also have wired in a
ResourceConfigure wiring which should contain the spiStart.

In all cases, either after a granted or on return from immediateRequest,
interrupt should be handled correctly.  It is assumed that the driver is
prepared.   In the case of Atm128SpiP that isn't the case because it hasn't
wired in the correct configurator.   Calling startSpi after the call to
immediateRequest introduces a timing window and as you found out you are
catching it.


My C$0.02

eric




 ** **

 *From:* Eric Decker [mailto:cire...@gmail.com]
 *Sent:* Friday, November 30, 2012 11:38 PM
 *To:* Oldrine Lewis
 *Cc:* tinyos-help@millennium.berkeley.edu
 *Subject:* Re: [Tinyos-help] IRIS SPI lockup

 ** **

 ** **

 I thought the ResourceArbiter.immediateRequest symantic was that the
 resource in question should be fully initilized following return from the
 call.   This should follow the same symantic as a ResourceArbiter.Request
 and Granted.   Prior to interrupts being allowed and the Granted being
 signalled the resource is set up.   To be consistent,
 ResourceArbiter.immediateRequest should follow the same symantic.

 ** **

 ** **

 If that premise is true.   I would assert that the Atm128SpiP
 implementation has a bug and should get fixed.

 ** **

 That would mean that the following as submitted is a work around and not
 an actual fix.

 ** **

 ** **

 thoughts?

 On Fri, Nov 30, 2012 at 12:58 PM, Oldrine Lewis ole...@sutron.com wrote:
 

 Recently, I have been experiencing frequent lockups with the IRIS nodes. I
 discovered that the lockup occurred in Atm128SpiP.nc, looping infinitely
 onwhile ( !( SPSR  0x80 ) );

  

 This bug, manifests if a task calls Resource.immediateRequest(), and an
 interrupt occurs after the task calls ResourceArbiter.immediateRequest[ id
 ]() , but before  calling startSpi(). At this moment, the task already has
 the handle for the resource and hence the ISR can also access the resource.
 

 If the interrupt tries to use the SPI, since it has locked the resource it
 will go ahead and use the SPI, causing a lockup

 I recommend encapsulating the call to immediateRequest and start SPI in a
 critical section. I have commented my observations below 

  

 async command error_t Resource.immediateRequest[ uint8_t id ]() 

  {

atomic 

{

error_t result = call ResourceArbiter.immediateRequest[ id
 ]();

//what if i get an interrupt here and the interrupt
 wants to use the SPI

//the resource is already allocated so it will return
 TRUE. But the spi might be turned off

Re: [Tinyos-help] IRIS SPI lockup

2012-11-30 Thread Janos Sallai
Oldrine,

Thanks for tracking it down. I guess this bug might affect components
relying on the SPI other than the radio stack. I think your solution should
work without breaking anything.

A bit nicer solution would be implementing ResourceConfigure.configure in
Atm128SpiP that are called by the arbiter when a request/immediate request
went through. That's how it's done on the msp430. There is protection
against the potential race conditions in ArbiterP already.

I can go ahead and commit your fix if you wish.

Janos

On Fri, Nov 30, 2012 at 2:58 PM, Oldrine Lewis ole...@sutron.com wrote:

 Recently, I have been experiencing frequent lockups with the IRIS nodes. I
 discovered that the lockup occurred in Atm128SpiP.nc, looping infinitely
 onwhile ( !( SPSR  0x80 ) );

 ** **

 This bug, manifests if a task calls Resource.immediateRequest(), and an
 interrupt occurs after the task calls ResourceArbiter.immediateRequest[ id
 ]() , but before  calling startSpi(). At this moment, the task already has
 the handle for the resource and hence the ISR can also access the resource.
 

 If the interrupt tries to use the SPI, since it has locked the resource it
 will go ahead and use the SPI, causing a lockup

 

 I recommend encapsulating the call to immediateRequest and start SPI in a
 critical section. I have commented my observations below 

 ** **

 async command error_t Resource.immediateRequest[ uint8_t id ]() 

  {

atomic 

{

error_t result = call ResourceArbiter.immediateRequest[ id
 ]();

//what if i get an interrupt here and the interrupt
 wants to use the SPI

//the resource is already allocated so it will return
 TRUE. But the spi might be turned off

//this will cause the SPI driver to lockup waiting at
 while( !( SPSR  0x80 ) ) ;

if ( result == SUCCESS ) 

{

 startSpi();

}

return result;

}

 }

 ** **

 Please advice 

 ** **

 Thanks,

 Lewis

 ** **

 ___
 Tinyos-help mailing list
 Tinyos-help@millennium.berkeley.edu
 https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help

___
Tinyos-help mailing list
Tinyos-help@millennium.berkeley.edu
https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help

Re: [Tinyos-help] IRIS SPI lockup

2012-11-30 Thread Eric Decker
I thought the ResourceArbiter.immediateRequest symantic was that the
resource in question should be fully initilized following return from the
call.   This should follow the same symantic as a ResourceArbiter.Request
and Granted.   Prior to interrupts being allowed and the Granted being
signalled the resource is set up.   To be consistent,
ResourceArbiter.immediateRequest should follow the same symantic.


If that premise is true.   I would assert that the Atm128SpiP
implementation has a bug and should get fixed.

That would mean that the following as submitted is a work around and not an
actual fix.


thoughts?

On Fri, Nov 30, 2012 at 12:58 PM, Oldrine Lewis ole...@sutron.com wrote:

 Recently, I have been experiencing frequent lockups with the IRIS nodes. I
 discovered that the lockup occurred in Atm128SpiP.nc, looping infinitely
 onwhile ( !( SPSR  0x80 ) );

 ** **

 This bug, manifests if a task calls Resource.immediateRequest(), and an
 interrupt occurs after the task calls ResourceArbiter.immediateRequest[ id
 ]() , but before  calling startSpi(). At this moment, the task already has
 the handle for the resource and hence the ISR can also access the resource.
 

 If the interrupt tries to use the SPI, since it has locked the resource it
 will go ahead and use the SPI, causing a lockup

 

 I recommend encapsulating the call to immediateRequest and start SPI in a
 critical section. I have commented my observations below 

 ** **

 async command error_t Resource.immediateRequest[ uint8_t id ]() 

  {

atomic 

{

error_t result = call ResourceArbiter.immediateRequest[ id
 ]();

//what if i get an interrupt here and the interrupt
 wants to use the SPI

//the resource is already allocated so it will return
 TRUE. But the spi might be turned off

//this will cause the SPI driver to lockup waiting at
 while( !( SPSR  0x80 ) ) ;

if ( result == SUCCESS ) 

{

 startSpi();

}

return result;

}

 }

 ** **

 Please advice 

 ** **

 Thanks,

 Lewis

 ** **

 ___
 Tinyos-help mailing list
 Tinyos-help@millennium.berkeley.edu
 https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help




-- 
Eric B. Decker
Senior (over 50 :-) Researcher
___
Tinyos-help mailing list
Tinyos-help@millennium.berkeley.edu
https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help

Re: [Tinyos-help] IRIS SPI lockup

2012-11-30 Thread Oldrine Lewis
Atm128SpiP.nc seems to  make separate calls ( sequentially) to the
ResourceArbiter and calls for  initializing the SPI.

In case of Resource.request (), startSpi() is called before the call to
ResourceArbiter.request(), This ensures that the SPI will always be
initialized before Resource.granted()  is signaled. 

Incase of Resource.immediateRequest(), the resource is first locked and
only if the lock succeeds, is the SPI initialized. This sometime leads
to an uninitialized SPI being used 

 

From: Eric Decker [mailto:cire...@gmail.com] 
Sent: Friday, November 30, 2012 11:38 PM
To: Oldrine Lewis
Cc: tinyos-help@millennium.berkeley.edu
Subject: Re: [Tinyos-help] IRIS SPI lockup

 

 

I thought the ResourceArbiter.immediateRequest symantic was that the
resource in question should be fully initilized following return from
the call.   This should follow the same symantic as a
ResourceArbiter.Request and Granted.   Prior to interrupts being allowed
and the Granted being signalled the resource is set up.   To be
consistent, ResourceArbiter.immediateRequest should follow the same
symantic.

 

 

If that premise is true.   I would assert that the Atm128SpiP
implementation has a bug and should get fixed.

 

That would mean that the following as submitted is a work around and not
an actual fix.

 

 

thoughts?

On Fri, Nov 30, 2012 at 12:58 PM, Oldrine Lewis ole...@sutron.com
wrote:

Recently, I have been experiencing frequent lockups with the IRIS nodes.
I discovered that the lockup occurred in Atm128SpiP.nc, looping
infinitely onwhile ( !( SPSR  0x80 ) );

 

This bug, manifests if a task calls Resource.immediateRequest(), and an
interrupt occurs after the task calls ResourceArbiter.immediateRequest[
id ]() , but before  calling startSpi(). At this moment, the task
already has the handle for the resource and hence the ISR can also
access the resource.

If the interrupt tries to use the SPI, since it has locked the resource
it will go ahead and use the SPI, causing a lockup

I recommend encapsulating the call to immediateRequest and start SPI in
a critical section. I have commented my observations below 

 

async command error_t Resource.immediateRequest[ uint8_t id ]() 

 {

   atomic 

   {

   error_t result = call ResourceArbiter.immediateRequest[
id ]();

   //what if i get an interrupt here and the interrupt
wants to use the SPI

   //the resource is already allocated so it will return
TRUE. But the spi might be turned off

   //this will cause the SPI driver to lockup waiting at
while( !( SPSR  0x80 ) ) ;

   if ( result == SUCCESS ) 

   {

startSpi();

   }

   return result;

   }

}

 

Please advice 

 

Thanks,

Lewis

 


___
Tinyos-help mailing list
Tinyos-help@millennium.berkeley.edu
https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help





 

-- 
Eric B. Decker
Senior (over 50 :-) Researcher



___
Tinyos-help mailing list
Tinyos-help@millennium.berkeley.edu
https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help