Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 24 May 2016 20:00:51 +0200
From:      Gary Jennejohn <gljennjohn@gmail.com>
To:        "Kenneth D. Merry" <ken@FreeBSD.ORG>
Cc:        current@freebsd.org
Subject:   Re: AHCI/ADA regression?
Message-ID:  <20160524200051.42d0e6cb@ernst.home>
In-Reply-To: <20160524144125.GA66261@mithlond.kdm.org>
References:  <20160521100949.6179a697@ernst.home> <20160523175105.GA50102@mithlond.kdm.org> <20160524155828.7119d8a1@ernst.home> <20160524144125.GA66261@mithlond.kdm.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, 24 May 2016 10:41:25 -0400
"Kenneth D. Merry" <ken@FreeBSD.ORG> wrote:

> > The question in my mind is - why are "empty" multiplier ports being
> > probed with the new code but not with the old code?  
> 
> If the HBA says that it supports port multipliers, the kernel should always
> look for them.  It probes the port multiplier first, before moving on to
> look for regular targets.
> 
> So, from that standpoint, it should not be any different.  It sounds like
> we're either getting further in the port multiplier probe process, or there
> is something different about the way things are behaving.
> 
> If you can determine which commands are timing out, that may give us an
> idea about where it is in the probe process.
> 
> Here is one way we may be able to track things down...  Build a kernel with
> these options:
> 
> options	CAMDEBUG
> options CAM_DEBUG_FLAGS=CAM_DEBUG_PROBE
> 
> If you build a kernel before and after the change with those options, it
> will hopefully allow us to compare the probe sequence and get a clue about
> where to look for the problem.
> 

OK, both the old and new kernel versions do an extremely fast intial
probe with these results (note: obtained with grep over dmesg.boot):

