* firewire.c
- Don't initiate bus reset even if probe failed for some nodes to prevent infinite bus reset loop. Problem Reported by: Pierre Beyssac <pb@fasterix.frmug.org> - Protect timeout routine with splfw() for 4-stable. * sbp.c - Make sure to release devq when start request.
This commit is contained in:
parent
6b68056cd1
commit
f918ec7bac
@ -335,7 +335,7 @@ firewire_xfer_timeout(struct firewire_comm *fc)
|
||||
struct tlabel *tl;
|
||||
struct timeval tv;
|
||||
struct timeval split_timeout;
|
||||
int i;
|
||||
int i, s;
|
||||
|
||||
split_timeout.tv_sec = 6;
|
||||
split_timeout.tv_usec = 0;
|
||||
@ -343,6 +343,7 @@ firewire_xfer_timeout(struct firewire_comm *fc)
|
||||
microtime(&tv);
|
||||
timevalsub(&tv, &split_timeout);
|
||||
|
||||
s = splfw();
|
||||
for (i = 0; i < 0x40; i ++) {
|
||||
while ((tl = STAILQ_FIRST(&fc->tlabels[i])) != NULL) {
|
||||
xfer = tl->xfer;
|
||||
@ -365,6 +366,7 @@ firewire_xfer_timeout(struct firewire_comm *fc)
|
||||
}
|
||||
}
|
||||
}
|
||||
splx(s);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1641,9 +1643,11 @@ fw_attach_dev(struct firewire_comm *fc)
|
||||
if (i > 0)
|
||||
printf("fw_attach_dev: %d pending handlers called\n", i);
|
||||
if (fc->retry_count > 0) {
|
||||
printf("retry_count = %d\n", fc->retry_count);
|
||||
printf("probe failed for %d node\n", fc->retry_count);
|
||||
#if 0
|
||||
callout_reset(&fc->retry_probe_callout, hz*2,
|
||||
(void *)fc->ibr, (void *)fc);
|
||||
#endif
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -80,6 +80,8 @@
|
||||
#define SBP_ADDR2TRG(a) (((a) >> 2) & 0x3f)
|
||||
#define SBP_ADDR2LUN(a) (((a) >> 8) & 0xff)
|
||||
|
||||
#define MAX_FREEZE 10
|
||||
|
||||
#define ORB_NOTIFY (1 << 31)
|
||||
#define ORB_FMT_STD (0 << 29)
|
||||
#define ORB_FMT_VED (2 << 29)
|
||||
@ -630,36 +632,6 @@ END_DEBUG
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
static void
|
||||
sbp_release_queue(void *arg)
|
||||
{
|
||||
struct sbp_softc *sbp;
|
||||
|
||||
SBP_DEBUG(0)
|
||||
printf("sbp_release_queue\n");
|
||||
END_DEBUG
|
||||
sbp = (struct sbp_softc *)arg;
|
||||
xpt_release_simq(sbp->sim, 1);
|
||||
}
|
||||
|
||||
static void
|
||||
sbp_release_devq(void *arg)
|
||||
{
|
||||
struct sbp_dev *sdev;
|
||||
int s;
|
||||
|
||||
sdev = (struct sbp_dev *)arg;
|
||||
SBP_DEBUG(0)
|
||||
sbp_show_sdev_info(sdev, 2);
|
||||
printf("sbp_release_devq\n");
|
||||
END_DEBUG
|
||||
s = splcam();
|
||||
xpt_release_devq(sdev->path, 1, TRUE);
|
||||
splx(s);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void
|
||||
sbp_post_explore(void *arg)
|
||||
{
|
||||
@ -803,9 +775,10 @@ END_DEBUG
|
||||
ccb->ccb_h.cbfcnp = sbp_cam_callback;
|
||||
ccb->crcn.flags = CAM_FLAG_NONE;
|
||||
ccb->ccb_h.ccb_sdev_ptr = sdev;
|
||||
xpt_action(ccb);
|
||||
|
||||
/* The scan is in progress now. */
|
||||
sdev->status = SBP_DEV_PROBE;
|
||||
xpt_action(ccb);
|
||||
}
|
||||
|
||||
|
||||
@ -828,13 +801,13 @@ END_DEBUG
|
||||
} else {
|
||||
/* requeue */
|
||||
xpt_action(ccb);
|
||||
xpt_release_devq(sdev->path, 1, TRUE);
|
||||
xpt_release_devq(sdev->path, MAX_FREEZE, TRUE);
|
||||
}
|
||||
} else {
|
||||
free(ccb->csio.data_ptr, M_SBP);
|
||||
free(ccb, M_SBP);
|
||||
sdev->status = SBP_DEV_ATTACHED;
|
||||
xpt_release_devq(sdev->path, 1, TRUE);
|
||||
xpt_release_devq(sdev->path, MAX_FREEZE, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
@ -892,10 +865,7 @@ END_DEBUG
|
||||
);
|
||||
ccb->ccb_h.flags |= CAM_DEV_QFREEZE;
|
||||
xpt_action(ccb);
|
||||
|
||||
if (sdev->status == SBP_DEV_RETRY)
|
||||
/* freezed twice */
|
||||
xpt_release_devq(sdev->path, 1, TRUE);
|
||||
sdev->status = SBP_DEV_PROBE;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -914,14 +884,11 @@ END_DEBUG
|
||||
cam_sim_path(sdev->target->sbp->sim),
|
||||
sdev->target->target_id, sdev->lun_id);
|
||||
|
||||
if (sdev->status == SBP_DEV_RETRY) {
|
||||
if (sdev->status == SBP_DEV_RETRY)
|
||||
sbp_ping_unit(sdev);
|
||||
sdev->status = SBP_DEV_PROBE;
|
||||
} else {
|
||||
sdev->status = SBP_DEV_PROBE;
|
||||
else
|
||||
sbp_cam_scan_lun(sdev);
|
||||
}
|
||||
xpt_release_devq(sdev->path, 1, TRUE);
|
||||
xpt_release_devq(sdev->path, MAX_FREEZE, TRUE);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -938,7 +905,7 @@ END_DEBUG
|
||||
fw_xfer_free(xfer);
|
||||
sbp_abort_all_ocbs(sdev, CAM_REQUEUE_REQ);
|
||||
if (sdev->path)
|
||||
xpt_release_devq(sdev->path, 1, TRUE);
|
||||
xpt_release_devq(sdev->path, MAX_FREEZE, TRUE);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1527,8 +1494,8 @@ printf("reconnect: len %d, ID %d, cmd %08x%08x\n", login_res->len, login_res->id
|
||||
END_DEBUG
|
||||
#if 1
|
||||
sbp_ping_unit(sdev);
|
||||
sdev->status = SBP_DEV_ATTACHED;
|
||||
xpt_release_devq(sdev->path, 1, TRUE);
|
||||
xpt_release_devq(sdev->path,
|
||||
MAX_FREEZE, TRUE);
|
||||
#else
|
||||
sdev->status = SBP_DEV_ATTACHED;
|
||||
sbp_mgm_orb(sdev, ORB_FUN_ATS, 0, 0);
|
||||
|
Loading…
Reference in New Issue
Block a user