Subject: Re: old SCSI devices that don't support INQUIRY
To: Michael L. Hitch <mhitch@lightning.msu.montana.edu>
From: Matthew Jacob <mjacob@feral.com>
List: tech-kern
Date: 09/13/2001 22:02:11
That handles the INQUIRY command, but doesn't handle other commands.



On Thu, 13 Sep 2001, Michael L. Hitch wrote:

> On Thu, 13 Sep 2001, Matthew Fredette wrote:
> 
> > 
> > Hi.  Sun-2s often have MFM hard drives sitting behind Adaptec ACB-4000
> > SCSI->MFM converter boards.  These boards are really old and don't
> > understand the INQUIRY command.  What's the best way to go about
> > adding support for them?  Thanks -
> 
>   I've used the following patch for quite a while on my Amiga.
> 
> --- sys/dev/scsipi/scsipi_base.c.orig   Fri Jun  9 02:54:24 2000
> +++ sys/dev/scsipi/scsipi_base.c        Mon Jan 15 00:05:23 2001
> @@ -409,6 +409,13 @@ scsipi_interpret_sense(xs)
>          * Not code 70, just report it
>          */
>         default:
> +               if ((sense->error_code & SSD_ERRCODE) == 0x20) {
> +                       if ((xs->xs_control & XS_CTL_IGNORE_ILLEGAL_REQUEST) != 0)
> +                               return 0;
> +                       return (EINVAL);        /* Adaptec A4000 invalid request */
> +               }
> +               if ((sense->error_code & SSD_ERRCODE) == 0x25)
> +                       return (EACCES);        /* Adaptec A4000 invalid LUN */
>  #if    defined(SCSIDEBUG) || defined(DEBUG)
>         {
>                 static char *uc = "undecodable sense error";
> @@ -511,15 +518,27 @@ scsipi_inquire(sc_link, inqbuf, flags)
>         int flags;
>  {
>         struct scsipi_inquiry scsipi_cmd;
> +       int error;
> 
>         bzero(&scsipi_cmd, sizeof(scsipi_cmd));
>         scsipi_cmd.opcode = INQUIRY;
>         scsipi_cmd.length = sizeof(struct scsipi_inquiry_data);
> 
> -       return (scsipi_command(sc_link,
> +       error = scsipi_command(sc_link,
>             (struct scsipi_generic *) &scsipi_cmd, sizeof(scsipi_cmd),
>             (u_char *) inqbuf, sizeof(struct scsipi_inquiry_data),
> -           SCSIPIRETRIES, 10000, NULL, XS_CTL_DATA_IN | flags));
> +           SCSIPIRETRIES, 10000, NULL, XS_CTL_DATA_IN | flags);
> +       /*
> +        * Kludge for Adaptec A4000, which doesn't support the inquire
> +        * command.
> +        */
> +       if (error == EINVAL || error == EACCES) {
> +               bzero (inqbuf, 4);
> +               if (error == EACCES)
> +                       inqbuf->device = SID_QUAL_BAD_LU | SID_TYPE;
> +               error = 0;
> +       }
> +       return error;
>  }
> 
>  /*
> 
> 
> --
> Michael L. Hitch			mhitch@montana.edu
> Computer Consultant
> Information Technology Center
> Montana State University	Bozeman, MT	USA
> 
>