AIC94XX discovery timeout problem details...

malahal
2006-09-15T07:20:33Z

I chased the time out problem and found that the PORTE_BYTES_DMAED port
event must be responded with a call to lldd_port_formed() which will
update PHY_IS_UP and port-links fields in DDB 0. As there is a single
thread handling PHY/port events as well as discovery, we really can't
handle PORTE_BYTES_DMAED event until the discovery is complete. This
results in SCSI commands timing out in the discovery thread no matter
what I do! This problem may be unique to Vitesse expander, read the PS
section for details.

Tried using two threads, one for events and the other for discovery.
That avoided the timeout problems, but the discovery thread would die
after few iterations due to the event thread and the discovery thread
racing each other for setting up and tearing down of sysfs objects.

I tried calling lldd_port_formed() with appropriate phy_mask from the
notify_port_event() itself. That worked fine. It is just a hack for now!

Any comments, suggestions?

Thanks, Malahal.
PS: I instrumented the code to use only a single PHY out of 4-phy wide
port by prematurely returning from sas_form_port() for all PHYs except
one. In other words, I ignored the PORTE_BYTES_DMAED event for all PHYs
but one. There were SCSI timeouts every time I did that except if the
PHY I was using is phy3. When I swapped cables, the PHY that worked
changed too. I believe, it goes with a specific Vitesse expander PHY. Is
it possible that the Vitesse expander uses a specific PHY to respond to
some SCSI requests even though the adapter uses a different PHY while
sending the request? Is this behavior of communicating on two different
PHYs for a single SCSI command is allowed in the spec? Also note that
the discovery commands (SMP) just work fine.