Add detection code for what model of AHA154X/Z we are running on,

then use that information to fix the enhancemode features of the
1542C/CF boards by turning them off.

When doing this I found that the Buslogic 545S does NOT properly
mimic the 1542 families AHA_INQUIRE command.  It only returns 1
byte of information, when the adaptec manual clearly states that 4
bytes are to be returned.  I added a printf that explains the error
when we see a 545S for now, I tried to come up with a better solution,
but it involved to much work for now.
This commit is contained in:
Rodney W. Grimes 1993-10-15 09:43:51 +00:00
parent 9f2d973525
commit 37378adeb5
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=606

View file

@ -12,7 +12,7 @@
* on the understanding that TFS is not responsible for the correct
* functioning of this software in any circumstances.
*
* $Id: aha1542.c,v 1.9 1993/10/12 07:15:28 rgrimes Exp $
* $Id: aha1542.c,v 1.10 1993/10/13 16:34:10 rgrimes Exp $
*/
/*
@ -151,6 +151,8 @@ extern int delaycount; /* from clock setup code */
#define AHA_WRITE_FIFO 0x1c /* write fifo buffer */
#define AHA_READ_FIFO 0x1d /* read fifo buffer */
#define AHA_ECHO 0x1e /* Echo command data */
#define AHA_EXT_BIOS 0x28 /* return extended bios info */
#define AHA_MBX_ENABLE 0x29 /* enable mail box interface */
struct aha_cmd_buf {
u_char byte[16];
@ -294,6 +296,29 @@ struct aha_config
u_char :5;
};
struct aha_inquire
{
u_char boardid; /* type of board */
/* 0x20 = BusLogic 545, but it gets
the command wrong, only returns
one byte */
/* 0x31 = AHA-1540 */
/* 0x41 = AHA-1540A/1542A/1542B */
/* 0x42 = AHA-1640 */
/* 0x43 = AHA-1542C */
/* 0x44 = AHA-1542CF */
u_char spec_opts; /* special options ID */
/* 0x41 = Board is standard model */
u_char revision_1; /* firmware revision [0-9A-Z] */
u_char revision_2; /* firmware revision [0-9A-Z] */
};
struct aha_extbios
{
u_char flags; /* Bit 3 == 1 extended bios enabled */
u_char mailboxlock; /* mail box lock code to unlock it */
};
#define INT9 0x01
#define INT10 0x02
#define INT11 0x04
@ -882,6 +907,8 @@ int unit;
unsigned char ad[3];
volatile int i,sts;
struct aha_config conf;
struct aha_inquire inquire;
struct aha_extbios extbios;
/***********************************************\
* reset board, If it doesn't respond, assume *
@ -904,10 +931,45 @@ int unit;
#endif /*AHADEBUG*/
return(ENXIO);
}
/*
* Assume we have a board at this stage, do an adapter inquire
* to find out what type of controller it is
*/
aha_cmd(unit, 0, sizeof(inquire), 1 ,&inquire, AHA_INQUIRE);
#ifdef AHADEBUG
printf("aha%d: inquire %x, %x, %x, %x\n",
unit,
inquire.boardid, inquire.spec_opts,
inquire.revision_1, inquire.revision_2);
#endif /* AHADEBUG */
/*
* XXX The Buslogic 545S gets the AHA_INQUIRE command wrong,
* they only return one byte which causes us to print an error,
* so if the boardid comes back as 0x20, tell the user why they
* get the "cmd/data port empty" message
*/
if (inquire.boardid == 0x20) {
/* looks like a Buslogic 545 */
printf ("aha%d: above cmd/data port empty do to Buslogic 545\n",
unit);
}
/*
* If we are on a 1542C or 1542CF find out if the extended bios
* is enabled, if it is disable it, or else it will screw us up later
*/
if ((inquire.boardid == 0x43) || (inquire.boardid == 0x44)) {
aha_cmd(unit, 0, sizeof(extbios), 0, &extbios, AHA_EXT_BIOS);
#ifdef AHADEBUG
printf("aha%d: extended bios flags %x\n", unit, extbios.flags);
#endif /* AHADEBUG */
if (extbios.flags & 0x8) {
printf("aha%d: disabling bios enhanced features\n");
aha_cmd(unit, 2, 0, 0, 0, AHA_MBX_ENABLE,
0, extbios.mailboxlock);
}
}
/***********************************************\
* Assume we have a board at this stage *
* setup dma channel from jumpers and save int *
* Setup dma channel from jumpers and save int *
* level *
\***********************************************/
#ifdef __386BSD__