blob: 268bc71f9c38e829e5451ba1eb3e38e2e812a982 [file] [log] [blame]
/*
* hosts.c Copyright (C) 1992 Drew Eckhardt
* mid to lowlevel SCSI driver interface by
* Drew Eckhardt
*
* <drew@colorado.edu>
*/
/*
This file contains the medium level SCSI
host interface initialization, as well as the scsi_hosts array of SCSI
hosts currently present in the system.
*/
#include <linux/config.h>
#ifdef CONFIG_SCSI
#include <linux/kernel.h>
#include "scsi.h"
#ifndef NULL
#define NULL 0L
#endif
#ifdef FIGURE_MAX_SCSI_HOSTS
#define MAX_SCSI_HOSTS
#endif
#include "hosts.h"
#ifdef CONFIG_SCSI_AHA1542
#include <sys/types.h>
#include "aha1542.h"
#endif
#ifdef CONFIG_SCSI_SEAGATE
#include "seagate.h"
#endif
#ifdef CONFIG_SCSI_ULTRASTOR
#include "ultrastor.h"
#endif
/*
static const char RCSid[] = "$Header: /usr/src/linux/kernel/blk_drv/scsi/RCS/hosts.c,v 1.1 1992/04/24 18:01:50 root Exp root $";
*/
/*
The scsi host entries should be in the order you wish the
cards to be detected. A driver may appear more than once IFF
it can deal with being detected (and therefore initialized)
with more than one simulatenous host number, can handle being
rentrant, etc.
They may appear in any order, as each SCSI host is told which host number it is
during detection.
*/
/*
When figure is run, we don't want to link to any object code. Since
the macro for each host will contain function pointers, we cannot
use it and instead must use a "blank" that does no such
idiocy.
*/
#ifdef FIGURE_MAX_SCSI_HOSTS
#define BLANKIFY(what) BLANK_HOST
#else
#define BLANKIFY(what) what
#endif
Scsi_Host scsi_hosts[] =
{
#ifdef CONFIG_SCSI_AHA1542
BLANKIFY(AHA1542),
#endif
#ifdef CONFIG_SCSI_SEAGATE
BLANKIFY(SEAGATE_ST0X),
#endif
#ifdef CONFIG_SCSI_ULTRASTOR
BLANKIFY(ULTRASTOR_14F),
#endif
};
#ifdef FIGURE_MAX_SCSI_HOSTS
#undef MAX_SCSI_HOSTS
#define MAX_SCSI_HOSTS (sizeof(scsi_hosts) / sizeof(Scsi_Host))
#endif
#ifdef FIGURE_MAX_SCSI_HOSTS
#include <stdio.h>
void main (void)
{
printf("%d", MAX_SCSI_HOSTS);
}
#else
/*
Our semaphores and timeout counters, where size depends on MAX_SCSI_HOSTS here.
*/
volatile unsigned char host_busy[MAX_SCSI_HOSTS];
volatile int host_timeout[MAX_SCSI_HOSTS];
volatile Scsi_Cmnd *host_queue[MAX_SCSI_HOSTS];
/*
scsi_init initializes the scsi hosts.
*/
void scsi_init(void)
{
static int called = 0;
int i, count;
if (!called)
{
called = 1;
for (count = i = 0; i < MAX_SCSI_HOSTS; ++i)
{
/*
Initialize our semaphores. -1 is interpreted to mean
"inactive" - where as 0 will indicate a time out condition.
*/
host_busy[i] = 0;
host_timeout[i] = 0;
host_queue[i] = NULL;
if ((scsi_hosts[i].detect) && (scsi_hosts[i].present = scsi_hosts[i].detect(i)))
{
printk ("Host %d is detected as a(n) %s.\n\r",
count, scsi_hosts[i].name);
printk ("%s", scsi_hosts[i].info());
++count;
}
}
printk ("%d host adapters detected. \n\r", count);
}
}
#endif
#endif