Date: Wed, 11 Feb 2009 20:48:02 -0800 From: Sean Bruno <sean.bruno@dsl-only.net> To: freebsd-firewire@FreeBSD.org Cc: scottl@freebsd.org Subject: Final patch for -current Message-ID: <1234414082.30696.185.camel@localhost.localdomain>
next in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
Allrighty, this patch wraps up my -current work and should establish a
nice baseline for my debugging of problems.
Introduce struct sbp_dev.bustgtlun to replace the overloaded
show_sdev_info() in most places. This is an optimization of the debug
case fortunately. Stash the BB:TT:LL string here for later
device_printf() goodness.
More debugging cleanup printf()-->device_printf()
Explicity set the callout sdev->login_callout to acquire the sbp mtx.
Rename sbp_alloc_target() variable i to new_target_id. Clarity is good,
even in temporary variables.
Cleanup and document the sbp_login() function. This function is a bit
hairy, so document what it's supposed to do.
Add some locking in sbp_probe_target()
Assert the sbp mtx in sbp_write_cmd_locked()
Avoid LoR in sbp_mgm_orb() and assert sbp mtx locked.
Acquire sbp mtx before sbp_mgm_orb() is invoked.
Sean
[-- Attachment #2 --]
Index: sbp.c
===================================================================
--- sbp.c (revision 188508)
+++ sbp.c (working copy)
@@ -31,7 +31,7 @@
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
- * $FreeBSD$
+ * $FreeBSD: head/sys/dev/firewire/sbp.c 187993 2009-02-01 23:28:52Z sbruno $
*
*/
@@ -218,6 +218,7 @@
char vendor[32];
char product[32];
char revision[10];
+ char bustgtlun[32];
};
struct sbp_target {
@@ -331,7 +332,7 @@
sbp_identify(driver_t *driver, device_t parent)
{
SBP_DEBUG(0)
- printf("sbp_identify\n");
+ printf("%s\n", __func__);
END_DEBUG
BUS_ADD_CHILD(parent, 0, "sbp", device_get_unit(parent));
@@ -346,7 +347,7 @@
device_t pa;
SBP_DEBUG(0)
- printf("sbp_probe\n");
+ printf("%s\n", __func__);
END_DEBUG
pa = device_get_parent(dev);
@@ -364,36 +365,35 @@
return (0);
}
+/*
+ * Display device characteristics on the console
+ */
static void
-sbp_show_sdev_info(struct sbp_dev *sdev, int new)
+sbp_show_sdev_info(struct sbp_dev *sdev)
{
struct fw_device *fwdev;
- printf("%s:%d:%d ",
- device_get_nameunit(sdev->target->sbp->fd.dev),
- sdev->target->target_id,
- sdev->lun_id
- );
- if (new == 2) {
- return;
- }
fwdev = sdev->target->fwdev;
- printf("ordered:%d type:%d EUI:%08x%08x node:%d "
- "speed:%d maxrec:%d",
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s: %s: ordered:%d type:%d EUI:%08x%08x node:%d "
+ "speed:%d maxrec:%d\n",
+ __func__,
+ sdev->bustgtlun,
(sdev->type & 0x40) >> 6,
(sdev->type & 0x1f),
fwdev->eui.hi,
fwdev->eui.lo,
fwdev->dst,
fwdev->speed,
- fwdev->maxrec
- );
- if (new)
- printf(" new!\n");
- else
- printf("\n");
- sbp_show_sdev_info(sdev, 2);
- printf("'%s' '%s' '%s'\n", sdev->vendor, sdev->product, sdev->revision);
+ fwdev->maxrec);
+
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s:%s '%s' '%s' '%s'\n",
+ __func__,
+ sdev->bustgtlun,
+ sdev->vendor,
+ sdev->product,
+ sdev->revision);
}
static struct {
@@ -467,14 +467,16 @@
break;
lun = reg->val & 0xffff;
SBP_DEBUG(0)
- printf("target %d lun %d found\n", target->target_id, lun);
+ device_printf(sbp->fd.dev, "%s: target %d lun %d found\n",
+ __func__, target->target_id, lun);
END_DEBUG
if (maxlun < lun)
maxlun = lun;
crom_next(&cc);
}
if (maxlun < 0)
- printf("%s:%d no LUN found\n",
+ device_printf(sbp->fd.dev, "%s: %s:%d no LUN found\n",
+ __func__,
device_get_nameunit(target->sbp->fd.dev),
target->target_id);
@@ -503,7 +505,7 @@
M_SBP, M_NOWAIT | M_ZERO);
if (newluns == NULL) {
- printf("%s: realloc failed\n", __func__);
+ device_printf(sbp->fd.dev, "%s: realloc failed\n", __func__);
newluns = target->luns;
maxlun = target->num_lun;
}
@@ -530,7 +532,8 @@
break;
lun = reg->val & 0xffff;
if (lun >= SBP_NUM_LUNS) {
- printf("too large lun %d\n", lun);
+ device_printf(sbp->fd.dev, "%s: too large lun %d\n",
+ __func__, lun);
goto next;
}
@@ -539,16 +542,23 @@
sdev = malloc(sizeof(struct sbp_dev),
M_SBP, M_NOWAIT | M_ZERO);
if (sdev == NULL) {
- printf("%s: malloc failed\n", __func__);
+ device_printf(sbp->fd.dev, "%s: malloc failed\n", __func__);
goto next;
}
target->luns[lun] = sdev;
sdev->lun_id = lun;
sdev->target = target;
STAILQ_INIT(&sdev->ocbs);
- CALLOUT_INIT(&sdev->login_callout);
+ callout_init_mtx(&sdev->login_callout,
+ &sdev->target->sbp->mtx,
+ 0);
sdev->status = SBP_DEV_RESET;
new = 1;
+ snprintf(sdev->bustgtlun, 32, "%s:%d:%d",
+ device_get_nameunit(sdev->target->sbp->fd.dev),
+ sdev->target->target_id,
+ sdev->lun_id);
+
}
sdev->flags |= VALID_LUN;
sdev->type = (reg->val & 0xff0000) >> 16;
@@ -560,8 +570,8 @@
/* alignment */ sizeof(uint32_t),
SBP_DMA_SIZE, &sdev->dma, BUS_DMA_NOWAIT);
if (sdev->dma.v_addr == NULL) {
- printf("%s: dma space allocation failed\n",
- __func__);
+ device_printf(sbp->fd.dev, "%s: dma space allocation failed\n",
+ __func__);
free(sdev, M_SBP);
target->luns[lun] = NULL;
goto next;
@@ -581,7 +591,8 @@
+ sizeof(struct sbp_ocb) * i
+ offsetof(struct sbp_ocb, orb[0]);
if (bus_dmamap_create(sbp->dmat, 0, &ocb->dmamap)) {
- printf("sbp_attach: cannot create dmamap\n");
+ device_printf(sbp->fd.dev, "%s: cannot create dmamap\n",
+ __func__);
/* XXX */
goto next;
}
@@ -604,30 +615,32 @@
static struct sbp_target *
sbp_alloc_target(struct sbp_softc *sbp, struct fw_device *fwdev)
{
- int i;
+ int new_target_id;
struct sbp_target *target;
struct crom_context cc;
struct csrreg *reg;
SBP_DEBUG(1)
- printf("sbp_alloc_target\n");
+ device_printf(sbp->fd.dev, "%s: begin\n", __func__);
END_DEBUG
- i = sbp_new_target(sbp, fwdev);
- if (i < 0) {
- device_printf(sbp->fd.dev, "increase SBP_NUM_TARGETS!\n");
+ new_target_id = sbp_new_target(sbp, fwdev);
+ if (new_target_id < 0) {
+ device_printf(sbp->fd.dev, "%s: new_target_id(%d), increase SBP_NUM_TARGETS!\n",
+ __func__, new_target_id);
return NULL;
}
/* new target */
- target = &sbp->targets[i];
+ target = &sbp->targets[new_target_id];
target->sbp = sbp;
target->fwdev = fwdev;
- target->target_id = i;
+ target->target_id = new_target_id;
/* XXX we may want to reload mgm port after each bus reset */
/* XXX there might be multiple management agents */
crom_init_context(&cc, target->fwdev->csrrom);
reg = crom_search_key(&cc, CROM_MGM);
if (reg == NULL || reg->val == 0) {
- printf("NULL management address\n");
+ device_printf(sbp->fd.dev, "%s: NULL management address\n",
+ __func__);
target->fwdev = NULL;
return NULL;
}
@@ -635,12 +648,16 @@
target->mgm_lo = 0xf0000000 | (reg->val << 2);
target->mgm_ocb_cur = NULL;
SBP_DEBUG(1)
- printf("target:%d mgm_port: %x\n", i, target->mgm_lo);
+ device_printf(sbp->fd.dev, "%s: target:%d mgm_port: %x\n",
+ __func__,
+ target->target_id, target->mgm_lo);
END_DEBUG
STAILQ_INIT(&target->xferlist);
target->n_xfer = 0;
STAILQ_INIT(&target->mgm_ocb_queue);
- CALLOUT_INIT(&target->mgm_ocb_timeout);
+ callout_init_mtx(&target->mgm_ocb_timeout,
+ &sbp->mtx,
+ 0);
CALLOUT_INIT(&target->scan_callout);
target->luns = NULL;
@@ -685,29 +702,50 @@
sbp_login_callout(void *arg)
{
struct sbp_dev *sdev = (struct sbp_dev *)arg;
+
+ mtx_assert(&sdev->target->sbp->mtx, MA_OWNED);
sbp_mgm_orb(sdev, ORB_FUN_LGI, NULL);
}
+/*
+ * Login to the SBP capable device
+ * after the sysctl controlled login_delay
+ * variable. If the last bus reset occured
+ * more than login_delay ms in the past
+ * set ticks to 0 and setup the handler
+ */
static void
sbp_login(struct sbp_dev *sdev)
{
struct timeval delta;
- struct timeval t;
- int ticks = 0;
+ struct timeval tv_login_delay;
+ int ticks;
+ SBP_LOCK(sdev->target->sbp);
+
microtime(&delta);
timevalsub(&delta, &sdev->target->sbp->last_busreset);
- t.tv_sec = login_delay / 1000;
- t.tv_usec = (login_delay % 1000) * 1000;
- timevalsub(&t, &delta);
- if (t.tv_sec >= 0 && t.tv_usec > 0)
- ticks = (t.tv_sec * 1000 + t.tv_usec / 1000) * hz / 1000;
+ tv_login_delay.tv_sec = login_delay / 1000;
+ tv_login_delay.tv_usec = (login_delay % 1000) * 1000;
+ timevalsub(&tv_login_delay, &delta);
+ if (tv_login_delay.tv_sec >= 0 && tv_login_delay.tv_usec > 0) {
+ ticks = (tv_login_delay.tv_sec * 1000 + tv_login_delay.tv_usec / 1000) * hz / 1000;
+ } else {
+ ticks = 0;
+ }
SBP_DEBUG(0)
- printf("%s: sec = %jd usec = %ld ticks = %d\n", __func__,
- (intmax_t)t.tv_sec, t.tv_usec, ticks);
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s: sec = %d, usec = %ld, ticks = %d\n",
+ __func__, tv_login_delay.tv_sec, tv_login_delay.tv_usec, ticks);
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s: tv_login_delay(%d), "
+ "delta(%d), last_busreset(%d)\n",
+ __func__, tvtohz(&tv_login_delay),
+ tvtohz(&delta), tvtohz(&sdev->target->sbp->last_busreset));
END_DEBUG
callout_reset(&sdev->login_callout, ticks,
sbp_login_callout, (void *)(sdev));
+ SBP_UNLOCK(sdev->target->sbp);
}
#define SBP_FWDEV_ALIVE(fwdev) (((fwdev)->status == FWDEVATTACHED) \
@@ -717,20 +755,17 @@
sbp_probe_target(void *arg)
{
struct sbp_target *target = (struct sbp_target *)arg;
- struct sbp_softc *sbp;
+ struct sbp_softc *sbp = target->sbp;
struct sbp_dev *sdev;
- struct firewire_comm *fc;
int i, alive;
alive = SBP_FWDEV_ALIVE(target->fwdev);
SBP_DEBUG(1)
- printf("sbp_probe_target %d\n", target->target_id);
- if (!alive)
- printf("not alive\n");
+ device_printf(sbp->fd.dev, "%s %d%salive\n",
+ __func__, target->target_id,
+ (!alive) ? " not " : "");
END_DEBUG
- sbp = target->sbp;
- fc = target->sbp->fd.fc;
sbp_alloc_lun(target);
/* XXX untimeout mgm_ocb and dequeue */
@@ -747,8 +782,9 @@
}
sbp_probe_lun(sdev);
SBP_DEBUG(0)
- sbp_show_sdev_info(sdev,
- (sdev->status == SBP_DEV_RESET));
+ SBP_LOCK(sbp);
+ sbp_show_sdev_info(sdev);
+ SBP_UNLOCK(sbp);
END_DEBUG
sbp_abort_all_ocbs(sdev, CAM_SCSI_BUS_RESET);
@@ -763,7 +799,9 @@
case SBP_DEV_ATTACHED:
case SBP_DEV_RETRY:
default:
+ SBP_LOCK(sbp);
sbp_mgm_orb(sdev, ORB_FUN_RCN, NULL);
+ SBP_UNLOCK(sbp);
break;
}
} else {
@@ -771,8 +809,8 @@
case SBP_DEV_ATTACHED:
SBP_DEBUG(0)
/* the device has gone */
- sbp_show_sdev_info(sdev, 2);
- printf("lost target\n");
+ device_printf(sbp->fd.dev, "%s: lost target\n",
+ __func__);
END_DEBUG
if (sdev->path) {
SBP_LOCK(sbp);
@@ -805,7 +843,7 @@
sbp = (struct sbp_softc *)arg;
SBP_DEBUG(0)
- printf("sbp_post_busreset\n");
+ device_printf(sbp->fd.dev,"%s\n", __func__);
END_DEBUG
if ((sbp->sim->flags & SIMQ_FREEZED) == 0) {
SBP_LOCK(sbp);
@@ -825,7 +863,8 @@
int i, alive;
SBP_DEBUG(0)
- printf("sbp_post_explore (sbp_cold=%d)\n", sbp_cold);
+ device_printf(sbp->fd.dev, "%s: (sbp_cold=%d)\n",
+ __func__, sbp_cold);
END_DEBUG
/* We need physical access */
if (!firewire_phydma_enable)
@@ -857,12 +896,10 @@
/* traverse device list */
STAILQ_FOREACH(fwdev, &sbp->fd.fc->devices, link) {
SBP_DEBUG(0)
- printf("sbp_post_explore: EUI:%08x%08x ",
- fwdev->eui.hi, fwdev->eui.lo);
- if (fwdev->status != FWDEVATTACHED)
- printf("not attached, state=%d.\n", fwdev->status);
- else
- printf("attached\n");
+ device_printf(sbp->fd.dev,"%s:: EUI:%08x%08x %s attached, state=%d\n",
+ __func__, fwdev->eui.hi, fwdev->eui.lo,
+ (fwdev->status != FWDEVATTACHED) ? "not" : "",
+ fwdev->status);
END_DEBUG
alive = SBP_FWDEV_ALIVE(fwdev);
for(i = 0 ; i < SBP_NUM_TARGETS ; i ++){
@@ -899,8 +936,7 @@
struct sbp_dev *sdev;
sdev = (struct sbp_dev *)xfer->sc;
SBP_DEBUG(1)
- sbp_show_sdev_info(sdev, 2);
- printf("sbp_loginres_callback\n");
+ device_printf(sdev->target->sbp->fd.dev,"%s\n", __func__);
END_DEBUG
/* recycle */
s = splfw();
@@ -933,8 +969,8 @@
int i;
if (xfer->resp != 0) {
- sbp_show_sdev_info(sdev, 2);
- printf("sbp_reset_start failed: resp=%d\n", xfer->resp);
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s: %s failed: resp=%d\n", __func__, sdev->bustgtlun, xfer->resp);
}
for (i = 0; i < target->num_lun; i++) {
@@ -951,8 +987,8 @@
struct fw_pkt *fp;
SBP_DEBUG(0)
- sbp_show_sdev_info(sdev, 2);
- printf("sbp_reset_start\n");
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s:%s\n", __func__,sdev->bustgtlun);
END_DEBUG
xfer = sbp_write_cmd(sdev, FWTCODE_WREQQ, 0);
@@ -973,18 +1009,11 @@
sdev = (struct sbp_dev *)xfer->sc;
SBP_DEBUG(1)
- sbp_show_sdev_info(sdev, 2);
- printf("sbp_mgm_callback\n");
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s:%s\n", __func__, sdev->bustgtlun);
END_DEBUG
resp = xfer->resp;
sbp_xfer_free(xfer);
-#if 0
- if (resp != 0) {
- sbp_show_sdev_info(sdev, 2);
- printf("management ORB failed(%d) ... RESET_START\n", resp);
- sbp_reset_start(sdev);
- }
-#endif
return;
}
@@ -1011,14 +1040,14 @@
sdev = (struct sbp_dev *) ccb->ccb_h.ccb_sdev_ptr;
target = sdev->target;
SBP_DEBUG(0)
- sbp_show_sdev_info(sdev, 2);
- printf("sbp_cam_scan_lun\n");
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s:%s\n", __func__, sdev->bustgtlun);
END_DEBUG
if ((ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) {
sdev->status = SBP_DEV_ATTACHED;
} else {
- sbp_show_sdev_info(sdev, 2);
- printf("scan failed\n");
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s:%s failed\n", __func__, sdev->bustgtlun);
}
sdev = sbp_next_dev(target, sdev->lun_id + 1);
if (sdev == NULL) {
@@ -1047,8 +1076,8 @@
return;
}
SBP_DEBUG(0)
- sbp_show_sdev_info(sdev, 2);
- printf("sbp_cam_scan_target\n");
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s:%s\n", __func__, sdev->bustgtlun);
END_DEBUG
ccb = malloc(sizeof(union ccb), M_SBP, M_NOWAIT | M_ZERO);
if (ccb == NULL) {
@@ -1089,8 +1118,8 @@
target = sdev->target;
sbp = target->sbp;
SBP_DEBUG(0)
- sbp_show_sdev_info(sdev, 2);
- printf("sbp_do_attach\n");
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s:%s\n", __func__, sdev->bustgtlun);
END_DEBUG
sbp_xfer_free(xfer);
@@ -1120,12 +1149,12 @@
sdev = (struct sbp_dev *)xfer->sc;
SBP_DEBUG(1)
- sbp_show_sdev_info(sdev, 2);
- printf("%s\n", __func__);
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s:%s\n", __func__, sdev->bustgtlun);
END_DEBUG
if (xfer->resp != 0) {
- sbp_show_sdev_info(sdev, 2);
- printf("%s: resp=%d\n", __func__, xfer->resp);
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s:%s resp=%d\n", __func__, sdev->bustgtlun, xfer->resp);
}
sbp_xfer_free(xfer);
@@ -1144,8 +1173,8 @@
struct fw_pkt *fp;
SBP_DEBUG(0)
- sbp_show_sdev_info(sdev, 2);
- printf("sbp_agent_reset\n");
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s:%s\n", __func__, sdev->bustgtlun);
END_DEBUG
xfer = sbp_write_cmd(sdev, FWTCODE_WREQQ, 0x04);
if (xfer == NULL)
@@ -1167,8 +1196,8 @@
sdev = (struct sbp_dev *)xfer->sc;
SBP_DEBUG(1)
- sbp_show_sdev_info(sdev, 2);
- printf("sbp_busy_timeout_callback\n");
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s:%s\n", __func__, sdev->bustgtlun);
END_DEBUG
sbp_xfer_free(xfer);
sbp_agent_reset(sdev);
@@ -1180,8 +1209,8 @@
struct fw_pkt *fp;
struct fw_xfer *xfer;
SBP_DEBUG(0)
- sbp_show_sdev_info(sdev, 2);
- printf("sbp_busy_timeout\n");
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s:%s\n", __func__, sdev->bustgtlun);
END_DEBUG
xfer = sbp_write_cmd(sdev, FWTCODE_WREQQ, 0);
@@ -1200,8 +1229,8 @@
sdev = (struct sbp_dev *)xfer->sc;
SBP_DEBUG(2)
- sbp_show_sdev_info(sdev, 2);
- printf("%s\n", __func__);
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s:%s\n", __func__, sdev->bustgtlun);
END_DEBUG
if (xfer->resp != 0) {
/* XXX */
@@ -1230,8 +1259,10 @@
struct fw_xfer *xfer;
struct fw_pkt *fp;
SBP_DEBUG(1)
- sbp_show_sdev_info(sdev, 2);
- printf("%s: 0x%08x\n", __func__, (uint32_t)ocb->bus_addr);
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s:%s 0x%08x\n",
+ __func__, sdev->bustgtlun,
+ (uint32_t)ocb->bus_addr);
END_DEBUG
mtx_assert(&sdev->target->sbp->mtx, MA_OWNED);
@@ -1278,12 +1309,13 @@
sdev = (struct sbp_dev *)xfer->sc;
SBP_DEBUG(1)
- sbp_show_sdev_info(sdev, 2);
- printf("sbp_doorbell_callback\n");
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s:%s\n", __func__, sdev->bustgtlun);
END_DEBUG
if (xfer->resp != 0) {
/* XXX */
- printf("%s: xfer->resp = %d\n", __func__, xfer->resp);
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s: xfer->resp = %d\n", __func__, xfer->resp);
}
sbp_xfer_free(xfer);
sdev->flags &= ~ORB_DOORBELL_ACTIVE;
@@ -1302,8 +1334,8 @@
struct fw_xfer *xfer;
struct fw_pkt *fp;
SBP_DEBUG(1)
- sbp_show_sdev_info(sdev, 2);
- printf("sbp_doorbell\n");
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s:%s\n", __func__, sdev->bustgtlun);
END_DEBUG
if ((sdev->flags & ORB_DOORBELL_ACTIVE) != 0) {
@@ -1335,19 +1367,25 @@
xfer = STAILQ_FIRST(&target->xferlist);
if (xfer == NULL) {
if (target->n_xfer > 5 /* XXX */) {
- printf("sbp: no more xfer for this target\n");
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s: no more xfer for this target\n",
+ __func__);
splx(s);
return(NULL);
}
xfer = fw_xfer_alloc_buf(M_SBP, 8, 0);
if(xfer == NULL){
- printf("sbp: fw_xfer_alloc_buf failed\n");
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s: fw_xfer_alloc_buf failed\n",
+ __func__);
splx(s);
return NULL;
}
target->n_xfer ++;
if (debug)
- printf("sbp: alloc %d xfer\n", target->n_xfer);
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s: alloc %d xfer\n",
+ __func__, target->n_xfer);
new = 1;
} else {
STAILQ_REMOVE_HEAD(&target->xferlist, link);
@@ -1398,31 +1436,24 @@
struct fw_pkt *fp;
struct sbp_ocb *ocb;
struct sbp_target *target;
- int s, nid;
+ int nid;
+ mtx_assert(&sdev->target->sbp->mtx, MA_OWNED);
target = sdev->target;
nid = target->sbp->fd.fc->nodeid | FWLOCALBUS;
- s = splfw();
- SBP_LOCK(target->sbp);
if (func == ORB_FUN_RUNQUEUE) {
ocb = STAILQ_FIRST(&target->mgm_ocb_queue);
if (target->mgm_ocb_cur != NULL || ocb == NULL) {
- SBP_UNLOCK(target->sbp);
- splx(s);
return;
}
STAILQ_REMOVE_HEAD(&target->mgm_ocb_queue, ocb);
- SBP_UNLOCK(target->sbp);
goto start;
}
if ((ocb = sbp_get_ocb(sdev)) == NULL) {
- SBP_UNLOCK(target->sbp);
- splx(s);
/* XXX */
return;
}
- SBP_UNLOCK(target->sbp);
ocb->flags = OCB_ACT_MGM;
ocb->sdev = sdev;
@@ -1431,8 +1462,10 @@
ocb->orb[7] = htonl(SBP_DEV2ADDR(target->target_id, sdev->lun_id));
SBP_DEBUG(0)
- sbp_show_sdev_info(sdev, 2);
- printf("%s\n", orb_fun_name[(func>>16)&0xf]);
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s:%s %s\n",
+ __func__,sdev->bustgtlun,
+ orb_fun_name[(func>>16)&0xf]);
END_DEBUG
switch (func) {
case ORB_FUN_LGI:
@@ -1460,19 +1493,16 @@
if (target->mgm_ocb_cur != NULL) {
/* there is a standing ORB */
- SBP_LOCK(target->sbp);
STAILQ_INSERT_TAIL(&sdev->target->mgm_ocb_queue, ocb, ocb);
- SBP_UNLOCK(target->sbp);
- splx(s);
return;
}
start:
target->mgm_ocb_cur = ocb;
- splx(s);
callout_reset(&target->mgm_ocb_timeout, 5*hz,
sbp_mgm_timeout, (caddr_t)ocb);
- xfer = sbp_write_cmd(sdev, FWTCODE_WREQB, 0);
+
+ xfer = sbp_write_cmd_locked(sdev, FWTCODE_WREQB, 0);
if(xfer == NULL){
return;
}
@@ -1485,12 +1515,10 @@
fp->mode.wreqb.extcode = 0;
xfer->send.payload[0] = htonl(nid << 16);
xfer->send.payload[1] = htonl(ocb->bus_addr & 0xffffffff);
-SBP_DEBUG(0)
- sbp_show_sdev_info(sdev, 2);
- printf("mgm orb: %08x\n", (uint32_t)ocb->bus_addr);
-END_DEBUG
+ SBP_UNLOCK(sdev->target->sbp);
fw_asyreq(xfer->fc, -1, xfer);
+ SBP_LOCK(sdev->target->sbp);
}
static void
@@ -1532,8 +1560,8 @@
SBP_DEBUG(0)
sbp_print_scsi_cmd(ocb);
/* XXX need decode status */
- sbp_show_sdev_info(ocb->sdev, 2);
- printf("SCSI status %x sfmt %x valid %x key %x code %x qlfr %x len %d\n",
+ printf("%s: SCSI status %x sfmt %x valid %x key %x code %x qlfr %x len %d\n",
+ ocb->sdev->bustgtlun,
sbp_cmd_status->status,
sbp_cmd_status->sfmt,
sbp_cmd_status->valid,
@@ -1601,9 +1629,10 @@
*/
break;
default:
- sbp_show_sdev_info(ocb->sdev, 2);
- printf("sbp_scsi_status: unknown scsi status 0x%x\n",
- sbp_cmd_status->status);
+ device_printf(ocb->sdev->target->sbp->fd.dev,
+ "%s:%s unknown scsi status 0x%x\n",
+ __func__, ocb->sdev->bustgtlun,
+ sbp_cmd_status->status);
}
}
@@ -1620,8 +1649,8 @@
if (ccb->csio.cdb_io.cdb_bytes[1] & SI_EVPD)
return;
SBP_DEBUG(1)
- sbp_show_sdev_info(sdev, 2);
- printf("sbp_fix_inq_data\n");
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s:%s\n", __func__, sdev->bustgtlun);
END_DEBUG
inq = (struct scsi_inquiry_data *) ccb->csio.data_ptr;
switch (SID_TYPE(inq)) {
@@ -1723,30 +1752,35 @@
ocb = target->mgm_ocb_cur;
if (ocb != NULL) {
if (OCB_MATCH(ocb, sbp_status)) {
+ SBP_LOCK(sdev->target->sbp);
callout_stop(&target->mgm_ocb_timeout);
+ SBP_UNLOCK(sdev->target->sbp);
target->mgm_ocb_cur = NULL;
break;
}
}
ocb = sbp_dequeue_ocb(sdev, sbp_status);
if (ocb == NULL) {
- sbp_show_sdev_info(sdev, 2);
+ device_printf(sdev->target->sbp->fd.dev,
#if defined(__DragonFly__) || __FreeBSD_version < 500000
- printf("No ocb(%lx) on the queue\n",
+ "%s:%s No ocb(%lx) on the queue\n",
#else
- printf("No ocb(%x) on the queue\n",
+ "%s:%s No ocb(%x) on the queue\n",
#endif
- ntohl(sbp_status->orb_lo));
+ __func__,sdev->bustgtlun,
+ ntohl(sbp_status->orb_lo));
}
break;
case 2:
/* unsolicit */
- sbp_show_sdev_info(sdev, 2);
- printf("unsolicit status received\n");
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s:%s unsolicit status received\n",
+ __func__, sdev->bustgtlun);
break;
default:
- sbp_show_sdev_info(sdev, 2);
- printf("unknown sbp_status->src\n");
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s:%s unknown sbp_status->src\n",
+ __func__, sdev->bustgtlun);
}
status_valid0 = (sbp_status->src < 2
@@ -1757,18 +1791,20 @@
if (!status_valid0 || debug > 2){
int status;
SBP_DEBUG(0)
- sbp_show_sdev_info(sdev, 2);
- printf("ORB status src:%x resp:%x dead:%x"
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s:%s ORB status src:%x resp:%x dead:%x"
#if defined(__DragonFly__) || __FreeBSD_version < 500000
" len:%x stat:%x orb:%x%08lx\n",
#else
" len:%x stat:%x orb:%x%08x\n",
#endif
+ __func__, sdev->bustgtlun,
sbp_status->src, sbp_status->resp, sbp_status->dead,
sbp_status->len, sbp_status->status,
ntohs(sbp_status->orb_hi), ntohl(sbp_status->orb_lo));
END_DEBUG
- sbp_show_sdev_info(sdev, 2);
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s\n", sdev->bustgtlun);
status = sbp_status->status;
switch(sbp_status->resp) {
case 0:
@@ -1827,14 +1863,19 @@
login_res->cmd_lo = ntohl(login_res->cmd_lo);
if (status_valid) {
SBP_DEBUG(0)
-sbp_show_sdev_info(sdev, 2);
-printf("login: len %d, ID %d, cmd %08x%08x, recon_hold %d\n", login_res->len, login_res->id, login_res->cmd_hi, login_res->cmd_lo, ntohs(login_res->recon_hold));
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s:%s login: len %d, ID %d, cmd %08x%08x, recon_hold %d\n",
+ __func__, sdev->bustgtlun,
+ login_res->len, login_res->id,
+ login_res->cmd_hi, login_res->cmd_lo,
+ ntohs(login_res->recon_hold));
END_DEBUG
sbp_busy_timeout(sdev);
} else {
/* forgot logout? */
- sbp_show_sdev_info(sdev, 2);
- printf("login failed\n");
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s:%s login failed\n",
+ __func__, sdev->bustgtlun);
sdev->status = SBP_DEV_RESET;
}
break;
@@ -1842,23 +1883,22 @@
login_res = sdev->login;
if (status_valid) {
SBP_DEBUG(0)
-sbp_show_sdev_info(sdev, 2);
-printf("reconnect: len %d, ID %d, cmd %08x%08x\n", login_res->len, login_res->id, login_res->cmd_hi, login_res->cmd_lo);
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s:%s reconnect: len %d, ID %d, cmd %08x%08x\n",
+ __func__, sdev->bustgtlun,
+ login_res->len, login_res->id,
+ login_res->cmd_hi, login_res->cmd_lo);
END_DEBUG
-#if 1
if (sdev->status == SBP_DEV_ATTACHED)
sbp_scan_dev(sdev);
else
sbp_agent_reset(sdev);
-#else
- sdev->status = SBP_DEV_ATTACHED;
- sbp_mgm_orb(sdev, ORB_FUN_ATS, NULL);
-#endif
} else {
/* reconnection hold time exceed? */
SBP_DEBUG(0)
- sbp_show_sdev_info(sdev, 2);
- printf("reconnect failed\n");
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s:%s reconnect failed\n",
+ __func__, sdev->bustgtlun);
END_DEBUG
sbp_login(sdev);
}
@@ -1875,25 +1915,20 @@
sbp_agent_reset(sdev);
break;
default:
- sbp_show_sdev_info(sdev, 2);
- printf("unknown function %d\n", orb_fun);
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s:%s unknown function %d\n",
+ __func__, sdev->bustgtlun, orb_fun);
break;
}
+ SBP_LOCK(sbp);
sbp_mgm_orb(sdev, ORB_FUN_RUNQUEUE, NULL);
+ SBP_UNLOCK(sbp);
break;
case OCB_ACT_CMD:
sdev->timeout = 0;
if(ocb->ccb != NULL){
union ccb *ccb;
-/*
- uint32_t *ld;
- ld = ocb->ccb->csio.data_ptr;
- if(ld != NULL && ocb->ccb->csio.dxfer_len != 0)
- printf("ptr %08x %08x %08x %08x\n", ld[0], ld[1], ld[2], ld[3]);
- else
- printf("ptr NULL\n");
-printf("len %d\n", sbp_status->len);
-*/
+
ccb = ocb->ccb;
if(sbp_status->len > 1){
sbp_scsi_status(sbp_status, ocb);
@@ -2101,10 +2136,13 @@
sdev = target->luns[j];
if (sdev == NULL)
continue;
+ SBP_LOCK(sdev->target->sbp);
callout_stop(&sdev->login_callout);
- if (sdev->status >= SBP_DEV_TOATTACH &&
- sdev->status <= SBP_DEV_ATTACHED)
+ if (sdev->status >= SBP_DEV_TOATTACH &&
+ sdev->status <= SBP_DEV_ATTACHED) {
sbp_mgm_orb(sdev, ORB_FUN_LGO, NULL);
+ }
+ SBP_UNLOCK(sdev->target->sbp);
}
}
@@ -2144,8 +2182,10 @@
if (target->luns == NULL)
return;
+ sbp = target->sbp;
+ SBP_LOCK(sbp);
callout_stop(&target->mgm_ocb_timeout);
- sbp = target->sbp;
+ SBP_UNLOCK(sbp);
for (i = 0; i < target->num_lun; i++)
sbp_free_sdev(target->luns[i]);
@@ -2261,11 +2301,13 @@
}
switch(method) {
case 1:
- printf("target reset\n");
+ device_printf(sdev->target->sbp->fd.dev,"target reset\n");
+ SBP_LOCK(sdev->target->sbp);
sbp_mgm_orb(sdev, ORB_FUN_RST, NULL);
+ SBP_UNLOCK(sdev->target->sbp);
break;
case 2:
- printf("reset start\n");
+ device_printf(sdev->target->sbp->fd.dev,"reset start\n");
sbp_reset_start(sdev);
break;
}
@@ -2279,20 +2321,18 @@
struct sbp_dev *sdev = ocb->sdev;
struct sbp_target *target = sdev->target;
- sbp_show_sdev_info(sdev, 2);
- printf("request timeout(mgm orb:0x%08x) ... ",
- (uint32_t)ocb->bus_addr);
+ mtx_assert(&sdev->target->sbp->mtx, MA_OWNED);
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s:%s request timeout(mgm orb:0x%08x)\n",
+ __func__, sdev->bustgtlun, (uint32_t)ocb->bus_addr);
target->mgm_ocb_cur = NULL;
+ SBP_UNLOCK(sdev->target->sbp);
sbp_free_ocb(sdev, ocb);
-#if 0
- /* XXX */
- printf("run next request\n");
- sbp_mgm_orb(sdev, ORB_FUN_RUNQUEUE, NULL);
-#endif
-#if 1
- printf("reset start\n");
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s:%s run next request\n",
+ __func__, sdev->bustgtlun);
sbp_reset_start(sdev);
-#endif
+ SBP_LOCK(sdev->target->sbp);
}
static void
@@ -2301,9 +2341,9 @@
struct sbp_ocb *ocb = (struct sbp_ocb *)arg;
struct sbp_dev *sdev = ocb->sdev;
- sbp_show_sdev_info(sdev, 2);
- printf("request timeout(cmd orb:0x%08x) ... ",
- (uint32_t)ocb->bus_addr);
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s:%s request timeout(cmd orb:0x%08x) ... ",
+ __func__, sdev->bustgtlun, (uint32_t)ocb->bus_addr);
sdev->timeout ++;
switch(sdev->timeout) {
@@ -2760,13 +2800,13 @@
int flags;
SBP_DEBUG(1)
- sbp_show_sdev_info(sdev, 2);
+ device_printf(sdev->target->sbp->fd.dev,
#if defined(__DragonFly__) || __FreeBSD_version < 500000
- printf("%s: 0x%08lx src %d\n",
+ "%s:%s 0x%08lx src %d\n",
#else
- printf("%s: 0x%08x src %d\n",
+ "%s:%s 0x%08x src %d\n",
#endif
- __func__, ntohl(sbp_status->orb_lo), sbp_status->src);
+ __func__, sdev->bustgtlun, ntohl(sbp_status->orb_lo), sbp_status->src);
END_DEBUG
SBP_LOCK(sdev->target->sbp);
for (ocb = STAILQ_FIRST(&sdev->ocbs); ocb != NULL; ocb = next) {
@@ -2823,8 +2863,9 @@
splx(s);
SBP_DEBUG(0)
if (ocb && order > 0) {
- sbp_show_sdev_info(sdev, 2);
- printf("unordered execution order:%d\n", order);
+ device_printf(sdev->target->sbp->fd.dev,
+ "%s:%s unordered execution order:%d\n",
+ __func__, sdev->bustgtlun, order);
}
END_DEBUG
return (ocb);
@@ -2838,11 +2879,11 @@
mtx_assert(&sdev->target->sbp->mtx, MA_OWNED);
SBP_DEBUG(1)
- sbp_show_sdev_info(sdev, 2);
+ device_printf(sdev->target->sbp->fd.dev,
#if defined(__DragonFly__) || __FreeBSD_version < 500000
- printf("%s: 0x%08x\n", __func__, ocb->bus_addr);
+ "%s:%s 0x%08x\n", __func__, sdev->bustgtlun, ocb->bus_addr);
#else
- printf("%s: 0x%08jx\n", __func__, (uintmax_t)ocb->bus_addr);
+ "%s:%s 0x%08jx\n", __func__, sdev->bustgtlun, (uintmax_t)ocb->bus_addr);
#endif
END_DEBUG
prev2 = prev = STAILQ_LAST(&sdev->ocbs, sbp_ocb, ocb);
@@ -2924,11 +2965,11 @@
sdev = ocb->sdev;
SBP_DEBUG(0)
- sbp_show_sdev_info(sdev, 2);
+ device_printf(sdev->target->sbp->fd.dev,
#if defined(__DragonFly__) || __FreeBSD_version < 500000
- printf("sbp_abort_ocb 0x%x\n", ocb->bus_addr);
+ "%s:%s 0x%x\n", __func__, sdev->bustgtlun, ocb->bus_addr);
#else
- printf("sbp_abort_ocb 0x%jx\n", (uintmax_t)ocb->bus_addr);
+ "%s:%s 0x%jx\n", __func__, sdev->bustgtlun, (uintmax_t)ocb->bus_addr);
#endif
END_DEBUG
SBP_DEBUG(1)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1234414082.30696.185.camel>
