📄 aic7xxx_old.c
字号:
/*+M************************************************************************* * Adaptec AIC7xxx device driver for Linux. * * Copyright (c) 1994 John Aycock * The University of Calgary Department of Computer Science. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. * * Sources include the Adaptec 1740 driver (aha1740.c), the Ultrastor 24F * driver (ultrastor.c), various Linux kernel source, the Adaptec EISA * config file (!adp7771.cfg), the Adaptec AHA-2740A Series User's Guide, * the Linux Kernel Hacker's Guide, Writing a SCSI Device Driver for Linux, * the Adaptec 1542 driver (aha1542.c), the Adaptec EISA overlay file * (adp7770.ovl), the Adaptec AHA-2740 Series Technical Reference Manual, * the Adaptec AIC-7770 Data Book, the ANSI SCSI specification, the * ANSI SCSI-2 specification (draft 10c), ... * * -------------------------------------------------------------------------- * * Modifications by Daniel M. Eischen (deischen@iworks.InterWorks.org): * * Substantially modified to include support for wide and twin bus * adapters, DMAing of SCBs, tagged queueing, IRQ sharing, bug fixes, * SCB paging, and other rework of the code. * * Parts of this driver were also based on the FreeBSD driver by * Justin T. Gibbs. His copyright follows: * * -------------------------------------------------------------------------- * Copyright (c) 1994-1997 Justin Gibbs. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions, and the following disclaimer, * without modification, immediately at the beginning of the file. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * Where this Software is combined with software released under the terms of * the GNU General Public License ("GPL") and the terms of the GPL would require the * combined work to also be released under the terms of the GPL, the terms * and conditions of this License will apply in addition to those of the * GPL with the exception of any terms or conditions of this License that * conflict with, or are expressly prohibited by, the GPL. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $Id: aic7xxx.c,v 1.119 1997/06/27 19:39:18 gibbs Exp $ *--------------------------------------------------------------------------- * * Thanks also go to (in alphabetical order) the following: * * Rory Bolt - Sequencer bug fixes * Jay Estabrook - Initial DEC Alpha support * Doug Ledford - Much needed abort/reset bug fixes * Kai Makisara - DMAing of SCBs * * A Boot time option was also added for not resetting the scsi bus. * * Form: aic7xxx=extended * aic7xxx=no_reset * aic7xxx=ultra * aic7xxx=irq_trigger:[0,1] # 0 edge, 1 level * aic7xxx=verbose * * Daniel M. Eischen, deischen@iworks.InterWorks.org, 1/23/97 * * $Id: aic7xxx.c,v 4.1 1997/06/12 08:23:42 deang Exp $ *-M*************************************************************************//*+M************************************************************************** * * Further driver modifications made by Doug Ledford <dledford@redhat.com> * * Copyright (c) 1997-1999 Doug Ledford * * These changes are released under the same licensing terms as the FreeBSD * driver written by Justin Gibbs. Please see his Copyright notice above * for the exact terms and conditions covering my changes as well as the * warranty statement. * * Modifications made to the aic7xxx.c,v 4.1 driver from Dan Eischen include * but are not limited to: * * 1: Import of the latest FreeBSD sequencer code for this driver * 2: Modification of kernel code to accomodate different sequencer semantics * 3: Extensive changes throughout kernel portion of driver to improve * abort/reset processing and error hanndling * 4: Other work contributed by various people on the Internet * 5: Changes to printk information and verbosity selection code * 6: General reliability related changes, especially in IRQ management * 7: Modifications to the default probe/attach order for supported cards * 8: SMP friendliness has been improved * * Overall, this driver represents a significant departure from the official * aic7xxx driver released by Dan Eischen in two ways. First, in the code * itself. A diff between the two version of the driver is now a several * thousand line diff. Second, in approach to solving the same problem. The * problem is importing the FreeBSD aic7xxx driver code to linux can be a * difficult and time consuming process, that also can be error prone. Dan * Eischen's official driver uses the approach that the linux and FreeBSD * drivers should be as identical as possible. To that end, his next version * of this driver will be using a mid-layer code library that he is developing * to moderate communications between the linux mid-level SCSI code and the * low level FreeBSD driver. He intends to be able to essentially drop the * FreeBSD driver into the linux kernel with only a few minor tweaks to some * include files and the like and get things working, making for fast easy * imports of the FreeBSD code into linux. * * I disagree with Dan's approach. Not that I don't think his way of doing * things would be nice, easy to maintain, and create a more uniform driver * between FreeBSD and Linux. I have no objection to those issues. My * disagreement is on the needed functionality. There simply are certain * things that are done differently in FreeBSD than linux that will cause * problems for this driver regardless of any middle ware Dan implements. * The biggest example of this at the moment is interrupt semantics. Linux * doesn't provide the same protection techniques as FreeBSD does, nor can * they be easily implemented in any middle ware code since they would truly * belong in the kernel proper and would effect all drivers. For the time * being, I see issues such as these as major stumbling blocks to the * reliability of code based upon such middle ware. Therefore, I choose to * use a different approach to importing the FreeBSD code that doesn't * involve any middle ware type code. My approach is to import the sequencer * code from FreeBSD wholesale. Then, to only make changes in the kernel * portion of the driver as they are needed for the new sequencer semantics. * In this way, the portion of the driver that speaks to the rest of the * linux kernel is fairly static and can be changed/modified to solve * any problems one might encounter without concern for the FreeBSD driver. * * Note: If time and experience should prove me wrong that the middle ware * code Dan writes is reliable in its operation, then I'll retract my above * statements. But, for those that don't know, I'm from Missouri (in the US) * and our state motto is "The Show-Me State". Well, before I will put * faith into it, you'll have to show me that it works :) * *_M*************************************************************************//* * The next three defines are user configurable. These should be the only * defines a user might need to get in here and change. There are other * defines buried deeper in the code, but those really shouldn't need touched * under normal conditions. *//* * AIC7XXX_STRICT_PCI_SETUP * Should we assume the PCI config options on our controllers are set with * sane and proper values, or should we be anal about our PCI config * registers and force them to what we want? The main advantage to * defining this option is on non-Intel hardware where the BIOS may not * have been run to set things up, or if you have one of the BIOSless * Adaptec controllers, such as a 2910, that don't get set up by the * BIOS. However, keep in mind that we really do set the most important * items in the driver regardless of this setting, this only controls some * of the more esoteric PCI options on these cards. In that sense, I * would default to leaving this off. However, if people wish to try * things both ways, that would also help me to know if there are some * machines where it works one way but not another. * * -- July 7, 17:09 * OK...I need this on my machine for testing, so the default is to * leave it defined. * * -- July 7, 18:49 * I needed it for testing, but it didn't make any difference, so back * off she goes. * * -- July 16, 23:04 * I turned it back on to try and compensate for the 2.1.x PCI code * which no longer relies solely on the BIOS and now tries to set * things itself. */#define AIC7XXX_STRICT_PCI_SETUP/* * AIC7XXX_VERBOSE_DEBUGGING * This option enables a lot of extra printk();s in the code, surrounded * by if (aic7xxx_verbose ...) statements. Executing all of those if * statements and the extra checks can get to where it actually does have * an impact on CPU usage and such, as well as code size. Disabling this * define will keep some of those from becoming part of the code. * * NOTE: Currently, this option has no real effect, I will be adding the * various #ifdef's in the code later when I've decided a section is * complete and no longer needs debugging. OK...a lot of things are now * surrounded by this define, so turning this off does have an impact. */ /* * #define AIC7XXX_VERBOSE_DEBUGGING */ #include <linux/module.h>#include <stdarg.h>#include <asm/io.h>#include <asm/irq.h>#include <asm/byteorder.h>#include <linux/version.h>#include <linux/string.h>#include <linux/errno.h>#include <linux/kernel.h>#include <linux/ioport.h>#include <linux/delay.h>#include <linux/sched.h>#include <linux/pci.h>#include <linux/proc_fs.h>#include <linux/blk.h>#include <linux/tqueue.h>#include <linux/init.h>#include <linux/spinlock.h>#include <linux/smp.h>#include <linux/blk.h>#include "sd.h"#include "scsi.h"#include "hosts.h"#include "aic7xxx_old/aic7xxx.h"#include "aic7xxx_old/sequencer.h"#include "aic7xxx_old/scsi_message.h"#include "aic7xxx_old/aic7xxx_reg.h"#include <scsi/scsicam.h>#include <linux/stat.h>#include <linux/slab.h> /* for kmalloc() */#include <linux/config.h> /* for CONFIG_PCI *//* * To generate the correct addresses for the controller to issue * on the bus. Originally added for DEC Alpha support. */#define VIRT_TO_BUS(a) (unsigned int)virt_to_bus((void *)(a))#define AIC7XXX_C_VERSION "5.2.4"#define NUMBER(arr) (sizeof(arr) / sizeof(arr[0]))#define MIN(a,b) (((a) < (b)) ? (a) : (b))#define MAX(a,b) (((a) > (b)) ? (a) : (b))#define ALL_TARGETS -1#define ALL_CHANNELS -1#define ALL_LUNS -1#define MAX_TARGETS 16#define MAX_LUNS 8#ifndef TRUE# define TRUE 1#endif#ifndef FALSE# define FALSE 0#endif#if defined(__powerpc__) || defined(__i386__) || defined(__x86_64__)# define MMAPIO#endif# if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95)# define cpuid smp_processor_id()# define DRIVER_LOCK_INIT \ spin_lock_init(&p->spin_lock);# define DRIVER_LOCK \ if(!p->cpu_lock_count[cpuid]) { \ spin_lock_irqsave(&p->spin_lock, cpu_flags); \ p->cpu_lock_count[cpuid]++; \ } else { \ p->cpu_lock_count[cpuid]++; \ }# define DRIVER_UNLOCK \ if(--p->cpu_lock_count[cpuid] == 0) \ spin_unlock_irqrestore(&p->spin_lock, cpu_flags);# else# define DRIVER_LOCK_INIT# define DRIVER_LOCK# define DRIVER_UNLOCK# endif/* * You can try raising me if tagged queueing is enabled, or lowering * me if you only have 4 SCBs. */#ifdef CONFIG_AIC7XXX_OLD_CMDS_PER_DEVICE#define AIC7XXX_CMDS_PER_DEVICE CONFIG_AIC7XXX_OLD_CMDS_PER_DEVICE#else#define AIC7XXX_CMDS_PER_DEVICE 32#endif/* * Control collection of SCSI transfer statistics for the /proc filesystem. * * NOTE: Do NOT enable this when running on kernels version 1.2.x and below. * NOTE: This does affect performance since it has to maintain statistics. */#ifdef CONFIG_AIC7XXX_OLD_PROC_STATS#define AIC7XXX_PROC_STATS#endif/* * *** Determining commands per LUN *** * * When AIC7XXX_CMDS_PER_DEVICE is not defined, the driver will use its * own algorithm to determine the commands/LUN. If SCB paging is * enabled, which is always now, the default is 8 commands per lun * that indicates it supports tagged queueing. All non-tagged devices * use an internal queue depth of 3, with no more than one of those * three commands active at one time. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -