Advansys ABP-970U notes

Option ROM loader

The ABP-970U SCSI adapter option ROM does not run in the X7SBL-LN2 motherboard due to a memory map conflict: the SCSI adapter wants the option ROM mapped below the 1 MB area, but the option ROM area below 1 MB is completely filled by motherboard devices, and there is no way to disable their mappings. Since I needed to run the SCSI board configuration program I wrote a small assembler program for loading the SCSI board option ROM.

The aschack program is loaded as a bootsector or by chainloading using GRUB, and does the following:

  1. map the ABP-970U option ROM on physical address space and copy it to a temporary buffer in RAM
  2. configure the ABP-970U using PCI config space accesses, disabling the option ROM
  3. scan the system BIOS for the PnP installation structure ($PnP header signature); when found call the option ROM entrypoint
  4. do an int 0x19 to resume booting

The program is a complete hack, it performs absolutely no error checking and assumes plenty of things about the system it is running on, notably the BDF address of the ABP-970U card and its PCI configuration. If you were to use it, in all likelihood you'd have to modify the source to configure the program for your system, or risk crashing the machine (and/or data corruption, hardware damage...). If you do run the program, the lspci tool is useful for getting appropiate PCI config values.
User: guest, password: guest (info)
aschack.tar.xz [SIG] source code 3 KB 2026-Feb-20

Linux advansys driver bug?

The advansys driver in Linux version 6.10.5 does not work out of the box with the ABP-970U. The problem is in function advansys_init in file drivers/scsi/advansys.c:

static int __init advansys_init(void)
{
        int error;

        error = isa_register_driver(&advansys_vlb_driver,
                                    ASC_IOADR_TABLE_MAX_IX);
        if (error)
                goto fail;

        error = eisa_driver_register(&advansys_eisa_driver);
        if (error)
                goto unregister_vlb;

        error = pci_register_driver(&advansys_pci_driver);
        if (error)
                goto unregister_eisa;

        return 0;

 unregister_eisa:
        eisa_driver_unregister(&advansys_eisa_driver);
 unregister_vlb:
        isa_unregister_driver(&advansys_vlb_driver);
 fail:
        return error;
}

If there is no Advansys ISA or EISA board in the system, then the call to either isa_register_driver or eisa_driver_register will terminate advansys_init without reaching pci_register_driver; since the ABP-970U is a PCI board, the driver is never registered.

I am not familiar enough with the Linux driver architecture to say this is a bug, but the driver can be hacked to load by deleting the ISA and EISA calls:

        int error;

-       error = isa_register_driver(&advansys_vlb_driver,
-                                   ASC_IOADR_TABLE_MAX_IX);
-       if (error)
-               goto fail;
-
-       error = eisa_driver_register(&advansys_eisa_driver);
-       if (error)
-               goto unregister_vlb;

        error = pci_register_driver(&advansys_pci_driver);
        if (error)
-               goto unregister_eisa;
+               goto fail;

        return 0;

-unregister_eisa:
-       eisa_driver_unregister(&advansys_eisa_driver);
-unregister_vlb:
-       isa_unregister_driver(&advansys_vlb_driver);
fail:

After applying the patch, the driver works fine with the ABP-970U.