I have confirmed that the host is sending the request to the hub asking for status changes every 40ms. I also confirmed that when the process works, the hub reports a change on port 1. When the process fails, the hub NACKs the host request, though it ought to indicate a status change. Thus, it seems clear that the hub IC itself is not recognizing the SE0 event.
We had code that allowed for 200ms, 500ms and 1200ms of disconnect, and I can only say that sometimes the hub worked and sometimes not. Usually not, however, even with 1.2 seconds of disconnect. From looking at the scope captures, I cannot understand why the hub IC is missing the SE0 event: clearly, there are many windows when the D+ and D- lines are below 0.8V for at least 2.5us. (This is seen on multiple devices, so it is not a particular IC.)
I also added 22 Ohm resistors in series with D+ and D- to no avail (though the bus at this point is full-speed). Adding 10pF (or even a scope probe) to D+ often did very much improve the results, but not 100%, more like 80% improvement.
The HUB IC is not, I believe, going into suspend mode. According to the manufacturer (SMSC), it takes 100-150us for the hub to 'see' an SE0 event if it is in suspend mode. I say this for two reasons: 1) the host continually sends SOFs (according to the capture) every 125us and 2) there is a pin on the part which should change state when in suspend mode, and it does not change state.
Any suggestions for searching for the hub's 'missed SE0' explanation? Thanks!
-Beethoven