a16ca43ee6
In mpttimeout, call mpt_intr just on the offchance that we missed an interrupt. We can check to see whether or not the command that is timing out got completed. When we *do* decide to timeout a command, set the command state to REQ_TIMEOUT and then invoke another timeout (hz/10)- mpttimeout2. This allows us to catch a couple cases we've seen where the command we timed out on in fact is ready to be completed by the firmware. In any case, it's only after mpttimeout2 is called that we actually take down the private state and free the request itself. CAM has been notified in mpttimeout anyway. This whole area should be redone, but that will take 105% of my available game time for this month. Fix a couple of missing (and not useful, at presnet) CAMLOCK_2_MPTLOCK and MPTLOCK_2_CAMLOCK locations. Split mpt_notify into mpt_ctlop, which handles all reply completions that have 0x800000000 or'd into the ContextID. This function can, in fact, call mpt_event_notify_reply, which handles the traditional async event notifications. While we're at it, put in the extremely important (but currently untested) code that send back an Ack to an Event Notification (if the Event Notification is marked with AckRequired). Note that an Ack also generates another ctlop completion, tra la. Fix up mpt_done substantially to try and get how we plug into CAM correctly done. Remove bogus CAM_RELEASE_SIMQ settings. Do some cleanups in mpt_action that are related to speed negotiation for Ultra4 cards. This is an area that is still quite fragile and worrisome as config data being read back often doesn't make sense or jibe with the documentation. At any rate, after these changes were done, I was finally able to get Lars Eggert's dual 320M disk system to stay up under load all weekend- hopefully we're in good enough for now shape. MFC after: 1 week