⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aic7xxx_pci.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 4 页
字号:
/* * 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#69 $ * * $FreeBSD$ */#ifdef __linux__#include "aic7xxx_osm.h"#include "aic7xxx_inline.h"#include "aic7xxx_93cx6.h"#else#include <dev/aic7xxx/aic7xxx_osm.h>#include <dev/aic7xxx/aic7xxx_inline.h>#include <dev/aic7xxx/aic7xxx_93cx6.h>#endif#include "aic7xxx_pci.h"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 AHC_PCI_IOADDR	PCIR_MAPS	/* I/O Address */#define AHC_PCI_MEMADDR	(PCIR_MAPS + 4)	/* Mem I/O Address */#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 * certain, 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_20C_30C,		ID_ALL_MASK,		"Adaptec 2902/04/10/15/20C/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	},	{		ID_AIC7859 & ID_DEV_VENDOR_MASK,		ID_DEV_VENDOR_MASK,		"Adaptec aic7859 SCSI adapter",		ahc_aic7860_setup	},	{		ID_AIC7860 & ID_DEV_VENDOR_MASK,		ID_DEV_VENDOR_MASK,		"Adaptec aic7860 Ultra SCSI adapter",		ahc_aic7860_setup	},	{		ID_AIC7870 & ID_DEV_VENDOR_MASK,		ID_DEV_VENDOR_MASK,		"Adaptec aic7870 SCSI adapter",		ahc_aic7870_setup	},	{		ID_AIC7880 & ID_DEV_VENDOR_MASK,		ID_DEV_VENDOR_MASK,		"Adaptec aic7880 Ultra SCSI adapter",		ahc_aic7880_setup	},	{		ID_AIC7890 & ID_9005_GENERIC_MASK,		ID_9005_GENERIC_MASK,		"Adaptec aic7890/91 Ultra2 SCSI adapter",		ahc_aic7890_setup	},	{		ID_AIC7892 & ID_9005_GENERIC_MASK,		ID_9005_GENERIC_MASK,		"Adaptec aic7892 Ultra160 SCSI adapter",		ahc_aic7892_setup	},	{		ID_AIC7895 & ID_DEV_VENDOR_MASK,		ID_DEV_VENDOR_MASK,		"Adaptec aic7895 Ultra SCSI adapter",		ahc_aic7895_setup	},	{		ID_AIC7896 & ID_9005_GENERIC_MASK,		ID_9005_GENERIC_MASK,		"Adaptec aic7896/97 Ultra2 SCSI adapter",		ahc_aic7896_setup	},	{		ID_AIC7899 & ID_9005_GENERIC_MASK,		ID_9005_GENERIC_MASK,		"Adaptec aic7899 Ultra160 SCSI adapter",		ahc_aic7899_setup	},	{		ID_AIC7810 & ID_DEV_VENDOR_MASK,		ID_DEV_VENDOR_MASK,		"Adaptec aic7810 RAID memory controller",		ahc_raid_setup	},	{		ID_AIC7815 & ID_DEV_VENDOR_MASK,		ID_DEV_VENDOR_MASK,		"Adaptec aic7815 RAID memory controller",		ahc_raid_setup	}};const u_int ahc_num_pci_devs = NUM_ELEMENTS(ahc_pci_ident_table);		#define AHC_394X_SLOT_CHANNEL_A	4#define AHC_394X_SLOT_CHANNEL_B	5#define AHC_398X_SLOT_CHANNEL_A	4#define AHC_398X_SLOT_CHANNEL_B	8#define AHC_398X_SLOT_CHANNEL_C	12#define AHC_494X_SLOT_CHANNEL_A	4#define AHC_494X_SLOT_CHANNEL_B	5#define AHC_494X_SLOT_CHANNEL_C	6#define AHC_494X_SLOT_CHANNEL_D	7#define	DEVCONFIG		0x40#define		PCIERRGENDIS	0x80000000ul#define		SCBSIZE32	0x00010000ul	/* aic789X only */#define		REXTVALID	0x00001000ul	/* ultra cards only */#define		MPORTMODE	0x00000400ul	/* aic7870+ only */#define		RAMPSM		0x00000200ul	/* aic7870+ only */#define		VOLSENSE	0x00000100ul#define		PCI64BIT	0x00000080ul	/* 64Bit PCI bus (Ultra2 Only)*/#define		SCBRAMSEL	0x00000080ul#define		MRDCEN		0x00000040ul#define		EXTSCBTIME	0x00000020ul	/* aic7870 only */#define		EXTSCBPEN	0x00000010ul	/* aic7870 only */#define		BERREN		0x00000008ul#define		DACEN		0x00000004ul#define		STPWLEVEL	0x00000002ul#define		DIFACTNEGEN	0x00000001ul	/* aic7870 only */#define	CSIZE_LATTIME		0x0c#define		CACHESIZE	0x0000003ful	/* only 5 bits */#define		LATTIME		0x0000ff00ul/* PCI STATUS definitions */#define	DPE	0x80#define SSE	0x40#define	RMA	0x20#define	RTA	0x10#define STA	0x08#define DPR	0x01static int ahc_9005_subdevinfo_valid(uint16_t vendor, uint16_t device,				     uint16_t subvendor, uint16_t subdevice);static int ahc_ext_scbram_present(struct ahc_softc *ahc);static void ahc_scbram_config(struct ahc_softc *ahc, int enable,				  int pcheck, int fast, int large);static void ahc_probe_ext_scbram(struct ahc_softc *ahc);static void check_extport(struct ahc_softc *ahc, u_int *sxfrctl1);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -