Dell PowerEdge 1750 and mpt
David Sze
dsze at alumni.uwaterloo.ca
Wed Oct 15 11:01:47 PDT 2003
On Wed, Oct 15, 2003 at 10:12:49AM -0700, Nate Lawson wrote:
> On Wed, 15 Oct 2003, David Sze wrote:
> > The application talks to pass(4) to periodically retrieve the serial
> > numbers of all devices on the bus (the code is basically copied from
> > "camcontrol inquiry -S", plus some code to enumerate the bus). So that is
> > consistent with how often we are seeing the crashes. I'll go over the code
> > to make sure there are no blatant errors on my part. The only puzzling
> > thing is that the same code runs flawlessly on a variety of similar
> > hardware, some machines also with mpt(4), but mostly ahc(4) and ahd(4)
> > controllers.
>
> Try running camcontrol inquiry -S on the same device in a loop and see if
> it gets the same panic.
Running "camcontrol inquiry pass3 -S" in a loop for 1000 times was just
fine, there was no panic.
> > (kgdb) fr 7
> > #7 0x80174507 in mpt_action (sim=0x923867c0, ccb=0x961a0000) at
> > ../../dev/mpt/mpt_freebsd.c:1311
> > 1311 if (mpt_read_cfg_page(mpt, tgt, &tmp.Header)) {
> > (kgdb) print *ccb
> > stqe_next = 0x0}}, retry_count = 4, cbfcnp = 0x80129a94
> > <passdone>, func_code = XPT_GET_TRAN_SETTINGS, status = 0,
>
> Why are you sending a XPT_GET_TRAN_SETTINGS CCB? That's not even needed
> to get the serial number. In any case, I need the output of
> print ccb->cts.
The code never sends XPT_GET_TRAN_SETTINGS, at least not directly. So I
guess it is either sent indirectly, or the ccb that was passed in and
shown in this crashdump is complete junk.
What the code did do was send a XPT_DEV_MATCH, and for each
DEV_MATCH_DEVICE it would do a scsi_inquiry() with page_code set to
SVPD_UNIT_SERIAL_NUMBER, the same way the scsiserial() function in
camcontrol.c does it.
I confess to not really knowing anything about the cam subsystem though,
so it's entirely possible that I missed something important in copying
the code from camcontrol.c.
Since these are actually production servers, what I've done in the
meantime is (read the cam(3) manpage, haha), then changed the code to
repeatedly call cam_open_spec_device() with dev_name set to "pass", and
unit incrementing until cam_open_spec_device() returns NULL. Then I
just use the serial_num field of the returned cam_device structures.
More information about the freebsd-scsi
mailing list