BIOSLESS FUTURE DOMAIN 16xx SCSI ADAPTERS

My Future Domain TMC-1610 scsi card without BIOS is not recognized at startup by linux kernel. Because I got it (and didn't want to buy an EPROM for it) I've played a little with the kernel sources to get it recognized even without the BIOS presence.

The main point is this: because older fdomain.c driver didn't allow you to say something like:
aha15xx=0x280,11,0xd0000
as a parameter to kernel at boot time (this is to supply information about location of Adaptec SCSI card to the kernel), I had to patch the source code to recognize it. It's very easy, but perhaps not so clean as it should be.

According to Rickard Faith, The newer Linux kernels should have the boot option for this:
fdomain=<PORT_BASE>,<IRQ>,<ADAPTER_ID>

So, with the FD at base address 0x140, interrupt 11 you would say to lilo at boot:
fdomain=0x140,11,7
I presume the number 7 is the SCSI id for the future domain card.

If this helps, you're lucky. If not, try to modify & recompile your kernel as seen on the rest of this page.


What's going on at boot ?


Linux (device driver) first searches for the presence of BIOS. Then, he (she, or even it ?) compares some strings defined in fdomain.c with content of this BIOS. Every BIOS includes string (line of text) which describes its manufacturer, year, chipset etc.(called signature).
So, if some textual string from fdomain.c is identical to that one in the BIOS (at specified offset from beginning of ROM) the driver reads some additional info (mainly chipset used) from the signature's struct record and passes it to the real chipset detection program(which probes hw addresses and IRQs).

My patch is based on idea that empty string is equal to everything, so if none of the known BIOSes are present, driver treats it to be the card with NULL signature (that's what you've to do-add a signature w/null string) and recognizes it always.

How to add an empty string signature ?

Well, first of all, find the fdomain.c source code (linux/drivers/scsi/fdomain.c) and find the lines with signatures. It might look like this example (a piece of code cut from it):


/*

  READ THIS BEFORE YOU ADD A SIGNATURE!

  READING THIS SHORT NOTE CAN SAVE YOU LOTS OF TIME!

  READ EVERY WORD, ESPECIALLY THE WORD *NOT*

  This driver works *ONLY* for Future Domain cards using the TMC-1800,
  TMC-18C50, or TMC-18C30 chip.  This includes models TMC-1650, 1660, 1670,
  and 1680.

  The following BIOS signature signatures are for boards which do *NOT*
  work with this driver (these TMC-8xx and TMC-9xx boards may work with the
  Seagate driver):

  FUTURE DOMAIN CORP. (C) 1986-1988 V4.0I 03/16/88
  FUTURE DOMAIN CORP. (C) 1986-1989 V5.0C2/14/89
  FUTURE DOMAIN CORP. (C) 1986-1989 V6.0A7/28/89
  FUTURE DOMAIN CORP. (C) 1986-1990 V6.0105/31/90
  FUTURE DOMAIN CORP. (C) 1986-1990 V6.0209/18/90
  FUTURE DOMAIN CORP. (C) 1986-1990 V7.009/18/90
  FUTURE DOMAIN CORP. (C) 1992 V8.00.004/02/92

*/

struct signature {
   char *signature;
   int  sig_offset;
   int  sig_length;
   int  major_bios_version;
   int  minor_bios_version;
   int  flag; /* 1 == PCI_bus, 2 == ISA_200S, 3 == ISA_250MG, 4 == ISA_200S */
} signatures[] = {
   /*          1         2         3         4         5         6 */
   /* 123456789012345678901234567890123456789012345678901234567890 */
   { "FUTURE DOMAIN CORP. (C) 1986-1990 1800-V2.07/28/89",  5, 50,  2,  0, 0 },
   { "FUTURE DOMAIN CORP. (C) 1986-1990 1800-V1.07/28/89",  5, 50,  2,  0, 0 },
   { "FUTURE DOMAIN CORP. (C) 1986-1990 1800-V2.07/28/89", 72, 50,  2,  0, 2 },
   { "FUTURE DOMAIN CORP. (C) 1986-1990 1800-V2.0",        73, 43,  2,  0, 3 },
   { "FUTURE DOMAIN CORP. (C) 1991 1800-V2.0.",            72, 39,  2,  0, 4 },
   { "FUTURE DOMAIN CORP. (C) 1992 V3.00.004/02/92",        5, 44,  3,  0, 0 },
   { "FUTURE DOMAIN TMC-18XX (C) 1993 V3.203/12/93",        5, 44,  3,  2, 0 },
   { "IBM F1 P2 BIOS v1.0104/29/93",                        5, 28,  3, -1, 0 },
   { "Future Domain Corp. V1.0008/18/93",                   5, 33,  3,  4, 0 },
   { "Future Domain Corp. V1.0008/18/93",                  26, 33,  3,  4, 1 },
				/* This next signature may not be a 3.5 bios */
   { "Future Domain Corp. V2.0108/18/93",                   5, 33,  3,  5, 0 },
   { "FUTURE DOMAIN CORP.  V3.5008/18/93",                  5, 34,  3,  5, 0 },
   { "FUTURE DOMAIN 18c30/18c50/1800 (C) 1994 V3.5",        5, 44,  3,  5, 0 },
   { "FUTURE DOMAIN TMC-18XX",                              5, 22, -1, -1, 0 },

   /* READ NOTICE ABOVE *BEFORE* YOU WASTE YOUR TIME ADDING A SIGNATURE
    Also, fix the disk geometry code for your signature and send your
    changes for faith@cs.unc.edu.  Above all, do *NOT* change any old
    signatures!

    Note that the last line will match a "generic" 18XX bios.  Because
    Future Domain has changed the host SCSI ID and/or the location of the
    geometry information in the on-board RAM area for each of the first
    three BIOS's, it is still important to enter a fully qualified
    signature in the table for any new BIOS's (after the host SCSI ID and
    geometry location are verified). */
};
Then, find the line that describes your card (by its type, for example TMC-1610 is the serie of mine,not listed here directly) and copy this line (whole struct record quoted by { }, - don't forget , at the end) after the last signature listed. Empty the string quoted by "" and fill the length and offset of this string to 0,0 (as shown in this example):

				/* This next signature may not be a 3.5 bios */
   { "Future Domain Corp. V2.0108/18/93",                   5, 33,  3,  5, 0 },
   { "FUTURE DOMAIN CORP.  V3.5008/18/93",                  5, 34,  3,  5, 0 },
   { "FUTURE DOMAIN 18c30/18c50/1800 (C) 1994 V3.5",        5, 44,  3,  5, 0 },
   { "FUTURE DOMAIN TMC-18XX",                              5, 22, -1, -1, 0 },
   { "",                                                    0, 0, -1, -1, 0 },
     ^^-- this is empty signature and its offset & length --^^-^^ ^^__^^  ^^--type of bus
                                                                   |  |
                                 bios versions (major&minor)  --------
   /* READ NOTICE ABOVE *BEFORE* YOU WASTE YOUR TIME ADDING A SIGNATURE
    Also, fix the disk geometry code for your signature and send your
    changes for faith@cs.unc.edu.  Above all, do *NOT* change any old
    signatures!
Well, it's done! Now save this modified source and recompile the kernel (by issuing something like make dep ; make clean ; make zImage or whatever you compile by.

After the next boot, your card should be OK.
Here's an example of how it look like when the card is recognized:

Dec  7 20:33:10 smrt kernel: scsi0 : BIOS version ?.?. at 0xc8000 using scsi id 7
Dec  7 20:33:10 smrt kernel: scsi0 : TMC-18C30 chip at 0x150 irq 11
Dec  7 20:33:10 smrt kernel: scsi0 : Future Domain TMC-16x0 SCSI driver, version 5.28
Dec  7 20:33:10 smrt kernel: scsi : 1 host.
Dec  7 20:33:10 smrt kernel:   Vendor: TOSHIBA   Model: CD-ROM XM-5201TA  Rev: 3014
Dec  7 20:33:10 smrt kernel:   Type:   CD-ROM                             ANSI SCSI revision: 02
Dec  7 20:33:10 smrt kernel: Detected scsi CD-ROM sr0 at scsi0, id 0, lun 0
Dec  7 20:33:10 smrt kernel: scsi : detected 1 SCSI cdrom total.

Have fun and happy tweaking !

BTW, is Linux he, she or it (NOT he_s-sh_it) ?
What's the sex of Linux ?


To my main page