Improve debugging of xpt.
Sponsored by: Netflix
This commit is contained in:
parent
5f02f22af1
commit
69be012ff2
@ -309,6 +309,7 @@ static xpt_devicefunc_t xptsetasyncfunc;
|
||||
static xpt_busfunc_t xptsetasyncbusfunc;
|
||||
static cam_status xptregister(struct cam_periph *periph,
|
||||
void *arg);
|
||||
static const char * xpt_action_name(uint32_t action);
|
||||
static __inline int device_is_queued(struct cam_ed *device);
|
||||
|
||||
static __inline int
|
||||
@ -812,6 +813,10 @@ xpt_rescan(union ccb *ccb)
|
||||
xpt_free_ccb(ccb);
|
||||
return;
|
||||
}
|
||||
CAM_DEBUG(ccb->ccb_h.path, CAM_DEBUG_TRACE,
|
||||
("xpt_rescan: func %#x %s\n", ccb->ccb_h.func_code,
|
||||
xpt_action_name(ccb->ccb_h.func_code)));
|
||||
|
||||
ccb->ccb_h.ppriv_ptr1 = ccb->ccb_h.cbfcnp;
|
||||
ccb->ccb_h.cbfcnp = xpt_rescan_done;
|
||||
xpt_setup_ccb(&ccb->ccb_h, ccb->ccb_h.path, CAM_PRIORITY_XPT);
|
||||
@ -2451,7 +2456,8 @@ xpt_action(union ccb *start_ccb)
|
||||
{
|
||||
|
||||
CAM_DEBUG(start_ccb->ccb_h.path, CAM_DEBUG_TRACE,
|
||||
("xpt_action: func=%#x\n", start_ccb->ccb_h.func_code));
|
||||
("xpt_action: func %#x %s\n", start_ccb->ccb_h.func_code,
|
||||
xpt_action_name(start_ccb->ccb_h.func_code)));
|
||||
|
||||
start_ccb->ccb_h.status = CAM_REQ_INPROG;
|
||||
(*(start_ccb->ccb_h.path->bus->xport->action))(start_ccb);
|
||||
@ -2466,7 +2472,8 @@ xpt_action_default(union ccb *start_ccb)
|
||||
|
||||
path = start_ccb->ccb_h.path;
|
||||
CAM_DEBUG(path, CAM_DEBUG_TRACE,
|
||||
("xpt_action_default: func=%#x\n", start_ccb->ccb_h.func_code));
|
||||
("xpt_action_default: func %#x %s\n", start_ccb->ccb_h.func_code,
|
||||
xpt_action_name(start_ccb->ccb_h.func_code)));
|
||||
|
||||
switch (start_ccb->ccb_h.func_code) {
|
||||
case XPT_SCSI_IO:
|
||||
@ -3012,6 +3019,11 @@ call_sim:
|
||||
}
|
||||
break;
|
||||
}
|
||||
CAM_DEBUG(path, CAM_DEBUG_TRACE,
|
||||
("xpt_action_default: func= %#x %s status %#x\n",
|
||||
start_ccb->ccb_h.func_code,
|
||||
xpt_action_name(start_ccb->ccb_h.func_code),
|
||||
start_ccb->ccb_h.status));
|
||||
}
|
||||
|
||||
void
|
||||
@ -4234,6 +4246,12 @@ xpt_async(u_int32_t async_code, struct cam_path *path, void *async_arg)
|
||||
ccb->casync.async_code = async_code;
|
||||
ccb->casync.async_arg_size = 0;
|
||||
size = xpt_async_size(async_code);
|
||||
CAM_DEBUG(ccb->ccb_h.path, CAM_DEBUG_TRACE,
|
||||
("xpt_async: func %#x %s aync_code %d %s\n",
|
||||
ccb->ccb_h.func_code,
|
||||
xpt_action_name(ccb->ccb_h.func_code),
|
||||
async_code,
|
||||
xpt_async_string(async_code)));
|
||||
if (size > 0 && async_arg != NULL) {
|
||||
ccb->casync.async_arg_ptr = malloc(size, M_CAMXPT, M_NOWAIT);
|
||||
if (ccb->casync.async_arg_ptr == NULL) {
|
||||
@ -4441,7 +4459,11 @@ xpt_done(union ccb *done_ccb)
|
||||
struct cam_doneq *queue;
|
||||
int run, hash;
|
||||
|
||||
CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_TRACE, ("xpt_done\n"));
|
||||
CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_TRACE,
|
||||
("xpt_done: func= %#x %s status %#x\n",
|
||||
done_ccb->ccb_h.func_code,
|
||||
xpt_action_name(done_ccb->ccb_h.func_code),
|
||||
done_ccb->ccb_h.status));
|
||||
if ((done_ccb->ccb_h.func_code & XPT_FC_QUEUED) == 0)
|
||||
return;
|
||||
|
||||
@ -4463,7 +4485,8 @@ void
|
||||
xpt_done_direct(union ccb *done_ccb)
|
||||
{
|
||||
|
||||
CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_TRACE, ("xpt_done_direct\n"));
|
||||
CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_TRACE,
|
||||
("xpt_done_direct: status %#x\n", done_ccb->ccb_h.status));
|
||||
if ((done_ccb->ccb_h.func_code & XPT_FC_QUEUED) == 0)
|
||||
return;
|
||||
|
||||
@ -5050,6 +5073,9 @@ xpt_register_async(int event, ac_callback_t *cbfunc, void *cbarg,
|
||||
xpt_action((union ccb *)&csa);
|
||||
status = csa.ccb_h.status;
|
||||
|
||||
CAM_DEBUG(csa.ccb_h.path, CAM_DEBUG_TRACE,
|
||||
("xpt_register_async: func %p\n", cbfunc));
|
||||
|
||||
if (xptpath) {
|
||||
xpt_path_unlock(path);
|
||||
xpt_free_path(path);
|
||||
@ -5301,3 +5327,67 @@ camisr_runqueue(void)
|
||||
mtx_unlock(&queue->cam_doneq_mtx);
|
||||
}
|
||||
}
|
||||
|
||||
struct kv
|
||||
{
|
||||
uint32_t v;
|
||||
const char *name;
|
||||
};
|
||||
|
||||
static struct kv map[] = {
|
||||
{ XPT_NOOP, "XPT_NOOP" },
|
||||
{ XPT_SCSI_IO, "XPT_SCSI_IO" },
|
||||
{ XPT_GDEV_TYPE, "XPT_GDEV_TYPE" },
|
||||
{ XPT_GDEVLIST, "XPT_GDEVLIST" },
|
||||
{ XPT_PATH_INQ, "XPT_PATH_INQ" },
|
||||
{ XPT_REL_SIMQ, "XPT_REL_SIMQ" },
|
||||
{ XPT_SASYNC_CB, "XPT_SASYNC_CB" },
|
||||
{ XPT_SDEV_TYPE, "XPT_SDEV_TYPE" },
|
||||
{ XPT_SCAN_BUS, "XPT_SCAN_BUS" },
|
||||
{ XPT_DEV_MATCH, "XPT_DEV_MATCH" },
|
||||
{ XPT_DEBUG, "XPT_DEBUG" },
|
||||
{ XPT_PATH_STATS, "XPT_PATH_STATS" },
|
||||
{ XPT_GDEV_STATS, "XPT_GDEV_STATS" },
|
||||
{ XPT_DEV_ADVINFO, "XPT_DEV_ADVINFO" },
|
||||
{ XPT_ASYNC, "XPT_ASYNC" },
|
||||
{ XPT_ABORT, "XPT_ABORT" },
|
||||
{ XPT_RESET_BUS, "XPT_RESET_BUS" },
|
||||
{ XPT_RESET_DEV, "XPT_RESET_DEV" },
|
||||
{ XPT_TERM_IO, "XPT_TERM_IO" },
|
||||
{ XPT_SCAN_LUN, "XPT_SCAN_LUN" },
|
||||
{ XPT_GET_TRAN_SETTINGS, "XPT_GET_TRAN_SETTINGS" },
|
||||
{ XPT_SET_TRAN_SETTINGS, "XPT_SET_TRAN_SETTINGS" },
|
||||
{ XPT_CALC_GEOMETRY, "XPT_CALC_GEOMETRY" },
|
||||
{ XPT_ATA_IO, "XPT_ATA_IO" },
|
||||
{ XPT_GET_SIM_KNOB, "XPT_GET_SIM_KNOB" },
|
||||
{ XPT_SET_SIM_KNOB, "XPT_SET_SIM_KNOB" },
|
||||
{ XPT_SMP_IO, "XPT_SMP_IO" },
|
||||
{ XPT_SCAN_TGT, "XPT_SCAN_TGT" },
|
||||
{ XPT_ENG_INQ, "XPT_ENG_INQ" },
|
||||
{ XPT_ENG_EXEC, "XPT_ENG_EXEC" },
|
||||
{ XPT_EN_LUN, "XPT_EN_LUN" },
|
||||
{ XPT_TARGET_IO, "XPT_TARGET_IO" },
|
||||
{ XPT_ACCEPT_TARGET_IO, "XPT_ACCEPT_TARGET_IO" },
|
||||
{ XPT_CONT_TARGET_IO, "XPT_CONT_TARGET_IO" },
|
||||
{ XPT_IMMED_NOTIFY, "XPT_IMMED_NOTIFY" },
|
||||
{ XPT_NOTIFY_ACK, "XPT_NOTIFY_ACK" },
|
||||
{ XPT_IMMEDIATE_NOTIFY, "XPT_IMMEDIATE_NOTIFY" },
|
||||
{ XPT_NOTIFY_ACKNOWLEDGE, "XPT_NOTIFY_ACKNOWLEDGE" },
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
||||
static const char *
|
||||
xpt_action_name(uint32_t action)
|
||||
{
|
||||
static char buffer[32]; /* Only for unknown messages -- racy */
|
||||
struct kv *walker = map;
|
||||
|
||||
while (walker->name != NULL) {
|
||||
if (walker->v == action)
|
||||
return (walker->name);
|
||||
walker++;
|
||||
}
|
||||
|
||||
snprintf(buffer, sizeof(buffer), "%#x", action);
|
||||
return (buffer);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user