1
0
mirror of https://git.FreeBSD.org/src.git synced 2025-01-28 16:43:09 +00:00

cam_xpt.c:

Add quirk entry for a Samsung drive that doesn't like experiencing
	the queue full condition.

	Bump the timeouts for all probe activities to 60s.  We don't know
	what the seletion timeout (or equivelent on other mediums) is
	for controllers, which can make the transactions at the tail
	end of a parallel probe take a while to complete.  The DPT
	seems to be a card that takes a long time to see a selection timeout.

cam_periph.c:
	Don't call a device "gone" after a single selection timeout.  We
	need to come up with a better policy.  Until that time, you'll
	have to manually re-scan a bus via camcontrol for the system to
	decide that a device is really gone.  This should give devices
	experiencing temporary insanity to escape death.
This commit is contained in:
Justin T. Gibbs 1998-09-20 07:14:36 +00:00
parent 4af2cddffe
commit e471e974cc
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=39513
2 changed files with 25 additions and 9 deletions

View File

@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id$
* $Id: cam_periph.c,v 1.1 1998/09/15 06:33:23 gibbs Exp $
*/
#include <sys/param.h>
@ -1422,10 +1422,16 @@ cam_periph_error(union ccb *ccb, cam_flags camflags,
break;
case CAM_SEL_TIMEOUT:
{
/*
* XXX
* A single selection timeout should not be enough
* to invalidate a device. We should retry for multiple
* seconds assuming this isn't a probe. We'll probably
* need a special flag for that.
*/
#if 0
struct cam_path *newpath;
error = ENXIO;
/* Should we do more if we can't create the path?? */
if (xpt_create_path(&newpath, xpt_path_periph(ccb->ccb_h.path),
xpt_path_path_id(ccb->ccb_h.path),
@ -1438,7 +1444,8 @@ cam_periph_error(union ccb *ccb, cam_flags camflags,
*/
xpt_async(AC_LOST_DEVICE, newpath, NULL);
xpt_free_path(newpath);
#endif
error = ENXIO;
break;
}
case CAM_REQ_INVALID:

View File

@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: cam_xpt.c,v 1.7 1998/09/18 19:55:34 ken Exp $
* $Id: cam_xpt.c,v 1.8 1998/09/20 05:03:34 gibbs Exp $
*/
#include <sys/param.h>
#include <sys/systm.h>
@ -264,6 +264,15 @@ static struct xpt_quirk_entry xpt_quirk_table[] =
{ T_DIRECT, SIP_MEDIA_REMOVABLE, "iomega", "jaz*", "*" },
/*quirks*/0, /*mintags*/0, /*maxtags*/0
},
{
/*
* Doesn't handle queue full condition correctly,
* so we need to limit maxtags to what the device
* can handle instead of determining this automatically.
*/
{ T_DIRECT, SIP_MEDIA_FIXED, "SAMSUNG", "WN321010S*", "*" },
/*quirks*/0, /*mintags*/0, /*maxtags*/32
},
{
/* Doesn't understand EVP Serial Requests */
{
@ -4774,7 +4783,7 @@ probestart(struct cam_periph *periph, union ccb *start_ccb)
probedone,
MSG_SIMPLE_Q_TAG,
SSD_FULL_SIZE,
/*timeout*/10000);
/*timeout*/60000);
break;
}
case PROBE_INQUIRY:
@ -4814,7 +4823,7 @@ probestart(struct cam_periph *periph, union ccb *start_ccb)
/*evpd*/FALSE,
/*page_code*/0,
SSD_MIN_SIZE,
/*timeout*/5 * 1000);
/*timeout*/60 * 1000);
break;
}
case PROBE_MODE_SENSE:
@ -4837,7 +4846,7 @@ probestart(struct cam_periph *periph, union ccb *start_ccb)
mode_buf,
mode_buf_len,
SSD_FULL_SIZE,
/*timeout*/5000);
/*timeout*/60000);
break;
}
xpt_print_path(periph->path);
@ -4870,7 +4879,7 @@ probestart(struct cam_periph *periph, union ccb *start_ccb)
/*evpd*/TRUE,
SVPD_UNIT_SERIAL_NUMBER,
SSD_MIN_SIZE,
/*timeout*/5 * 1000);
/*timeout*/60 * 1000);
break;
}
/*