Force LBA48 access to ST3160827AS drives. Without this change the entire

system hangs whenever a read or write request to sector 0xfffffff occurs.

The hang appears to happen when:

status = bus_space_read_1(wdr->cmd_iot, wdr->cmd_iohs[wd_status], 0);

is executed in __wdcwait(), and it is not possible to enter the debugger or
make the system respond at all after this point.

Whilst not necessarily the most prudent solution to handling the large number
of drives that exhibit this problem, it is currently the popular workaround.

[An alternative approach is to just always drop to LBA48 if the request
happens to pass by sector 0xfffffff and the drive reported as larger than
0xfffffff sectors.  My understanding is that the 32 bit addressing below
0x10000000 is purely there as a performance booster, not to resolve a
compatibility issue.]
This commit is contained in:
dsainty 2005-07-02 04:29:01 +00:00
parent 432d19fe4b
commit 867423adde

View File

@ -1,4 +1,4 @@
/* $NetBSD: wd.c,v 1.304 2005/06/19 18:26:40 bouyer Exp $ */
/* $NetBSD: wd.c,v 1.305 2005/07/02 04:29:01 dsainty Exp $ */
/*
* Copyright (c) 1998, 2001 Manuel Bouyer. All rights reserved.
@ -66,7 +66,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: wd.c,v 1.304 2005/06/19 18:26:40 bouyer Exp $");
__KERNEL_RCSID(0, "$NetBSD: wd.c,v 1.305 2005/07/02 04:29:01 dsainty Exp $");
#ifndef ATADEBUG
#define ATADEBUG
@ -237,6 +237,8 @@ static const struct wd_quirk {
*/
{ "ST3160023A*",
WD_QUIRK_FORCE_LBA48 },
{ "ST3160827A*",
WD_QUIRK_FORCE_LBA48 },
{ "ST3200822A*",
WD_QUIRK_FORCE_LBA48 },
{ "ST3250823A*",