📄 aic7xxx_pci.c
字号:
/* * Product specific probe and attach routines for: * 3940, 2940, aic7895, aic7890, aic7880, * aic7870, aic7860 and aic7850 SCSI controllers * * Copyright (c) 1994-2001 Justin T. Gibbs. * Copyright (c) 2000-2001 Adaptec Inc. * 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. * 2. Redistributions in binary form must reproduce at minimum a disclaimer * substantially similar to the "NO WARRANTY" disclaimer below * ("Disclaimer") and any redistribution must be conditioned upon * including a substantially similar Disclaimer requirement for further * binary redistribution. * 3. Neither the names of the above-listed copyright holders nor the names * of any contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License ("GPL") version 2 as published by the Free * Software Foundation. * * NO WARRANTY * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 DAMAGES. * * $Id: //depot/aic7xxx/aic7xxx/aic7xxx_pci.c#32 $ * * $FreeBSD: src/sys/dev/aic7xxx/aic7xxx_pci.c,v 1.6 2000/11/10 20:13:41 gibbs Exp $ */#include "aic7xxx_osm.h"#include "aic7xxx_inline.h"#include "aic7xxx_93cx6.h"#define AHC_PCI_IOADDR PCIR_MAPS /* I/O Address */#define AHC_PCI_MEMADDR (PCIR_MAPS + 4) /* Mem I/O Address */static __inline uint64_tahc_compose_id(u_int device, u_int vendor, u_int subdevice, u_int subvendor){ uint64_t id; id = subvendor | (subdevice << 16) | ((uint64_t)vendor << 32) | ((uint64_t)device << 48); return (id);}#define ID_ALL_MASK 0xFFFFFFFFFFFFFFFFull#define ID_DEV_VENDOR_MASK 0xFFFFFFFF00000000ull#define ID_9005_GENERIC_MASK 0xFFF0FFFF00000000ull#define ID_9005_SISL_MASK 0x000FFFFF00000000ull#define ID_9005_SISL_ID 0x0005900500000000ull#define ID_AIC7850 0x5078900400000000ull#define ID_AHA_2902_04_10_15_20_30C 0x5078900478509004ull#define ID_AIC7855 0x5578900400000000ull#define ID_AIC7859 0x3860900400000000ull#define ID_AHA_2930CU 0x3860900438699004ull#define ID_AIC7860 0x6078900400000000ull#define ID_AIC7860C 0x6078900478609004ull#define ID_AHA_1480A 0x6075900400000000ull#define ID_AHA_2940AU_0 0x6178900400000000ull#define ID_AHA_2940AU_1 0x6178900478619004ull#define ID_AHA_2940AU_CN 0x2178900478219004ull#define ID_AHA_2930C_VAR 0x6038900438689004ull#define ID_AIC7870 0x7078900400000000ull#define ID_AHA_2940 0x7178900400000000ull#define ID_AHA_3940 0x7278900400000000ull#define ID_AHA_398X 0x7378900400000000ull#define ID_AHA_2944 0x7478900400000000ull#define ID_AHA_3944 0x7578900400000000ull#define ID_AHA_4944 0x7678900400000000ull#define ID_AIC7880 0x8078900400000000ull#define ID_AIC7880_B 0x8078900478809004ull#define ID_AHA_2940U 0x8178900400000000ull#define ID_AHA_3940U 0x8278900400000000ull#define ID_AHA_2944U 0x8478900400000000ull#define ID_AHA_3944U 0x8578900400000000ull#define ID_AHA_398XU 0x8378900400000000ull#define ID_AHA_4944U 0x8678900400000000ull#define ID_AHA_2940UB 0x8178900478819004ull#define ID_AHA_2930U 0x8878900478889004ull#define ID_AHA_2940U_PRO 0x8778900478879004ull#define ID_AHA_2940U_CN 0x0078900478009004ull#define ID_AIC7895 0x7895900478959004ull#define ID_AIC7895_ARO 0x7890900478939004ull#define ID_AIC7895_ARO_MASK 0xFFF0FFFFFFFFFFFFull#define ID_AHA_2940U_DUAL 0x7895900478919004ull#define ID_AHA_3940AU 0x7895900478929004ull#define ID_AHA_3944AU 0x7895900478949004ull#define ID_AIC7890 0x001F9005000F9005ull#define ID_AIC7890_ARO 0x00139005000F9005ull#define ID_AAA_131U2 0x0013900500039005ull#define ID_AHA_2930U2 0x0011900501819005ull#define ID_AHA_2940U2B 0x00109005A1009005ull#define ID_AHA_2940U2_OEM 0x0010900521809005ull#define ID_AHA_2940U2 0x00109005A1809005ull#define ID_AHA_2950U2B 0x00109005E1009005ull#define ID_AIC7892 0x008F9005FFFF9005ull#define ID_AIC7892_ARO 0x00839005FFFF9005ull#define ID_AHA_29160 0x00809005E2A09005ull#define ID_AHA_29160_CPQ 0x00809005E2A00E11ull#define ID_AHA_29160N 0x0080900562A09005ull#define ID_AHA_29160C 0x0080900562209005ull#define ID_AHA_29160B 0x00809005E2209005ull#define ID_AHA_19160B 0x0081900562A19005ull#define ID_AIC7896 0x005F9005FFFF9005ull#define ID_AIC7896_ARO 0x00539005FFFF9005ull#define ID_AHA_3950U2B_0 0x00509005FFFF9005ull#define ID_AHA_3950U2B_1 0x00509005F5009005ull#define ID_AHA_3950U2D_0 0x00519005FFFF9005ull#define ID_AHA_3950U2D_1 0x00519005B5009005ull#define ID_AIC7899 0x00CF9005FFFF9005ull#define ID_AIC7899_ARO 0x00C39005FFFF9005ull#define ID_AHA_3960D 0x00C09005F6209005ull#define ID_AHA_3960D_CPQ 0x00C09005F6200E11ull#define ID_AIC7810 0x1078900400000000ull#define ID_AIC7815 0x7815900400000000ull#define DEVID_9005_TYPE(id) ((id) & 0xF)#define DEVID_9005_TYPE_HBA 0x0 /* Standard Card */#define DEVID_9005_TYPE_AAA 0x3 /* RAID Card */#define DEVID_9005_TYPE_SISL 0x5 /* Container ROMB */#define DEVID_9005_TYPE_MB 0xF /* On Motherboard */#define DEVID_9005_MAXRATE(id) (((id) & 0x30) >> 4)#define DEVID_9005_MAXRATE_U160 0x0#define DEVID_9005_MAXRATE_ULTRA2 0x1#define DEVID_9005_MAXRATE_ULTRA 0x2#define DEVID_9005_MAXRATE_FAST 0x3#define DEVID_9005_MFUNC(id) (((id) & 0x40) >> 6)#define DEVID_9005_CLASS(id) (((id) & 0xFF00) >> 8)#define DEVID_9005_CLASS_SPI 0x0 /* Parallel SCSI */#define SUBID_9005_TYPE(id) ((id) & 0xF)#define SUBID_9005_TYPE_MB 0xF /* On Motherboard */#define SUBID_9005_TYPE_CARD 0x0 /* Standard Card */#define SUBID_9005_TYPE_LCCARD 0x1 /* Low Cost Card */#define SUBID_9005_TYPE_RAID 0x3 /* Combined with Raid */#define SUBID_9005_TYPE_KNOWN(id) \ ((((id) & 0xF) == SUBID_9005_TYPE_MB) \ || (((id) & 0xF) == SUBID_9005_TYPE_CARD) \ || (((id) & 0xF) == SUBID_9005_TYPE_LCCARD) \ || (((id) & 0xF) == SUBID_9005_TYPE_RAID))#define SUBID_9005_MAXRATE(id) (((id) & 0x30) >> 4)#define SUBID_9005_MAXRATE_ULTRA2 0x0#define SUBID_9005_MAXRATE_ULTRA 0x1#define SUBID_9005_MAXRATE_U160 0x2#define SUBID_9005_MAXRATE_RESERVED 0x3#define SUBID_9005_SEEPTYPE(id) \ ((SUBID_9005_TYPE(id) == SUBID_9005_TYPE_MB) \ ? ((id) & 0xC0) >> 6 \ : ((id) & 0x300) >> 8)#define SUBID_9005_SEEPTYPE_NONE 0x0#define SUBID_9005_SEEPTYPE_1K 0x1#define SUBID_9005_SEEPTYPE_2K_4K 0x2#define SUBID_9005_SEEPTYPE_RESERVED 0x3#define SUBID_9005_AUTOTERM(id) \ ((SUBID_9005_TYPE(id) == SUBID_9005_TYPE_MB) \ ? (((id) & 0x400) >> 10) == 0 \ : (((id) & 0x40) >> 6) == 0)#define SUBID_9005_NUMCHAN(id) \ ((SUBID_9005_TYPE(id) == SUBID_9005_TYPE_MB) \ ? ((id) & 0x300) >> 8 \ : ((id) & 0xC00) >> 10)#define SUBID_9005_LEGACYCONN(id) \ ((SUBID_9005_TYPE(id) == SUBID_9005_TYPE_MB) \ ? 0 \ : ((id) & 0x80) >> 7)#define SUBID_9005_MFUNCENB(id) \ ((SUBID_9005_TYPE(id) == SUBID_9005_TYPE_MB) \ ? ((id) & 0x800) >> 11 \ : ((id) & 0x1000) >> 12)/* * Informational only. Should use chip register to be * ceratian, but may be use in identification strings. */#define SUBID_9005_CARD_SCSIWIDTH_MASK 0x2000#define SUBID_9005_CARD_PCIWIDTH_MASK 0x4000#define SUBID_9005_CARD_SEDIFF_MASK 0x8000static ahc_device_setup_t ahc_aic785X_setup;static ahc_device_setup_t ahc_aic7860_setup;static ahc_device_setup_t ahc_apa1480_setup;static ahc_device_setup_t ahc_aic7870_setup;static ahc_device_setup_t ahc_aha394X_setup;static ahc_device_setup_t ahc_aha494X_setup;static ahc_device_setup_t ahc_aha398X_setup;static ahc_device_setup_t ahc_aic7880_setup;static ahc_device_setup_t ahc_aha2940Pro_setup;static ahc_device_setup_t ahc_aha394XU_setup;static ahc_device_setup_t ahc_aha398XU_setup;static ahc_device_setup_t ahc_aic7890_setup;static ahc_device_setup_t ahc_aic7892_setup;static ahc_device_setup_t ahc_aic7895_setup;static ahc_device_setup_t ahc_aic7896_setup;static ahc_device_setup_t ahc_aic7899_setup;static ahc_device_setup_t ahc_aha29160C_setup;static ahc_device_setup_t ahc_raid_setup;static ahc_device_setup_t ahc_aha394XX_setup;static ahc_device_setup_t ahc_aha494XX_setup;static ahc_device_setup_t ahc_aha398XX_setup;struct ahc_pci_identity ahc_pci_ident_table [] ={ /* aic7850 based controllers */ { ID_AHA_2902_04_10_15_20_30C, ID_ALL_MASK, "Adaptec 2902/04/10/15/20/30C SCSI adapter", ahc_aic785X_setup }, /* aic7860 based controllers */ { ID_AHA_2930CU, ID_ALL_MASK, "Adaptec 2930CU SCSI adapter", ahc_aic7860_setup }, { ID_AHA_1480A & ID_DEV_VENDOR_MASK, ID_DEV_VENDOR_MASK, "Adaptec 1480A Ultra SCSI adapter", ahc_apa1480_setup }, { ID_AHA_2940AU_0 & ID_DEV_VENDOR_MASK, ID_DEV_VENDOR_MASK, "Adaptec 2940A Ultra SCSI adapter", ahc_aic7860_setup }, { ID_AHA_2940AU_CN & ID_DEV_VENDOR_MASK, ID_DEV_VENDOR_MASK, "Adaptec 2940A/CN Ultra SCSI adapter", ahc_aic7860_setup }, { ID_AHA_2930C_VAR & ID_DEV_VENDOR_MASK, ID_DEV_VENDOR_MASK, "Adaptec 2930C Ultra SCSI adapter (VAR)", ahc_aic7860_setup }, /* aic7870 based controllers */ { ID_AHA_2940, ID_ALL_MASK, "Adaptec 2940 SCSI adapter", ahc_aic7870_setup }, { ID_AHA_3940, ID_ALL_MASK, "Adaptec 3940 SCSI adapter", ahc_aha394X_setup }, { ID_AHA_398X, ID_ALL_MASK, "Adaptec 398X SCSI RAID adapter", ahc_aha398X_setup }, { ID_AHA_2944, ID_ALL_MASK, "Adaptec 2944 SCSI adapter", ahc_aic7870_setup }, { ID_AHA_3944, ID_ALL_MASK, "Adaptec 3944 SCSI adapter", ahc_aha394X_setup }, { ID_AHA_4944, ID_ALL_MASK, "Adaptec 4944 SCSI adapter", ahc_aha494X_setup }, /* aic7880 based controllers */ { ID_AHA_2940U & ID_DEV_VENDOR_MASK, ID_DEV_VENDOR_MASK, "Adaptec 2940 Ultra SCSI adapter", ahc_aic7880_setup }, { ID_AHA_3940U & ID_DEV_VENDOR_MASK, ID_DEV_VENDOR_MASK, "Adaptec 3940 Ultra SCSI adapter", ahc_aha394XU_setup }, { ID_AHA_2944U & ID_DEV_VENDOR_MASK, ID_DEV_VENDOR_MASK, "Adaptec 2944 Ultra SCSI adapter", ahc_aic7880_setup }, { ID_AHA_3944U & ID_DEV_VENDOR_MASK, ID_DEV_VENDOR_MASK, "Adaptec 3944 Ultra SCSI adapter", ahc_aha394XU_setup }, { ID_AHA_398XU & ID_DEV_VENDOR_MASK, ID_DEV_VENDOR_MASK, "Adaptec 398X Ultra SCSI RAID adapter", ahc_aha398XU_setup }, { /* * XXX Don't know the slot numbers * so we can't identify channels */ ID_AHA_4944U & ID_DEV_VENDOR_MASK, ID_DEV_VENDOR_MASK, "Adaptec 4944 Ultra SCSI adapter", ahc_aic7880_setup }, { ID_AHA_2930U & ID_DEV_VENDOR_MASK, ID_DEV_VENDOR_MASK, "Adaptec 2930 Ultra SCSI adapter", ahc_aic7880_setup }, { ID_AHA_2940U_PRO & ID_DEV_VENDOR_MASK, ID_DEV_VENDOR_MASK, "Adaptec 2940 Pro Ultra SCSI adapter", ahc_aha2940Pro_setup }, { ID_AHA_2940U_CN & ID_DEV_VENDOR_MASK, ID_DEV_VENDOR_MASK, "Adaptec 2940/CN Ultra SCSI adapter", ahc_aic7880_setup }, /* Ignore all SISL (AAC on MB) based controllers. */ { ID_9005_SISL_ID, ID_9005_SISL_MASK, NULL, NULL }, /* aic7890 based controllers */ { ID_AHA_2930U2, ID_ALL_MASK, "Adaptec 2930 Ultra2 SCSI adapter", ahc_aic7890_setup }, { ID_AHA_2940U2B, ID_ALL_MASK, "Adaptec 2940B Ultra2 SCSI adapter", ahc_aic7890_setup }, { ID_AHA_2940U2_OEM, ID_ALL_MASK, "Adaptec 2940 Ultra2 SCSI adapter (OEM)", ahc_aic7890_setup }, { ID_AHA_2940U2, ID_ALL_MASK, "Adaptec 2940 Ultra2 SCSI adapter", ahc_aic7890_setup }, { ID_AHA_2950U2B, ID_ALL_MASK, "Adaptec 2950 Ultra2 SCSI adapter", ahc_aic7890_setup }, { ID_AIC7890_ARO, ID_ALL_MASK, "Adaptec aic7890/91 Ultra2 SCSI adapter (ARO)", ahc_aic7890_setup }, { ID_AAA_131U2, ID_ALL_MASK, "Adaptec AAA-131 Ultra2 RAID adapter", ahc_aic7890_setup }, /* aic7892 based controllers */ { ID_AHA_29160, ID_ALL_MASK, "Adaptec 29160 Ultra160 SCSI adapter", ahc_aic7892_setup }, { ID_AHA_29160_CPQ, ID_ALL_MASK, "Adaptec (Compaq OEM) 29160 Ultra160 SCSI adapter", ahc_aic7892_setup }, { ID_AHA_29160N, ID_ALL_MASK, "Adaptec 29160N Ultra160 SCSI adapter", ahc_aic7892_setup }, { ID_AHA_29160C, ID_ALL_MASK, "Adaptec 29160C Ultra160 SCSI adapter", ahc_aha29160C_setup }, { ID_AHA_29160B, ID_ALL_MASK, "Adaptec 29160B Ultra160 SCSI adapter", ahc_aic7892_setup }, { ID_AHA_19160B, ID_ALL_MASK, "Adaptec 19160B Ultra160 SCSI adapter", ahc_aic7892_setup }, { ID_AIC7892_ARO, ID_ALL_MASK, "Adaptec aic7892 Ultra160 SCSI adapter (ARO)", ahc_aic7892_setup }, /* aic7895 based controllers */ { ID_AHA_2940U_DUAL, ID_ALL_MASK, "Adaptec 2940/DUAL Ultra SCSI adapter", ahc_aic7895_setup }, { ID_AHA_3940AU, ID_ALL_MASK, "Adaptec 3940A Ultra SCSI adapter", ahc_aic7895_setup }, { ID_AHA_3944AU, ID_ALL_MASK, "Adaptec 3944A Ultra SCSI adapter", ahc_aic7895_setup }, { ID_AIC7895_ARO, ID_AIC7895_ARO_MASK, "Adaptec aic7895 Ultra SCSI adapter (ARO)", ahc_aic7895_setup }, /* aic7896/97 based controllers */ { ID_AHA_3950U2B_0, ID_ALL_MASK, "Adaptec 3950B Ultra2 SCSI adapter", ahc_aic7896_setup }, { ID_AHA_3950U2B_1, ID_ALL_MASK, "Adaptec 3950B Ultra2 SCSI adapter", ahc_aic7896_setup }, { ID_AHA_3950U2D_0, ID_ALL_MASK, "Adaptec 3950D Ultra2 SCSI adapter", ahc_aic7896_setup }, { ID_AHA_3950U2D_1, ID_ALL_MASK, "Adaptec 3950D Ultra2 SCSI adapter", ahc_aic7896_setup }, { ID_AIC7896_ARO, ID_ALL_MASK, "Adaptec aic7896/97 Ultra2 SCSI adapter (ARO)", ahc_aic7896_setup }, /* aic7899 based controllers */ { ID_AHA_3960D, ID_ALL_MASK, "Adaptec 3960D Ultra160 SCSI adapter", ahc_aic7899_setup }, { ID_AHA_3960D_CPQ, ID_ALL_MASK, "Adaptec (Compaq OEM) 3960D Ultra160 SCSI adapter", ahc_aic7899_setup }, { ID_AIC7899_ARO, ID_ALL_MASK, "Adaptec aic7899 Ultra160 SCSI adapter (ARO)", ahc_aic7899_setup }, /* Generic chip probes for devices we don't know 'exactly' */ { ID_AIC7850 & ID_DEV_VENDOR_MASK, ID_DEV_VENDOR_MASK, "Adaptec aic7850 SCSI adapter", ahc_aic785X_setup }, { ID_AIC7855 & ID_DEV_VENDOR_MASK, ID_DEV_VENDOR_MASK, "Adaptec aic7855 SCSI adapter", ahc_aic785X_setup },
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -