1 /*-
2 * Copyright (c) 2009 Yahoo! Inc.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 * $FreeBSD: head/sys/dev/mpr/mpr_table.c 323380 2017-09-09 22:02:36Z scottl $
27 */
28
29 /* Debugging tables for MPT2 */
30
31 /* TODO Move headers to mprvar */
32 #include <sys/types.h>
33 #include <sys/param.h>
34 #include <sys/systm.h>
35 #include <sys/kernel.h>
36 #include <sys/module.h>
37 #include <sys/bus.h>
38 #include <sys/conf.h>
39 #include <sys/bio.h>
40 #include <sys/malloc.h>
41 #include <sys/uio.h>
42 #include <sys/sysctl.h>
43 #include <sys/queue.h>
44 #include <sys/kthread.h>
45 #include <sys/taskqueue.h>
46 #include <sys/eventhandler.h>
47
48 #include <sys/rman.h>
49
50 #include <bus/cam/scsi/scsi_all.h>
51
52 #include <dev/raid/mpr/mpi/mpi2_type.h>
53 #include <dev/raid/mpr/mpi/mpi2.h>
54 #include <dev/raid/mpr/mpi/mpi2_ioc.h>
55 #include <dev/raid/mpr/mpi/mpi2_cnfg.h>
56 #include <dev/raid/mpr/mpi/mpi2_init.h>
57 #include <dev/raid/mpr/mpi/mpi2_tool.h>
58 #include <dev/raid/mpr/mpi/mpi2_pci.h>
59 #include <dev/raid/mpr/mpr_ioctl.h>
60 #include <dev/raid/mpr/mprvar.h>
61 #include <dev/raid/mpr/mpr_table.h>
62
63 char *
mpr_describe_table(struct mpr_table_lookup * table,u_int code)64 mpr_describe_table(struct mpr_table_lookup *table, u_int code)
65 {
66 int i;
67
68 for (i = 0; table[i].string != NULL; i++) {
69 if (table[i].code == code)
70 return(table[i].string);
71 }
72 return(table[i+1].string);
73 }
74
75 //SLM-Add new PCIe info to all of these tables
76 struct mpr_table_lookup mpr_event_names[] = {
77 {"LogData", 0x01},
78 {"StateChange", 0x02},
79 {"HardResetReceived", 0x05},
80 {"EventChange", 0x0a},
81 {"TaskSetFull", 0x0e},
82 {"SasDeviceStatusChange", 0x0f},
83 {"IrOperationStatus", 0x14},
84 {"SasDiscovery", 0x16},
85 {"SasBroadcastPrimitive", 0x17},
86 {"SasInitDeviceStatusChange", 0x18},
87 {"SasInitTableOverflow", 0x19},
88 {"SasTopologyChangeList", 0x1c},
89 {"SasEnclDeviceStatusChange", 0x1d},
90 {"IrVolume", 0x1e},
91 {"IrPhysicalDisk", 0x1f},
92 {"IrConfigurationChangeList", 0x20},
93 {"LogEntryAdded", 0x21},
94 {"SasPhyCounter", 0x22},
95 {"GpioInterrupt", 0x23},
96 {"HbdPhyEvent", 0x24},
97 {"SasQuiesce", 0x25},
98 {"SasNotifyPrimitive", 0x26},
99 {"TempThreshold", 0x27},
100 {"HostMessage", 0x28},
101 {"PowerPerformanceChange", 0x29},
102 {"PCIeDeviceStatusChange", 0x30},
103 {"PCIeEnumeration", 0x31},
104 {"PCIeTopologyChangeList", 0x32},
105 {"PCIeLinkCounter", 0x33},
106 {"CableEvent", 0x34},
107 {NULL, 0},
108 {"Unknown Event", 0}
109 };
110
111 struct mpr_table_lookup mpr_phystatus_names[] = {
112 {"NewTargetAdded", 0x01},
113 {"TargetGone", 0x02},
114 {"PHYLinkStatusChange", 0x03},
115 {"PHYLinkStatusUnchanged", 0x04},
116 {"TargetMissing", 0x05},
117 {NULL, 0},
118 {"Unknown Status", 0}
119 };
120
121 struct mpr_table_lookup mpr_linkrate_names[] = {
122 {"PHY disabled", 0x01},
123 {"Speed Negotiation Failed", 0x02},
124 {"SATA OOB Complete", 0x03},
125 {"SATA Port Selector", 0x04},
126 {"SMP Reset in Progress", 0x05},
127 {"1.5Gbps", 0x08},
128 {"3.0Gbps", 0x09},
129 {"6.0Gbps", 0x0a},
130 {"12.0Gbps", 0x0b},
131 {NULL, 0},
132 {"LinkRate Unknown", 0x00}
133 };
134
135 struct mpr_table_lookup mpr_sasdev0_devtype[] = {
136 {"End Device", 0x01},
137 {"Edge Expander", 0x02},
138 {"Fanout Expander", 0x03},
139 {NULL, 0},
140 {"No Device", 0x00}
141 };
142
143 struct mpr_table_lookup mpr_phyinfo_reason_names[] = {
144 {"Power On", 0x01},
145 {"Hard Reset", 0x02},
146 {"SMP Phy Control Link Reset", 0x03},
147 {"Loss DWORD Sync", 0x04},
148 {"Multiplex Sequence", 0x05},
149 {"I-T Nexus Loss Timer", 0x06},
150 {"Break Timeout Timer", 0x07},
151 {"PHY Test Function", 0x08},
152 {NULL, 0},
153 {"Unknown Reason", 0x00}
154 };
155
156 struct mpr_table_lookup mpr_whoinit_names[] = {
157 {"System BIOS", 0x01},
158 {"ROM BIOS", 0x02},
159 {"PCI Peer", 0x03},
160 {"Host Driver", 0x04},
161 {"Manufacturing", 0x05},
162 {NULL, 0},
163 {"Not Initialized", 0x00}
164 };
165
166 struct mpr_table_lookup mpr_sasdisc_reason[] = {
167 {"Discovery Started", 0x01},
168 {"Discovery Complete", 0x02},
169 {NULL, 0},
170 {"Unknown", 0x00}
171 };
172
173 struct mpr_table_lookup mpr_sastopo_exp[] = {
174 {"Added", 0x01},
175 {"Not Responding", 0x02},
176 {"Responding", 0x03},
177 {"Delay Not Responding", 0x04},
178 {NULL, 0},
179 {"Unknown", 0x00}
180 };
181
182 struct mpr_table_lookup mpr_sasdev_reason[] = {
183 {"SMART Data", 0x05},
184 {"Unsupported", 0x07},
185 {"Internal Device Reset", 0x08},
186 {"Task Abort Internal", 0x09},
187 {"Abort Task Set Internal", 0x0a},
188 {"Clear Task Set Internal", 0x0b},
189 {"Query Task Internal", 0x0c},
190 {"Async Notification", 0x0d},
191 {"Cmp Internal Device Reset", 0x0e},
192 {"Cmp Task Abort Internal", 0x0f},
193 {"Sata Init Failure", 0x10},
194 {NULL, 0},
195 {"Unknown", 0x00}
196 };
197
198 struct mpr_table_lookup mpr_pcie_linkrate_names[] = {
199 {"Port disabled", 0x01},
200 {"2.5GT/sec", 0x02},
201 {"5.0GT/sec", 0x03},
202 {"8.0GT/sec", 0x04},
203 {"16.0GT/sec", 0x05},
204 {NULL, 0},
205 {"LinkRate Unknown", 0x00}
206 };
207
208 struct mpr_table_lookup mpr_iocstatus_string[] = {
209 {"success", MPI2_IOCSTATUS_SUCCESS},
210 {"invalid function", MPI2_IOCSTATUS_INVALID_FUNCTION},
211 {"scsi recovered error", MPI2_IOCSTATUS_SCSI_RECOVERED_ERROR},
212 {"scsi invalid dev handle", MPI2_IOCSTATUS_SCSI_INVALID_DEVHANDLE},
213 {"scsi device not there", MPI2_IOCSTATUS_SCSI_DEVICE_NOT_THERE},
214 {"scsi data overrun", MPI2_IOCSTATUS_SCSI_DATA_OVERRUN},
215 {"scsi data underrun", MPI2_IOCSTATUS_SCSI_DATA_UNDERRUN},
216 {"scsi io data error", MPI2_IOCSTATUS_SCSI_IO_DATA_ERROR},
217 {"scsi protocol error", MPI2_IOCSTATUS_SCSI_PROTOCOL_ERROR},
218 {"scsi task terminated", MPI2_IOCSTATUS_SCSI_TASK_TERMINATED},
219 {"scsi residual mismatch", MPI2_IOCSTATUS_SCSI_RESIDUAL_MISMATCH},
220 {"scsi task mgmt failed", MPI2_IOCSTATUS_SCSI_TASK_MGMT_FAILED},
221 {"scsi ioc terminated", MPI2_IOCSTATUS_SCSI_IOC_TERMINATED},
222 {"scsi ext terminated", MPI2_IOCSTATUS_SCSI_EXT_TERMINATED},
223 {"eedp guard error", MPI2_IOCSTATUS_EEDP_GUARD_ERROR},
224 {"eedp ref tag error", MPI2_IOCSTATUS_EEDP_REF_TAG_ERROR},
225 {"eedp app tag error", MPI2_IOCSTATUS_EEDP_APP_TAG_ERROR},
226 {NULL, 0},
227 {"unknown", 0x00}
228 };
229
230 struct mpr_table_lookup mpr_scsi_status_string[] = {
231 {"good", MPI2_SCSI_STATUS_GOOD},
232 {"check condition", MPI2_SCSI_STATUS_CHECK_CONDITION},
233 {"condition met", MPI2_SCSI_STATUS_CONDITION_MET},
234 {"busy", MPI2_SCSI_STATUS_BUSY},
235 {"intermediate", MPI2_SCSI_STATUS_INTERMEDIATE},
236 {"intermediate condmet", MPI2_SCSI_STATUS_INTERMEDIATE_CONDMET},
237 {"reservation conflict", MPI2_SCSI_STATUS_RESERVATION_CONFLICT},
238 {"command terminated", MPI2_SCSI_STATUS_COMMAND_TERMINATED},
239 {"task set full", MPI2_SCSI_STATUS_TASK_SET_FULL},
240 {"aca active", MPI2_SCSI_STATUS_ACA_ACTIVE},
241 {"task aborted", MPI2_SCSI_STATUS_TASK_ABORTED},
242 {NULL, 0},
243 {"unknown", 0x00}
244 };
245
246 struct mpr_table_lookup mpr_scsi_taskmgmt_string[] = {
247 {"task mgmt request completed", MPI2_SCSITASKMGMT_RSP_TM_COMPLETE},
248 {"invalid frame", MPI2_SCSITASKMGMT_RSP_INVALID_FRAME},
249 {"task mgmt request not supp", MPI2_SCSITASKMGMT_RSP_TM_NOT_SUPPORTED},
250 {"task mgmt request failed", MPI2_SCSITASKMGMT_RSP_TM_FAILED},
251 {"task mgmt request_succeeded", MPI2_SCSITASKMGMT_RSP_TM_SUCCEEDED},
252 {"invalid lun", MPI2_SCSITASKMGMT_RSP_TM_INVALID_LUN},
253 {"overlapped tag attempt", 0xA},
254 {"task queued on IOC", MPI2_SCSITASKMGMT_RSP_IO_QUEUED_ON_IOC},
255 {NULL, 0},
256 {"unknown", 0x00}
257 };
258
259 void
mpr_describe_devinfo(uint32_t devinfo,char * string,int len)260 mpr_describe_devinfo(uint32_t devinfo, char *string, int len)
261 {
262 ksnprintf(string, len, "%pb%i,%s",
263 "\20" "\4SataHost" "\5SmpInit" "\6StpInit" "\7SspInit"
264 "\10SataDev" "\11SmpTarg" "\12StpTarg" "\13SspTarg" "\14Direct"
265 "\15LsiDev" "\16AtapiDev" "\17SepDev",
266 devinfo,
267 mpr_describe_table(mpr_sasdev0_devtype, devinfo & 0x03));
268 }
269
270 void
mpr_print_iocfacts(struct mpr_softc * sc,MPI2_IOC_FACTS_REPLY * facts)271 mpr_print_iocfacts(struct mpr_softc *sc, MPI2_IOC_FACTS_REPLY *facts)
272 {
273 MPR_PRINTFIELD_START(sc, "IOCFacts");
274 MPR_PRINTFIELD(sc, facts, MsgVersion, 0x%x);
275 MPR_PRINTFIELD(sc, facts, HeaderVersion, 0x%x);
276 MPR_PRINTFIELD(sc, facts, IOCNumber, %d);
277 MPR_PRINTFIELD(sc, facts, IOCExceptions, 0x%x);
278 MPR_PRINTFIELD(sc, facts, MaxChainDepth, %d);
279 mpr_print_field(sc, "WhoInit: %s\n",
280 mpr_describe_table(mpr_whoinit_names, facts->WhoInit));
281 MPR_PRINTFIELD(sc, facts, NumberOfPorts, %d);
282 MPR_PRINTFIELD(sc, facts, MaxMSIxVectors, %d);
283 MPR_PRINTFIELD(sc, facts, RequestCredit, %d);
284 MPR_PRINTFIELD(sc, facts, ProductID, 0x%x);
285 mpr_print_field(sc, "IOCCapabilities: %pb%i\n",
286 "\20" "\3ScsiTaskFull" "\4DiagTrace"
287 "\5SnapBuf" "\6ExtBuf" "\7EEDP" "\10BiDirTarg" "\11Multicast"
288 "\14TransRetry" "\15IR" "\16EventReplay" "\17RaidAccel"
289 "\20MSIXIndex" "\21HostDisc",
290 facts->IOCCapabilities);
291 mpr_print_field(sc, "FWVersion= %d-%d-%d-%d\n",
292 facts->FWVersion.Struct.Major,
293 facts->FWVersion.Struct.Minor,
294 facts->FWVersion.Struct.Unit,
295 facts->FWVersion.Struct.Dev);
296 MPR_PRINTFIELD(sc, facts, IOCRequestFrameSize, %d);
297 MPR_PRINTFIELD(sc, facts, MaxInitiators, %d);
298 MPR_PRINTFIELD(sc, facts, MaxTargets, %d);
299 MPR_PRINTFIELD(sc, facts, MaxSasExpanders, %d);
300 MPR_PRINTFIELD(sc, facts, MaxEnclosures, %d);
301 mpr_print_field(sc, "ProtocolFlags: %pb%i\n",
302 "\20" "\1ScsiTarg" "\2ScsiInit",
303 facts->ProtocolFlags);
304 MPR_PRINTFIELD(sc, facts, HighPriorityCredit, %d);
305 MPR_PRINTFIELD(sc, facts, MaxReplyDescriptorPostQueueDepth, %d);
306 MPR_PRINTFIELD(sc, facts, ReplyFrameSize, %d);
307 MPR_PRINTFIELD(sc, facts, MaxVolumes, %d);
308 MPR_PRINTFIELD(sc, facts, MaxDevHandle, %d);
309 MPR_PRINTFIELD(sc, facts, MaxPersistentEntries, %d);
310 }
311
312 void
mpr_print_portfacts(struct mpr_softc * sc,MPI2_PORT_FACTS_REPLY * facts)313 mpr_print_portfacts(struct mpr_softc *sc, MPI2_PORT_FACTS_REPLY *facts)
314 {
315
316 MPR_PRINTFIELD_START(sc, "PortFacts");
317 MPR_PRINTFIELD(sc, facts, PortNumber, %d);
318 MPR_PRINTFIELD(sc, facts, PortType, 0x%x);
319 MPR_PRINTFIELD(sc, facts, MaxPostedCmdBuffers, %d);
320 }
321
322 void
mpr_print_evt_generic(struct mpr_softc * sc,MPI2_EVENT_NOTIFICATION_REPLY * event)323 mpr_print_evt_generic(struct mpr_softc *sc, MPI2_EVENT_NOTIFICATION_REPLY *event)
324 {
325
326 MPR_PRINTFIELD_START(sc, "EventReply");
327 MPR_PRINTFIELD(sc, event, EventDataLength, %d);
328 MPR_PRINTFIELD(sc, event, AckRequired, %d);
329 mpr_print_field(sc, "Event: %s (0x%x)\n",
330 mpr_describe_table(mpr_event_names, event->Event), event->Event);
331 MPR_PRINTFIELD(sc, event, EventContext, 0x%x);
332 }
333
334 void
mpr_print_sasdev0(struct mpr_softc * sc,MPI2_CONFIG_PAGE_SAS_DEV_0 * buf)335 mpr_print_sasdev0(struct mpr_softc *sc, MPI2_CONFIG_PAGE_SAS_DEV_0 *buf)
336 {
337 MPR_PRINTFIELD_START(sc, "SAS Device Page 0");
338 MPR_PRINTFIELD(sc, buf, Slot, %d);
339 MPR_PRINTFIELD(sc, buf, EnclosureHandle, 0x%x);
340 mpr_print_field(sc, "SASAddress: 0x%jx\n",
341 mpr_to_u64(&buf->SASAddress));
342 MPR_PRINTFIELD(sc, buf, ParentDevHandle, 0x%x);
343 MPR_PRINTFIELD(sc, buf, PhyNum, %d);
344 MPR_PRINTFIELD(sc, buf, AccessStatus, 0x%x);
345 MPR_PRINTFIELD(sc, buf, DevHandle, 0x%x);
346 MPR_PRINTFIELD(sc, buf, AttachedPhyIdentifier, 0x%x);
347 MPR_PRINTFIELD(sc, buf, ZoneGroup, %d);
348 mpr_print_field(sc, "DeviceInfo: %pb%i,%s\n",
349 "\20" "\4SataHost" "\5SmpInit" "\6StpInit" "\7SspInit"
350 "\10SataDev" "\11SmpTarg" "\12StpTarg" "\13SspTarg" "\14Direct"
351 "\15LsiDev" "\16AtapiDev" "\17SepDev",
352 buf->DeviceInfo,
353 mpr_describe_table(mpr_sasdev0_devtype, buf->DeviceInfo & 0x03));
354 MPR_PRINTFIELD(sc, buf, Flags, 0x%x);
355 MPR_PRINTFIELD(sc, buf, PhysicalPort, %d);
356 MPR_PRINTFIELD(sc, buf, MaxPortConnections, %d);
357 mpr_print_field(sc, "DeviceName: 0x%jx\n",
358 mpr_to_u64(&buf->DeviceName));
359 MPR_PRINTFIELD(sc, buf, PortGroups, %d);
360 MPR_PRINTFIELD(sc, buf, DmaGroup, %d);
361 MPR_PRINTFIELD(sc, buf, ControlGroup, %d);
362 }
363
364 void
mpr_print_evt_sas(struct mpr_softc * sc,MPI2_EVENT_NOTIFICATION_REPLY * event)365 mpr_print_evt_sas(struct mpr_softc *sc, MPI2_EVENT_NOTIFICATION_REPLY *event)
366 {
367
368 mpr_print_evt_generic(sc, event);
369
370 switch(event->Event) {
371 case MPI2_EVENT_SAS_DISCOVERY:
372 {
373 MPI2_EVENT_DATA_SAS_DISCOVERY *data;
374
375 data = (MPI2_EVENT_DATA_SAS_DISCOVERY *)&event->EventData;
376 mpr_print_field(sc, "Flags: %pb%i\n",
377 "\20" "\1InProgress" "\2DeviceChange",
378 data->Flags);
379 mpr_print_field(sc, "ReasonCode: %s\n",
380 mpr_describe_table(mpr_sasdisc_reason, data->ReasonCode));
381 MPR_PRINTFIELD(sc, data, PhysicalPort, %d);
382 mpr_print_field(sc, "DiscoveryStatus: %pb%i\n",
383 "\20"
384 "\1Loop" "\2UnaddressableDev" "\3DupSasAddr" "\5SmpTimeout"
385 "\6ExpRouteFull" "\7RouteIndexError" "\10SmpFailed"
386 "\11SmpCrcError" "\12SubSubLink" "\13TableTableLink"
387 "\14UnsupDevice" "\15TableSubLink" "\16MultiDomain"
388 "\17MultiSub" "\20MultiSubSub" "\34DownstreamInit"
389 "\35MaxPhys" "\36MaxTargs" "\37MaxExpanders"
390 "\40MaxEnclosures",
391 data->DiscoveryStatus);
392 break;
393 }
394 //SLM-add for PCIE EVENT too
395 case MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST:
396 {
397 MPI2_EVENT_DATA_SAS_TOPOLOGY_CHANGE_LIST *data;
398 MPI2_EVENT_SAS_TOPO_PHY_ENTRY *phy;
399 int i, phynum;
400
401 data = (MPI2_EVENT_DATA_SAS_TOPOLOGY_CHANGE_LIST *)
402 &event->EventData;
403 MPR_PRINTFIELD(sc, data, EnclosureHandle, 0x%x);
404 MPR_PRINTFIELD(sc, data, ExpanderDevHandle, 0x%x);
405 MPR_PRINTFIELD(sc, data, NumPhys, %d);
406 MPR_PRINTFIELD(sc, data, NumEntries, %d);
407 MPR_PRINTFIELD(sc, data, StartPhyNum, %d);
408 mpr_print_field(sc, "ExpStatus: %s (0x%x)\n",
409 mpr_describe_table(mpr_sastopo_exp, data->ExpStatus),
410 data->ExpStatus);
411 MPR_PRINTFIELD(sc, data, PhysicalPort, %d);
412 for (i = 0; i < data->NumEntries; i++) {
413 phy = &data->PHY[i];
414 phynum = data->StartPhyNum + i;
415 mpr_print_field(sc,
416 "PHY[%d].AttachedDevHandle: 0x%04x\n", phynum,
417 phy->AttachedDevHandle);
418 mpr_print_field(sc,
419 "PHY[%d].LinkRate: %s (0x%x)\n", phynum,
420 mpr_describe_table(mpr_linkrate_names,
421 (phy->LinkRate >> 4) & 0xf), phy->LinkRate);
422 mpr_print_field(sc, "PHY[%d].PhyStatus: %s\n",
423 phynum, mpr_describe_table(mpr_phystatus_names,
424 phy->PhyStatus));
425 }
426 break;
427 }
428 case MPI2_EVENT_SAS_ENCL_DEVICE_STATUS_CHANGE:
429 {
430 MPI2_EVENT_DATA_SAS_ENCL_DEV_STATUS_CHANGE *data;
431
432 data = (MPI2_EVENT_DATA_SAS_ENCL_DEV_STATUS_CHANGE *)
433 &event->EventData;
434 MPR_PRINTFIELD(sc, data, EnclosureHandle, 0x%x);
435 mpr_print_field(sc, "ReasonCode: %s\n",
436 mpr_describe_table(mpr_sastopo_exp, data->ReasonCode));
437 MPR_PRINTFIELD(sc, data, PhysicalPort, %d);
438 MPR_PRINTFIELD(sc, data, NumSlots, %d);
439 MPR_PRINTFIELD(sc, data, StartSlot, %d);
440 MPR_PRINTFIELD(sc, data, PhyBits, 0x%x);
441 break;
442 }
443 case MPI2_EVENT_SAS_DEVICE_STATUS_CHANGE:
444 {
445 MPI2_EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *data;
446
447 data = (MPI2_EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *)
448 &event->EventData;
449 MPR_PRINTFIELD(sc, data, TaskTag, 0x%x);
450 mpr_print_field(sc, "ReasonCode: %s\n",
451 mpr_describe_table(mpr_sasdev_reason, data->ReasonCode));
452 MPR_PRINTFIELD(sc, data, ASC, 0x%x);
453 MPR_PRINTFIELD(sc, data, ASCQ, 0x%x);
454 MPR_PRINTFIELD(sc, data, DevHandle, 0x%x);
455 mpr_print_field(sc, "SASAddress: 0x%jx\n",
456 mpr_to_u64(&data->SASAddress));
457 }
458 default:
459 break;
460 }
461 }
462
463 void
mpr_print_expander1(struct mpr_softc * sc,MPI2_CONFIG_PAGE_EXPANDER_1 * buf)464 mpr_print_expander1(struct mpr_softc *sc, MPI2_CONFIG_PAGE_EXPANDER_1 *buf)
465 {
466 MPR_PRINTFIELD_START(sc, "SAS Expander Page 1 #%d", buf->Phy);
467 MPR_PRINTFIELD(sc, buf, PhysicalPort, %d);
468 MPR_PRINTFIELD(sc, buf, NumPhys, %d);
469 MPR_PRINTFIELD(sc, buf, Phy, %d);
470 MPR_PRINTFIELD(sc, buf, NumTableEntriesProgrammed, %d);
471 mpr_print_field(sc, "ProgrammedLinkRate: %s (0x%x)\n",
472 mpr_describe_table(mpr_linkrate_names,
473 (buf->ProgrammedLinkRate >> 4) & 0xf), buf->ProgrammedLinkRate);
474 mpr_print_field(sc, "HwLinkRate: %s (0x%x)\n",
475 mpr_describe_table(mpr_linkrate_names,
476 (buf->HwLinkRate >> 4) & 0xf), buf->HwLinkRate);
477 MPR_PRINTFIELD(sc, buf, AttachedDevHandle, 0x%04x);
478 mpr_print_field(sc, "PhyInfo Reason: %s (0x%x)\n",
479 mpr_describe_table(mpr_phyinfo_reason_names,
480 (buf->PhyInfo >> 16) & 0xf), buf->PhyInfo);
481 mpr_print_field(sc, "AttachedDeviceInfo: %pb%i,%s\n",
482 "\20" "\4SATAhost" "\5SMPinit" "\6STPinit"
483 "\7SSPinit" "\10SATAdev" "\11SMPtarg" "\12STPtarg" "\13SSPtarg"
484 "\14Direct" "\15LSIdev" "\16ATAPIdev" "\17SEPdev",
485 buf->AttachedDeviceInfo,
486 mpr_describe_table(mpr_sasdev0_devtype,
487 buf->AttachedDeviceInfo & 0x03));
488 MPR_PRINTFIELD(sc, buf, ExpanderDevHandle, 0x%04x);
489 MPR_PRINTFIELD(sc, buf, ChangeCount, %d);
490 mpr_print_field(sc, "NegotiatedLinkRate: %s (0x%x)\n",
491 mpr_describe_table(mpr_linkrate_names,
492 buf->NegotiatedLinkRate & 0xf), buf->NegotiatedLinkRate);
493 MPR_PRINTFIELD(sc, buf, PhyIdentifier, %d);
494 MPR_PRINTFIELD(sc, buf, AttachedPhyIdentifier, %d);
495 MPR_PRINTFIELD(sc, buf, DiscoveryInfo, 0x%x);
496 MPR_PRINTFIELD(sc, buf, AttachedPhyInfo, 0x%x);
497 mpr_print_field(sc, "AttachedPhyInfo Reason: %s (0x%x)\n",
498 mpr_describe_table(mpr_phyinfo_reason_names,
499 buf->AttachedPhyInfo & 0xf), buf->AttachedPhyInfo);
500 MPR_PRINTFIELD(sc, buf, ZoneGroup, %d);
501 MPR_PRINTFIELD(sc, buf, SelfConfigStatus, 0x%x);
502 }
503
504 void
mpr_print_sasphy0(struct mpr_softc * sc,MPI2_CONFIG_PAGE_SAS_PHY_0 * buf)505 mpr_print_sasphy0(struct mpr_softc *sc, MPI2_CONFIG_PAGE_SAS_PHY_0 *buf)
506 {
507 MPR_PRINTFIELD_START(sc, "SAS PHY Page 0");
508 MPR_PRINTFIELD(sc, buf, OwnerDevHandle, 0x%04x);
509 MPR_PRINTFIELD(sc, buf, AttachedDevHandle, 0x%04x);
510 MPR_PRINTFIELD(sc, buf, AttachedPhyIdentifier, %d);
511 mpr_print_field(sc, "AttachedPhyInfo Reason: %s (0x%x)\n",
512 mpr_describe_table(mpr_phyinfo_reason_names,
513 buf->AttachedPhyInfo & 0xf), buf->AttachedPhyInfo);
514 mpr_print_field(sc, "ProgrammedLinkRate: %s (0x%x)\n",
515 mpr_describe_table(mpr_linkrate_names,
516 (buf->ProgrammedLinkRate >> 4) & 0xf), buf->ProgrammedLinkRate);
517 mpr_print_field(sc, "HwLinkRate: %s (0x%x)\n",
518 mpr_describe_table(mpr_linkrate_names,
519 (buf->HwLinkRate >> 4) & 0xf), buf->HwLinkRate);
520 MPR_PRINTFIELD(sc, buf, ChangeCount, %d);
521 MPR_PRINTFIELD(sc, buf, Flags, 0x%x);
522 mpr_print_field(sc, "PhyInfo Reason: %s (0x%x)\n",
523 mpr_describe_table(mpr_phyinfo_reason_names,
524 (buf->PhyInfo >> 16) & 0xf), buf->PhyInfo);
525 mpr_print_field(sc, "NegotiatedLinkRate: %s (0x%x)\n",
526 mpr_describe_table(mpr_linkrate_names,
527 buf->NegotiatedLinkRate & 0xf), buf->NegotiatedLinkRate);
528 }
529
530 void
mpr_print_sgl(struct mpr_softc * sc,struct mpr_command * cm,int offset)531 mpr_print_sgl(struct mpr_softc *sc, struct mpr_command *cm, int offset)
532 {
533 MPI2_IEEE_SGE_SIMPLE64 *ieee_sge;
534 MPI25_IEEE_SGE_CHAIN64 *ieee_sgc;
535 MPI2_SGE_SIMPLE64 *sge;
536 MPI2_REQUEST_HEADER *req;
537 struct mpr_chain *chain = NULL;
538 char *frame;
539 u_int i = 0, flags, length;
540
541 req = (MPI2_REQUEST_HEADER *)cm->cm_req;
542 frame = (char *)cm->cm_req;
543 ieee_sge = (MPI2_IEEE_SGE_SIMPLE64 *)&frame[offset * 4];
544 sge = (MPI2_SGE_SIMPLE64 *)&frame[offset * 4];
545 kprintf("SGL for command %p\n", cm);
546
547 hexdump(frame, 128, NULL, 0);
548 while ((frame != NULL) && (!(cm->cm_flags & MPR_CM_FLAGS_SGE_SIMPLE))) {
549 flags = ieee_sge->Flags;
550 length = le32toh(ieee_sge->Length);
551 kprintf("IEEE seg%d flags=0x%02x len=0x%08x addr=0x%016jx\n", i,
552 flags, length, mpr_to_u64(&ieee_sge->Address));
553 if (flags & MPI25_IEEE_SGE_FLAGS_END_OF_LIST)
554 break;
555 ieee_sge++;
556 i++;
557 if (flags & MPI2_IEEE_SGE_FLAGS_CHAIN_ELEMENT) {
558 ieee_sgc = (MPI25_IEEE_SGE_CHAIN64 *)ieee_sge;
559 kprintf("IEEE chain flags=0x%x len=0x%x Offset=0x%x "
560 "Address=0x%016jx\n", ieee_sgc->Flags,
561 le32toh(ieee_sgc->Length),
562 ieee_sgc->NextChainOffset,
563 mpr_to_u64(&ieee_sgc->Address));
564 if (chain == NULL)
565 chain = TAILQ_FIRST(&cm->cm_chain_list);
566 else
567 chain = TAILQ_NEXT(chain, chain_link);
568 frame = (char *)chain->chain;
569 ieee_sge = (MPI2_IEEE_SGE_SIMPLE64 *)frame;
570 hexdump(frame, 128, NULL, 0);
571 }
572 }
573 while ((frame != NULL) && (cm->cm_flags & MPR_CM_FLAGS_SGE_SIMPLE)) {
574 flags = le32toh(sge->FlagsLength) >> MPI2_SGE_FLAGS_SHIFT;
575 kprintf("seg%d flags=0x%02x len=0x%06x addr=0x%016jx\n", i,
576 flags, le32toh(sge->FlagsLength) & 0xffffff,
577 mpr_to_u64(&sge->Address));
578 if (flags & (MPI2_SGE_FLAGS_END_OF_LIST |
579 MPI2_SGE_FLAGS_END_OF_BUFFER))
580 break;
581 sge++;
582 i++;
583 }
584 }
585
586 void
mpr_print_scsiio_cmd(struct mpr_softc * sc,struct mpr_command * cm)587 mpr_print_scsiio_cmd(struct mpr_softc *sc, struct mpr_command *cm)
588 {
589 MPI2_SCSI_IO_REQUEST *req;
590
591 req = (MPI2_SCSI_IO_REQUEST *)cm->cm_req;
592 mpr_print_sgl(sc, cm, req->SGLOffset0);
593 }
594
595