"Fix" a problem with the Quantum Viking. It appears that this drive does
not like the 6-byte read and write commands! It returns illegal request, with the field pointer pointing to byte 9 of a 6 byte CDB. In any case, the work around is to put in a quirk mechanism that makes sure that we don't send 6-byte reads or writes to this device. It's rather sad that this is necessary. You'd think that they would be able to get something that basic to work right in their firmware... Reviewed by: gibbs Reported by: Adam McDougall <bsdx@spawnet.com>
This commit is contained in:
parent
559fcf9493
commit
4f1d0ef261
@ -25,7 +25,7 @@
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id: scsi_da.c,v 1.11 1998/10/13 23:34:54 ken Exp $
|
||||
* $Id: scsi_da.c,v 1.12 1998/10/22 22:16:56 ken Exp $
|
||||
*/
|
||||
|
||||
#include "opt_hw_wdog.h"
|
||||
@ -75,7 +75,8 @@ typedef enum {
|
||||
|
||||
typedef enum {
|
||||
DA_Q_NONE = 0x00,
|
||||
DA_Q_NO_SYNC_CACHE = 0x01
|
||||
DA_Q_NO_SYNC_CACHE = 0x01,
|
||||
DA_Q_NO_6_BYTE = 0x02
|
||||
} da_quirks;
|
||||
|
||||
typedef enum {
|
||||
@ -107,6 +108,7 @@ struct da_softc {
|
||||
da_state state;
|
||||
da_flags flags;
|
||||
da_quirks quirks;
|
||||
int minimum_cmd_size;
|
||||
int ordered_tag_count;
|
||||
struct disk_params params;
|
||||
struct diskslices *dk_slices; /* virtual drives */
|
||||
@ -146,6 +148,23 @@ static struct da_quirk_entry da_quirk_table[] =
|
||||
*/
|
||||
{T_DIRECT, SIP_MEDIA_FIXED, "NEC", "D3847*", "*"},
|
||||
/*quirks*/ DA_Q_NO_SYNC_CACHE
|
||||
},
|
||||
{
|
||||
/*
|
||||
* Doesn't work correctly with 6 byte reads/writes.
|
||||
* Returns illegal request, and points to byte 9 of the
|
||||
* 6-byte CDB.
|
||||
* Reported by: Adam McDougall <bsdx@spawnet.com>
|
||||
*/
|
||||
{T_DIRECT, SIP_MEDIA_FIXED, "QUANTUM", "VIKING 4*", "*"},
|
||||
/*quirks*/ DA_Q_NO_6_BYTE
|
||||
},
|
||||
{
|
||||
/*
|
||||
* See above.
|
||||
*/
|
||||
{T_DIRECT, SIP_MEDIA_FIXED, "QUANTUM", "VIKING 2*", "*"},
|
||||
/*quirks*/ DA_Q_NO_6_BYTE
|
||||
}
|
||||
};
|
||||
|
||||
@ -648,7 +667,7 @@ dadump(dev_t dev)
|
||||
MSG_ORDERED_Q_TAG,
|
||||
/*read*/FALSE,
|
||||
/*byte2*/0,
|
||||
/*minimum_cmd_size*/ 6,
|
||||
/*minimum_cmd_size*/ softc->minimum_cmd_size,
|
||||
blknum,
|
||||
blkcnt,
|
||||
/*data_ptr*/CADDR1,
|
||||
@ -977,6 +996,11 @@ daregister(struct cam_periph *periph, void *arg)
|
||||
else
|
||||
softc->quirks = DA_Q_NONE;
|
||||
|
||||
if (softc->quirks & DA_Q_NO_6_BYTE)
|
||||
softc->minimum_cmd_size = 10;
|
||||
else
|
||||
softc->minimum_cmd_size = 6;
|
||||
|
||||
/*
|
||||
* Block our timeout handler while we
|
||||
* add this softc to the dev list.
|
||||
@ -1076,7 +1100,7 @@ dastart(struct cam_periph *periph, union ccb *start_ccb)
|
||||
tag_code,
|
||||
bp->b_flags & B_READ,
|
||||
/*byte2*/0,
|
||||
/*minimum_cmd_size*/ 6,
|
||||
softc->minimum_cmd_size,
|
||||
bp->b_pblkno,
|
||||
bp->b_bcount / softc->params.secsize,
|
||||
bp->b_data,
|
||||
|
Loading…
Reference in New Issue
Block a user