(aprobe0:ahcich0:0:15:0): Probe started
(aprobe0:ahcich0:0:15:0): Probe PROBE_INVALID to PROBE_RESET
(aprobe1:ahcich1:0:15:0): Probe started
(aprobe1:ahcich1:0:15:0): Probe PROBE_INVALID to PROBE_RESET
(aprobe2:ahcich2:0:15:0): Probe started
(aprobe2:ahcich2:0:15:0): Probe PROBE_INVALID to PROBE_RESET
(aprobe3:ahcich3:0:15:0): Probe started
(aprobe3:ahcich3:0:15:0): Probe PROBE_INVALID to PROBE_RESET
(aprobe4:ahcich4:0:15:0): Probe started
(aprobe4:ahcich4:0:15:0): Probe PROBE_INVALID to PROBE_RESET
(aprobe5:ahcich5:0:15:0): Probe started
(aprobe5:ahcich5:0:15:0): Probe PROBE_INVALID to PROBE_RESET
(aprobe4:ahcich4:0:15:0): Probe PROBE_RESET to PROBE_RESET
(aprobe4:ahcich4:0:15:0): Probe PROBE_RESET to PROBE_INVALID
(aprobe4:ahcich4:0:15:0): Probe completed
(aprobe4:ahcich4:0:0:0): Probe started
(aprobe4:ahcich4:0:0:0): Probe PROBE_INVALID to PROBE_RESET
(aprobe4:ahcich4:0:0:0): Probe PROBE_RESET to PROBE_INVALID
(aprobe4:ahcich4:0:0:0): Probe completed
(aprobe0:ahcich0:0:15:0): Probe PROBE_RESET to PROBE_RESET
(aprobe2:ahcich2:0:15:0): Probe PROBE_RESET to PROBE_RESET
(aprobe0:ahcich0:0:15:0): SIGNATURE: 0000
(aprobe0:ahcich0:0:15:0): Probe PROBE_RESET to PROBE_INVALID
(aprobe0:ahcich0:0:15:0): Probe completed
(aprobe2:ahcich2:0:15:0): SIGNATURE: 0000
(aprobe2:ahcich2:0:15:0): Probe PROBE_RESET to PROBE_INVALID
(aprobe2:ahcich2:0:15:0): Probe completed
(aprobe0:ahcich0:0:0:0): Probe started
(aprobe0:ahcich0:0:0:0): Probe PROBE_INVALID to PROBE_RESET
(aprobe2:ahcich2:0:0:0): Probe started
(aprobe2:ahcich2:0:0:0): Probe PROBE_INVALID to PROBE_RESET
(aprobe3:ahcich3:0:15:0): Probe PROBE_RESET to PROBE_RESET
(aprobe5:ahcich5:0:15:0): Probe PROBE_RESET to PROBE_RESET
(aprobe0:ahcich0:0:0:0): SIGNATURE: 0000
(aprobe0:ahcich0:0:0:0): Probe PROBE_RESET to PROBE_IDENTIFY
(aprobe2:ahcich2:0:0:0): SIGNATURE: 0000
(aprobe2:ahcich2:0:0:0): Probe PROBE_RESET to PROBE_IDENTIFY
(aprobe1:ahcich1:0:15:0): Probe PROBE_RESET to PROBE_RESET
(aprobe3:ahcich3:0:15:0): SIGNATURE: 0000
(aprobe3:ahcich3:0:15:0): Probe PROBE_RESET to PROBE_INVALID
(aprobe3:ahcich3:0:15:0): Probe completed
(aprobe5:ahcich5:0:15:0): SIGNATURE: 0000
(aprobe5:ahcich5:0:15:0): Probe PROBE_RESET to PROBE_INVALID
(aprobe5:ahcich5:0:15:0): Probe completed
(aprobe1:ahcich1:0:15:0): SIGNATURE: eb14
(aprobe1:ahcich1:0:15:0): Probe PROBE_RESET to PROBE_INVALID
(aprobe1:ahcich1:0:15:0): Probe completed
(aprobe1:ahcich3:0:0:0): Probe started
(aprobe1:ahcich3:0:0:0): Probe PROBE_INVALID to PROBE_RESET
(aprobe3:ahcich5:0:0:0): Probe started
(aprobe3:ahcich5:0:0:0): Probe PROBE_INVALID to PROBE_RESET
(aprobe4:ahcich1:0:0:0): Probe started
(aprobe4:ahcich1:0:0:0): Probe PROBE_INVALID to PROBE_RESET
(aprobe1:ahcich3:0:0:0): SIGNATURE: 0000
(aprobe1:ahcich3:0:0:0): Probe PROBE_RESET to PROBE_IDENTIFY
(aprobe3:ahcich5:0:0:0): SIGNATURE: 0000
(aprobe3:ahcich5:0:0:0): Probe PROBE_RESET to PROBE_IDENTIFY
(aprobe4:ahcich1:0:0:0): SIGNATURE: eb14
(aprobe4:ahcich1:0:0:0): Probe PROBE_RESET to PROBE_IDENTIFY
(aprobe0:ahcich0:0:0:0): Probe PROBE_IDENTIFY to PROBE_SETMODE
(aprobe1:ahcich3:0:0:0): Probe PROBE_IDENTIFY to PROBE_SETMODE
(aprobe3:ahcich5:0:0:0): Probe PROBE_IDENTIFY to PROBE_SETMODE
(aprobe0:ahcich0:0:0:0): Probe PROBE_SETMODE to PROBE_SET_MULTI
(aprobe1:ahcich3:0:0:0): Probe PROBE_SETMODE to PROBE_SETDMAAA
(aprobe3:ahcich5:0:0:0): Probe PROBE_SETMODE to PROBE_SETDMAAA
(aprobe0:ahcich0:0:0:0): Probe PROBE_SET_MULTI to PROBE_DONE
(aprobe0:ahcich0:0:0:0): Probe completed
(aprobe1:ahcich3:0:0:0): Probe PROBE_SETDMAAA to PROBE_SET_MULTI
(aprobe4:ahcich1:0:0:0): Probe PROBE_IDENTIFY to PROBE_SETMODE
(aprobe3:ahcich5:0:0:0): Probe PROBE_SETDMAAA to PROBE_SET_MULTI
(aprobe1:ahcich3:0:0:0): Probe PROBE_SET_MULTI to PROBE_DONE
(aprobe1:ahcich3:0:0:0): Probe completed
(aprobe3:ahcich5:0:0:0): Probe PROBE_SET_MULTI to PROBE_DONE
(aprobe3:ahcich5:0:0:0): Probe completed
(aprobe2:ahcich2:0:0:0): Probe PROBE_IDENTIFY to PROBE_SETMODE
(aprobe4:ahcich1:0:0:0): Probe PROBE_SETMODE to PROBE_INQUIRY
(aprobe2:ahcich2:0:0:0): Probe PROBE_SETMODE to PROBE_SETDMAAA
(aprobe2:ahcich2:0:0:0): Probe PROBE_SETDMAAA to PROBE_SET_MULTI
(aprobe2:ahcich2:0:0:0): Probe PROBE_SET_MULTI to PROBE_DONE
(aprobe2:ahcich2:0:0:0): Probe completed
(aprobe4:ahcich1:0:0:0): Probe PROBE_INQUIRY to PROBE_FULL_INQUIRY
(aprobe4:ahcich1:0:0:0): Probe PROBE_FULL_INQUIRY to PROBE_DONE
(aprobe4:ahcich1:0:0:0): Probe completed

it looks like the code is basically checking to see how many ports are
on a multiplier since it looks at port 0 and port 15.

[I don't have a dmesg.boot for the "broken" kernel, but I saw the
probe messages going shooting past and it was obviuos that they
were the same]

The old code stops there.

The new code starts probing for what appear to be random ports on a
multiplier, like 0, 7, 20, 17, etc.  These always result in timeouts.

These probes always start with "Probe PROBE_INVALID to PROBE_IDENTIFY"
Why the new code doesn't accept the PROBE_INVALID and skip over it
I don't understand.

After I noticed that the same ports had been probed several times on
achich2 with no apparent end in sight I rebooted.  This behavior is
extremely poor.

-- 
Gary Jennejohn



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20160524200051.42d0e6cb>