aic79xx_pci.c (7964930201483ce53d7504857bde9d10f09bff95) | aic79xx_pci.c (17d2475554610175f0673ee69aa703ce3972909b) |
---|---|
1/*- | 1/* |
2 * Product specific probe and attach routines for: 3 * aic7901 and aic7902 SCSI controllers 4 * 5 * Copyright (c) 1994-2001 Justin T. Gibbs. | 2 * Product specific probe and attach routines for: 3 * aic7901 and aic7902 SCSI controllers 4 * 5 * Copyright (c) 1994-2001 Justin T. Gibbs. |
6 * Copyright (c) 2000-2002 Adaptec Inc. | 6 * Copyright (c) 2000-2001 Adaptec Inc. |
7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions, and the following disclaimer, 14 * without modification. --- 18 unchanged lines hidden (view full) --- 33 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 34 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 35 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 37 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 38 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 39 * POSSIBILITY OF SUCH DAMAGES. 40 * | 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions, and the following disclaimer, 14 * without modification. --- 18 unchanged lines hidden (view full) --- 33 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 34 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 35 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 37 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 38 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 39 * POSSIBILITY OF SUCH DAMAGES. 40 * |
41 * $Id: //depot/aic7xxx/aic7xxx/aic79xx_pci.c#88 $ | 41 * $Id: //depot/aic7xxx/aic7xxx/aic79xx_pci.c#32 $ 42 * 43 * $FreeBSD$ |
42 */ 43 44#ifdef __linux__ 45#include "aic79xx_osm.h" 46#include "aic79xx_inline.h" 47#else | 44 */ 45 46#ifdef __linux__ 47#include "aic79xx_osm.h" 48#include "aic79xx_inline.h" 49#else |
48#include <sys/cdefs.h> 49__FBSDID("$FreeBSD$"); | |
50#include <dev/aic7xxx/aic79xx_osm.h> 51#include <dev/aic7xxx/aic79xx_inline.h> 52#endif 53 54static __inline uint64_t 55ahd_compose_id(u_int device, u_int vendor, u_int subdevice, u_int subvendor) 56{ 57 uint64_t id; 58 59 id = subvendor 60 | (subdevice << 16) 61 | ((uint64_t)vendor << 32) 62 | ((uint64_t)device << 48); 63 64 return (id); 65} 66 67#define ID_ALL_MASK 0xFFFFFFFFFFFFFFFFull | 50#include <dev/aic7xxx/aic79xx_osm.h> 51#include <dev/aic7xxx/aic79xx_inline.h> 52#endif 53 54static __inline uint64_t 55ahd_compose_id(u_int device, u_int vendor, u_int subdevice, u_int subvendor) 56{ 57 uint64_t id; 58 59 id = subvendor 60 | (subdevice << 16) 61 | ((uint64_t)vendor << 32) 62 | ((uint64_t)device << 48); 63 64 return (id); 65} 66 67#define ID_ALL_MASK 0xFFFFFFFFFFFFFFFFull |
68#define ID_ALL_IROC_MASK 0xFF7FFFFFFFFFFFFFull | |
69#define ID_DEV_VENDOR_MASK 0xFFFFFFFF00000000ull 70#define ID_9005_GENERIC_MASK 0xFFF0FFFF00000000ull | 68#define ID_DEV_VENDOR_MASK 0xFFFFFFFF00000000ull 69#define ID_9005_GENERIC_MASK 0xFFF0FFFF00000000ull |
71#define ID_9005_GENERIC_IROC_MASK 0xFF70FFFF00000000ull | |
72 73#define ID_AIC7901 0x800F9005FFFF9005ull | 70 71#define ID_AIC7901 0x800F9005FFFF9005ull |
74#define ID_AHA_29320A 0x8000900500609005ull 75#define ID_AHA_29320ALP 0x8017900500449005ull | 72#define ID_AIC7901_IROC 0x80089005FFFF9005ull 73#define ID_AHA_29320 0x8000900500609005ull 74#define ID_AHA_29320LP 0x8000900500409005ull |
76 | 75 |
77#define ID_AIC7901A 0x801E9005FFFF9005ull 78#define ID_AHA_29320LP 0x8014900500449005ull 79 | |
80#define ID_AIC7902 0x801F9005FFFF9005ull | 76#define ID_AIC7902 0x801F9005FFFF9005ull |
81#define ID_AIC7902_B 0x801D9005FFFF9005ull | 77#define ID_AIC7902_IROC 0x80189005FFFF9005ull |
82#define ID_AHA_39320 0x8010900500409005ull | 78#define ID_AHA_39320 0x8010900500409005ull |
83#define ID_AHA_29320 0x8012900500429005ull 84#define ID_AHA_29320B 0x8013900500439005ull 85#define ID_AHA_39320_B 0x8015900500409005ull 86#define ID_AHA_39320_B_DELL 0x8015900501681028ull 87#define ID_AHA_39320A 0x8016900500409005ull | |
88#define ID_AHA_39320D 0x8011900500419005ull | 79#define ID_AHA_39320D 0x8011900500419005ull |
89#define ID_AHA_39320D_B 0x801C900500419005ull 90#define ID_AHA_39320D_HP 0x8011900500AC0E11ull 91#define ID_AHA_39320D_B_HP 0x801C900500AC0E11ull 92#define ID_AHA_39320LPE 0x8017900500459005ull | 80#define ID_AHA_39320D_CPQ 0x8011900500AC0E11ull 81#define ID_AIC7902_PCI_REV_A3 0x2 |
93#define ID_AIC7902_PCI_REV_A4 0x3 | 82#define ID_AIC7902_PCI_REV_A4 0x3 |
94#define ID_AIC7902_PCI_REV_B0 0x10 95#define SUBID_HP 0x0E11 | 83#define ID_AIC7902_PCI_REV_B0 0xFF /* Rev Id not yet known. */ 84#define SUBID_CPQ 0x0E11 |
96 | 85 |
97#define DEVID_9005_HOSTRAID(id) ((id) & 0x80) 98 | |
99#define DEVID_9005_TYPE(id) ((id) & 0xF) 100#define DEVID_9005_TYPE_HBA 0x0 /* Standard Card */ 101#define DEVID_9005_TYPE_HBA_2EXT 0x1 /* 2 External Ports */ | 86#define DEVID_9005_TYPE(id) ((id) & 0xF) 87#define DEVID_9005_TYPE_HBA 0x0 /* Standard Card */ 88#define DEVID_9005_TYPE_HBA_2EXT 0x1 /* 2 External Ports */ |
89#define DEVID_9005_TYPE_IROC 0x8 /* Raid(0,1,10) Card */ |
|
102#define DEVID_9005_TYPE_MB 0xF /* On Motherboard */ 103 104#define DEVID_9005_MFUNC(id) ((id) & 0x10) 105 106#define DEVID_9005_PACKETIZED(id) ((id) & 0x8000) 107 108#define SUBID_9005_TYPE(id) ((id) & 0xF) 109#define SUBID_9005_TYPE_HBA 0x0 /* Standard Card */ 110#define SUBID_9005_TYPE_MB 0xF /* On Motherboard */ 111 112#define SUBID_9005_AUTOTERM(id) (((id) & 0x10) == 0) 113 114#define SUBID_9005_LEGACYCONN_FUNC(id) ((id) & 0x20) 115 116#define SUBID_9005_SEEPTYPE(id) ((id) & 0x0C0) >> 6) 117#define SUBID_9005_SEEPTYPE_NONE 0x0 118#define SUBID_9005_SEEPTYPE_4K 0x1 119 120static ahd_device_setup_t ahd_aic7901_setup; | 90#define DEVID_9005_TYPE_MB 0xF /* On Motherboard */ 91 92#define DEVID_9005_MFUNC(id) ((id) & 0x10) 93 94#define DEVID_9005_PACKETIZED(id) ((id) & 0x8000) 95 96#define SUBID_9005_TYPE(id) ((id) & 0xF) 97#define SUBID_9005_TYPE_HBA 0x0 /* Standard Card */ 98#define SUBID_9005_TYPE_MB 0xF /* On Motherboard */ 99 100#define SUBID_9005_AUTOTERM(id) (((id) & 0x10) == 0) 101 102#define SUBID_9005_LEGACYCONN_FUNC(id) ((id) & 0x20) 103 104#define SUBID_9005_SEEPTYPE(id) ((id) & 0x0C0) >> 6) 105#define SUBID_9005_SEEPTYPE_NONE 0x0 106#define SUBID_9005_SEEPTYPE_4K 0x1 107 108static ahd_device_setup_t ahd_aic7901_setup; |
121static ahd_device_setup_t ahd_aic7901A_setup; | |
122static ahd_device_setup_t ahd_aic7902_setup; | 109static ahd_device_setup_t ahd_aic7902_setup; |
123static ahd_device_setup_t ahd_aic790X_setup; | |
124 125struct ahd_pci_identity ahd_pci_ident_table [] = 126{ 127 /* aic7901 based controllers */ 128 { | 110 111struct ahd_pci_identity ahd_pci_ident_table [] = 112{ 113 /* aic7901 based controllers */ 114 { |
129 ID_AHA_29320A, | 115 ID_AHA_29320, |
130 ID_ALL_MASK, | 116 ID_ALL_MASK, |
131 "Adaptec 29320A Ultra320 SCSI adapter", | 117 "Adaptec 29320 Ultra320 SCSI adapter", |
132 ahd_aic7901_setup 133 }, 134 { | 118 ahd_aic7901_setup 119 }, 120 { |
135 ID_AHA_29320ALP, 136 ID_ALL_MASK, 137 "Adaptec 29320ALP Ultra320 SCSI adapter", 138 ahd_aic7901_setup 139 }, 140 /* aic7901A based controllers */ 141 { | |
142 ID_AHA_29320LP, 143 ID_ALL_MASK, 144 "Adaptec 29320LP Ultra320 SCSI adapter", | 121 ID_AHA_29320LP, 122 ID_ALL_MASK, 123 "Adaptec 29320LP Ultra320 SCSI adapter", |
145 ahd_aic7901A_setup | 124 ahd_aic7901_setup |
146 }, 147 /* aic7902 based controllers */ 148 { | 125 }, 126 /* aic7902 based controllers */ 127 { |
149 ID_AHA_29320, 150 ID_ALL_MASK, 151 "Adaptec 29320 Ultra320 SCSI adapter", 152 ahd_aic7902_setup 153 }, 154 { 155 ID_AHA_29320B, 156 ID_ALL_MASK, 157 "Adaptec 29320B Ultra320 SCSI adapter", 158 ahd_aic7902_setup 159 }, 160 { | |
161 ID_AHA_39320, 162 ID_ALL_MASK, 163 "Adaptec 39320 Ultra320 SCSI adapter", 164 ahd_aic7902_setup 165 }, 166 { | 128 ID_AHA_39320, 129 ID_ALL_MASK, 130 "Adaptec 39320 Ultra320 SCSI adapter", 131 ahd_aic7902_setup 132 }, 133 { |
167 ID_AHA_39320_B, 168 ID_ALL_MASK, 169 "Adaptec 39320 Ultra320 SCSI adapter", 170 ahd_aic7902_setup 171 }, 172 { 173 ID_AHA_39320_B_DELL, 174 ID_ALL_MASK, 175 "Adaptec (Dell OEM) 39320 Ultra320 SCSI adapter", 176 ahd_aic7902_setup 177 }, 178 { 179 ID_AHA_39320A, 180 ID_ALL_MASK, 181 "Adaptec 39320A Ultra320 SCSI adapter", 182 ahd_aic7902_setup 183 }, 184 { | |
185 ID_AHA_39320D, 186 ID_ALL_MASK, 187 "Adaptec 39320D Ultra320 SCSI adapter", 188 ahd_aic7902_setup 189 }, 190 { | 134 ID_AHA_39320D, 135 ID_ALL_MASK, 136 "Adaptec 39320D Ultra320 SCSI adapter", 137 ahd_aic7902_setup 138 }, 139 { |
191 ID_AHA_39320D_HP, | 140 ID_AHA_39320D_CPQ, |
192 ID_ALL_MASK, | 141 ID_ALL_MASK, |
193 "Adaptec (HP OEM) 39320D Ultra320 SCSI adapter", | 142 "Adaptec (Compaq OEM) 39320D Ultra320 SCSI adapter", |
194 ahd_aic7902_setup 195 }, | 143 ahd_aic7902_setup 144 }, |
196 { 197 ID_AHA_39320D_B, 198 ID_ALL_MASK, 199 "Adaptec 39320D Ultra320 SCSI adapter", 200 ahd_aic7902_setup 201 }, 202 { 203 ID_AHA_39320D_B_HP, 204 ID_ALL_MASK, 205 "Adaptec (HP OEM) 39320D Ultra320 SCSI adapter", 206 ahd_aic7902_setup 207 }, 208 { 209 ID_AHA_39320LPE, 210 ID_ALL_MASK, 211 "Adaptec 39320LPE Ultra320 SCSI adapter", 212 ahd_aic7902_setup 213 }, | |
214 /* Generic chip probes for devices we don't know 'exactly' */ 215 { 216 ID_AIC7901 & ID_9005_GENERIC_MASK, 217 ID_9005_GENERIC_MASK, | 145 /* Generic chip probes for devices we don't know 'exactly' */ 146 { 147 ID_AIC7901 & ID_9005_GENERIC_MASK, 148 ID_9005_GENERIC_MASK, |
218 "Adaptec AIC7901 Ultra320 SCSI adapter", | 149 "Adaptec aic7901 Ultra320 SCSI adapter", |
219 ahd_aic7901_setup 220 }, 221 { | 150 ahd_aic7901_setup 151 }, 152 { |
222 ID_AIC7901A & ID_DEV_VENDOR_MASK, 223 ID_DEV_VENDOR_MASK, 224 "Adaptec AIC7901A Ultra320 SCSI adapter", 225 ahd_aic7901A_setup 226 }, 227 { | |
228 ID_AIC7902 & ID_9005_GENERIC_MASK, 229 ID_9005_GENERIC_MASK, | 153 ID_AIC7902 & ID_9005_GENERIC_MASK, 154 ID_9005_GENERIC_MASK, |
230 "Adaptec AIC7902 Ultra320 SCSI adapter", | 155 "Adaptec aic7902 Ultra320 SCSI adapter", |
231 ahd_aic7902_setup 232 } 233}; 234 235const u_int ahd_num_pci_devs = NUM_ELEMENTS(ahd_pci_ident_table); 236 237#define DEVCONFIG 0x40 238#define PCIXINITPAT 0x0000E000ul --- 4 unchanged lines hidden (view full) --- 243#define PCI_BUS_MODES_INDEX(devconfig) \ 244 (((devconfig) & PCIXINITPAT) >> 13) 245static const char *pci_bus_modes[] = 246{ 247 "PCI bus mode unknown", 248 "PCI bus mode unknown", 249 "PCI bus mode unknown", 250 "PCI bus mode unknown", | 156 ahd_aic7902_setup 157 } 158}; 159 160const u_int ahd_num_pci_devs = NUM_ELEMENTS(ahd_pci_ident_table); 161 162#define DEVCONFIG 0x40 163#define PCIXINITPAT 0x0000E000ul --- 4 unchanged lines hidden (view full) --- 168#define PCI_BUS_MODES_INDEX(devconfig) \ 169 (((devconfig) & PCIXINITPAT) >> 13) 170static const char *pci_bus_modes[] = 171{ 172 "PCI bus mode unknown", 173 "PCI bus mode unknown", 174 "PCI bus mode unknown", 175 "PCI bus mode unknown", |
251 "PCI-X 101-133MHz", 252 "PCI-X 67-100MHz", 253 "PCI-X 50-66MHz", 254 "PCI 33 or 66MHz" | 176 "PCI-X 101-133Mhz", 177 "PCI-X 67-100Mhz", 178 "PCI-X 50-66Mhz", 179 "PCI 33 or 66Mhz" |
255}; 256 257#define TESTMODE 0x00000800ul 258#define IRDY_RST 0x00000200ul 259#define FRAME_RST 0x00000100ul 260#define PCI64BIT 0x00000080ul 261#define MRDCEN 0x00000040ul 262#define ENDIANSEL 0x00000020ul --- 10 unchanged lines hidden (view full) --- 273#define LATTIME 0x0000ff00ul 274 275static int ahd_check_extport(struct ahd_softc *ahd); 276static void ahd_configure_termination(struct ahd_softc *ahd, 277 u_int adapter_control); 278static void ahd_pci_split_intr(struct ahd_softc *ahd, u_int intstat); 279 280struct ahd_pci_identity * | 180}; 181 182#define TESTMODE 0x00000800ul 183#define IRDY_RST 0x00000200ul 184#define FRAME_RST 0x00000100ul 185#define PCI64BIT 0x00000080ul 186#define MRDCEN 0x00000040ul 187#define ENDIANSEL 0x00000020ul --- 10 unchanged lines hidden (view full) --- 198#define LATTIME 0x0000ff00ul 199 200static int ahd_check_extport(struct ahd_softc *ahd); 201static void ahd_configure_termination(struct ahd_softc *ahd, 202 u_int adapter_control); 203static void ahd_pci_split_intr(struct ahd_softc *ahd, u_int intstat); 204 205struct ahd_pci_identity * |
281ahd_find_pci_device(aic_dev_softc_t pci) | 206ahd_find_pci_device(ahd_dev_softc_t pci) |
282{ 283 uint64_t full_id; 284 uint16_t device; 285 uint16_t vendor; 286 uint16_t subdevice; 287 uint16_t subvendor; 288 struct ahd_pci_identity *entry; 289 u_int i; 290 | 207{ 208 uint64_t full_id; 209 uint16_t device; 210 uint16_t vendor; 211 uint16_t subdevice; 212 uint16_t subvendor; 213 struct ahd_pci_identity *entry; 214 u_int i; 215 |
291 vendor = aic_pci_read_config(pci, PCIR_DEVVENDOR, /*bytes*/2); 292 device = aic_pci_read_config(pci, PCIR_DEVICE, /*bytes*/2); 293 subvendor = aic_pci_read_config(pci, PCIR_SUBVEND_0, /*bytes*/2); 294 subdevice = aic_pci_read_config(pci, PCIR_SUBDEV_0, /*bytes*/2); | 216 vendor = ahd_pci_read_config(pci, PCIR_DEVVENDOR, /*bytes*/2); 217 device = ahd_pci_read_config(pci, PCIR_DEVICE, /*bytes*/2); 218 subvendor = ahd_pci_read_config(pci, PCIR_SUBVEND_0, /*bytes*/2); 219 subdevice = ahd_pci_read_config(pci, PCIR_SUBDEV_0, /*bytes*/2); |
295 full_id = ahd_compose_id(device, 296 vendor, 297 subdevice, 298 subvendor); 299 | 220 full_id = ahd_compose_id(device, 221 vendor, 222 subdevice, 223 subvendor); 224 |
300 /* 301 * If we are configured to attach to HostRAID 302 * controllers, mask out the IROC/HostRAID bit 303 * in the 304 */ 305 if (ahd_attach_to_HostRAID_controllers) 306 full_id &= ID_ALL_IROC_MASK; 307 | |
308 for (i = 0; i < ahd_num_pci_devs; i++) { 309 entry = &ahd_pci_ident_table[i]; 310 if (entry->full_id == (full_id & entry->id_mask)) { 311 /* Honor exclusion entries. */ 312 if (entry->name == NULL) 313 return (NULL); 314 return (entry); 315 } 316 } 317 return (NULL); 318} 319 320int 321ahd_pci_config(struct ahd_softc *ahd, struct ahd_pci_identity *entry) 322{ 323 struct scb_data *shared_scb_data; | 225 for (i = 0; i < ahd_num_pci_devs; i++) { 226 entry = &ahd_pci_ident_table[i]; 227 if (entry->full_id == (full_id & entry->id_mask)) { 228 /* Honor exclusion entries. */ 229 if (entry->name == NULL) 230 return (NULL); 231 return (entry); 232 } 233 } 234 return (NULL); 235} 236 237int 238ahd_pci_config(struct ahd_softc *ahd, struct ahd_pci_identity *entry) 239{ 240 struct scb_data *shared_scb_data; |
241 u_long l; 242 u_long s; |
|
324 u_int command; 325 uint32_t devconfig; | 243 u_int command; 244 uint32_t devconfig; |
326 uint16_t device; | |
327 uint16_t subvendor; 328 int error; 329 330 shared_scb_data = NULL; | 245 uint16_t subvendor; 246 int error; 247 248 shared_scb_data = NULL; |
331 ahd->description = entry->name; 332 /* 333 * Record if this is a HostRAID board. 334 */ 335 device = aic_pci_read_config(ahd->dev_softc, 336 PCIR_DEVICE, /*bytes*/2); 337 if (DEVID_9005_HOSTRAID(device)) 338 ahd->flags |= AHD_HOSTRAID_BOARD; 339 340 /* 341 * Record if this is an HP board. 342 */ 343 subvendor = aic_pci_read_config(ahd->dev_softc, 344 PCIR_SUBVEND_0, /*bytes*/2); 345 if (subvendor == SUBID_HP) 346 ahd->flags |= AHD_HP_BOARD; 347 | |
348 error = entry->setup(ahd); 349 if (error != 0) 350 return (error); | 249 error = entry->setup(ahd); 250 if (error != 0) 251 return (error); |
351 352 /* 353 * Find the PCI-X cap pointer. If we don't find it, 354 * pcix_ptr will be 0. 355 */ 356 pci_find_extcap(ahd->dev_softc, PCIY_PCIX, &ahd->pcix_ptr); 357 devconfig = aic_pci_read_config(ahd->dev_softc, DEVCONFIG, /*bytes*/4); | 252 253 ahd->description = entry->name; 254 devconfig = ahd_pci_read_config(ahd->dev_softc, DEVCONFIG, /*bytes*/4); |
358 if ((devconfig & PCIXINITPAT) == PCIXINIT_PCI33_66) { 359 ahd->chip |= AHD_PCI; 360 /* Disable PCIX workarounds when running in PCI mode. */ 361 ahd->bugs &= ~AHD_PCIX_BUG_MASK; 362 } else { 363 ahd->chip |= AHD_PCIX; | 255 if ((devconfig & PCIXINITPAT) == PCIXINIT_PCI33_66) { 256 ahd->chip |= AHD_PCI; 257 /* Disable PCIX workarounds when running in PCI mode. */ 258 ahd->bugs &= ~AHD_PCIX_BUG_MASK; 259 } else { 260 ahd->chip |= AHD_PCIX; |
364 if (ahd->pcix_ptr == 0) 365 return (ENXIO); | |
366 } 367 ahd->bus_description = pci_bus_modes[PCI_BUS_MODES_INDEX(devconfig)]; 368 | 261 } 262 ahd->bus_description = pci_bus_modes[PCI_BUS_MODES_INDEX(devconfig)]; 263 |
369 aic_power_state_change(ahd, AIC_POWER_STATE_D0); | 264 /* 265 * Record if this is a Compaq board. 266 */ 267 subvendor = ahd_pci_read_config(ahd->dev_softc, 268 PCIR_SUBVEND_0, /*bytes*/2); 269 if (subvendor == SUBID_CPQ) 270 ahd->flags |= AHD_CPQ_BOARD; |
370 | 271 |
272 ahd_power_state_change(ahd, AHD_POWER_STATE_D0); 273 |
|
371 error = ahd_pci_map_registers(ahd); 372 if (error != 0) 373 return (error); 374 375 /* 376 * If we need to support high memory, enable dual 377 * address cycles. This bit must be set to enable 378 * high address bit generation even if we are on a 379 * 64bit bus (PCI64BIT set in devconfig). 380 */ 381 if ((ahd->flags & (AHD_39BIT_ADDRESSING|AHD_64BIT_ADDRESSING)) != 0) { 382 uint32_t devconfig; 383 384 if (bootverbose) 385 printf("%s: Enabling 39Bit Addressing\n", 386 ahd_name(ahd)); | 274 error = ahd_pci_map_registers(ahd); 275 if (error != 0) 276 return (error); 277 278 /* 279 * If we need to support high memory, enable dual 280 * address cycles. This bit must be set to enable 281 * high address bit generation even if we are on a 282 * 64bit bus (PCI64BIT set in devconfig). 283 */ 284 if ((ahd->flags & (AHD_39BIT_ADDRESSING|AHD_64BIT_ADDRESSING)) != 0) { 285 uint32_t devconfig; 286 287 if (bootverbose) 288 printf("%s: Enabling 39Bit Addressing\n", 289 ahd_name(ahd)); |
387 devconfig = aic_pci_read_config(ahd->dev_softc, | 290 devconfig = ahd_pci_read_config(ahd->dev_softc, |
388 DEVCONFIG, /*bytes*/4); 389 devconfig |= DACEN; | 291 DEVCONFIG, /*bytes*/4); 292 devconfig |= DACEN; |
390 aic_pci_write_config(ahd->dev_softc, DEVCONFIG, | 293 ahd_pci_write_config(ahd->dev_softc, DEVCONFIG, |
391 devconfig, /*bytes*/4); 392 } 393 394 /* Ensure busmastering is enabled */ | 294 devconfig, /*bytes*/4); 295 } 296 297 /* Ensure busmastering is enabled */ |
395 command = aic_pci_read_config(ahd->dev_softc, PCIR_COMMAND, /*bytes*/2); | 298 command = ahd_pci_read_config(ahd->dev_softc, PCIR_COMMAND, /*bytes*/1); |
396 command |= PCIM_CMD_BUSMASTEREN; | 299 command |= PCIM_CMD_BUSMASTEREN; |
397 aic_pci_write_config(ahd->dev_softc, PCIR_COMMAND, command, /*bytes*/2); | 300 ahd_pci_write_config(ahd->dev_softc, PCIR_COMMAND, command, /*bytes*/1); |
398 399 error = ahd_softc_init(ahd); 400 if (error != 0) 401 return (error); 402 403 ahd->bus_intr = ahd_pci_intr; 404 | 301 302 error = ahd_softc_init(ahd); 303 if (error != 0) 304 return (error); 305 306 ahd->bus_intr = ahd_pci_intr; 307 |
405 error = ahd_reset(ahd, /*reinit*/FALSE); | 308 error = ahd_reset(ahd); |
406 if (error != 0) 407 return (ENXIO); 408 409 ahd->pci_cachesize = | 309 if (error != 0) 310 return (ENXIO); 311 312 ahd->pci_cachesize = |
410 aic_pci_read_config(ahd->dev_softc, CSIZE_LATTIME, | 313 ahd_pci_read_config(ahd->dev_softc, CSIZE_LATTIME, |
411 /*bytes*/1) & CACHESIZE; 412 ahd->pci_cachesize *= 4; 413 414 ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI); 415 /* See if we have a SEEPROM and perform auto-term */ 416 error = ahd_check_extport(ahd); 417 if (error != 0) 418 return (error); --- 5 unchanged lines hidden (view full) --- 424 425 /* 426 * Allow interrupts now that we are completely setup. 427 */ 428 error = ahd_pci_map_int(ahd); 429 if (error != 0) 430 return (error); 431 | 314 /*bytes*/1) & CACHESIZE; 315 ahd->pci_cachesize *= 4; 316 317 ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI); 318 /* See if we have a SEEPROM and perform auto-term */ 319 error = ahd_check_extport(ahd); 320 if (error != 0) 321 return (error); --- 5 unchanged lines hidden (view full) --- 327 328 /* 329 * Allow interrupts now that we are completely setup. 330 */ 331 error = ahd_pci_map_int(ahd); 332 if (error != 0) 333 return (error); 334 |
432 ahd_lock(ahd); | 335 ahd_list_lock(&l); |
433 /* 434 * Link this softc in with all other ahd instances. 435 */ 436 ahd_softc_insert(ahd); | 336 /* 337 * Link this softc in with all other ahd instances. 338 */ 339 ahd_softc_insert(ahd); |
437 ahd_unlock(ahd); 438 return (0); 439} | |
440 | 340 |
441/* 442 * Perform some simple tests that should catch situations where 443 * our registers are invalidly mapped. 444 */ 445int 446ahd_pci_test_register_access(struct ahd_softc *ahd) 447{ 448 uint32_t cmd; 449 u_int targpcistat; 450 u_int pci_status1; 451 int error; 452 uint8_t hcntrl; | 341 ahd_lock(ahd, &s); 342 ahd_intr_enable(ahd, TRUE); 343 ahd_unlock(ahd, &s); |
453 | 344 |
454 error = EIO; 455 456 /* 457 * Enable PCI error interrupt status, but suppress NMIs 458 * generated by SERR raised due to target aborts. 459 */ 460 cmd = aic_pci_read_config(ahd->dev_softc, PCIR_COMMAND, /*bytes*/2); 461 aic_pci_write_config(ahd->dev_softc, PCIR_COMMAND, 462 cmd & ~PCIM_CMD_SERRESPEN, /*bytes*/2); 463 464 /* 465 * First a simple test to see if any 466 * registers can be read. Reading 467 * HCNTRL has no side effects and has 468 * at least one bit that is guaranteed to 469 * be zero so it is a good register to 470 * use for this test. 471 */ 472 hcntrl = ahd_inb(ahd, HCNTRL); 473 if (hcntrl == 0xFF) 474 goto fail; 475 476 /* 477 * Next create a situation where write combining 478 * or read prefetching could be initiated by the 479 * CPU or host bridge. Our device does not support 480 * either, so look for data corruption and/or flaged 481 * PCI errors. First pause without causing another 482 * chip reset. 483 */ 484 hcntrl &= ~CHIPRST; 485 ahd_outb(ahd, HCNTRL, hcntrl|PAUSE); 486 while (ahd_is_paused(ahd) == 0) 487 ; 488 489 /* Clear any PCI errors that occurred before our driver attached. */ 490 ahd_set_modes(ahd, AHD_MODE_CFG, AHD_MODE_CFG); 491 targpcistat = ahd_inb(ahd, TARGPCISTAT); 492 ahd_outb(ahd, TARGPCISTAT, targpcistat); 493 pci_status1 = aic_pci_read_config(ahd->dev_softc, 494 PCIR_STATUS + 1, /*bytes*/1); 495 aic_pci_write_config(ahd->dev_softc, PCIR_STATUS + 1, 496 pci_status1, /*bytes*/1); 497 ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI); 498 ahd_outb(ahd, CLRINT, CLRPCIINT); 499 500 ahd_outb(ahd, SEQCTL0, PERRORDIS); 501 ahd_outl(ahd, SRAM_BASE, 0x5aa555aa); 502 if (ahd_inl(ahd, SRAM_BASE) != 0x5aa555aa) 503 goto fail; 504 505 if ((ahd_inb(ahd, INTSTAT) & PCIINT) != 0) { 506 u_int targpcistat; 507 508 ahd_set_modes(ahd, AHD_MODE_CFG, AHD_MODE_CFG); 509 targpcistat = ahd_inb(ahd, TARGPCISTAT); 510 if ((targpcistat & STA) != 0) 511 goto fail; 512 } 513 514 error = 0; 515 516fail: 517 if ((ahd_inb(ahd, INTSTAT) & PCIINT) != 0) { 518 519 ahd_set_modes(ahd, AHD_MODE_CFG, AHD_MODE_CFG); 520 targpcistat = ahd_inb(ahd, TARGPCISTAT); 521 522 /* Silently clear any latched errors. */ 523 ahd_outb(ahd, TARGPCISTAT, targpcistat); 524 pci_status1 = aic_pci_read_config(ahd->dev_softc, 525 PCIR_STATUS + 1, /*bytes*/1); 526 aic_pci_write_config(ahd->dev_softc, PCIR_STATUS + 1, 527 pci_status1, /*bytes*/1); 528 ahd_outb(ahd, CLRINT, CLRPCIINT); 529 } 530 ahd_outb(ahd, SEQCTL0, PERRORDIS|FAILDIS); 531 aic_pci_write_config(ahd->dev_softc, PCIR_COMMAND, cmd, /*bytes*/2); 532 return (error); | 345 ahd_list_unlock(&l); 346 return (0); |
533} 534 535/* 536 * Check the external port logic for a serial eeprom 537 * and termination/cable detection contrls. 538 */ 539static int 540ahd_check_extport(struct ahd_softc *ahd) 541{ | 347} 348 349/* 350 * Check the external port logic for a serial eeprom 351 * and termination/cable detection contrls. 352 */ 353static int 354ahd_check_extport(struct ahd_softc *ahd) 355{ |
542 struct vpd_config vpd; | |
543 struct seeprom_config *sc; 544 u_int adapter_control; 545 int have_seeprom; 546 int error; 547 548 sc = ahd->seep_config; 549 have_seeprom = ahd_acquire_seeprom(ahd); 550 if (have_seeprom) { 551 u_int start_addr; 552 | 356 struct seeprom_config *sc; 357 u_int adapter_control; 358 int have_seeprom; 359 int error; 360 361 sc = ahd->seep_config; 362 have_seeprom = ahd_acquire_seeprom(ahd); 363 if (have_seeprom) { 364 u_int start_addr; 365 |
553 /* 554 * Fetch VPD for this function and parse it. 555 */ | |
556 if (bootverbose) | 366 if (bootverbose) |
557 printf("%s: Reading VPD from SEEPROM...", 558 ahd_name(ahd)); 559 560 /* Address is always in units of 16bit words */ 561 start_addr = ((2 * sizeof(*sc)) 562 + (sizeof(vpd) * (ahd->channel - 'A'))) / 2; 563 564 error = ahd_read_seeprom(ahd, (uint16_t *)&vpd, 565 start_addr, sizeof(vpd)/2, 566 /*bytestream*/TRUE); 567 if (error == 0) 568 error = ahd_parse_vpddata(ahd, &vpd); 569 if (bootverbose) 570 printf("%s: VPD parsing %s\n", 571 ahd_name(ahd), 572 error == 0 ? "successful" : "failed"); 573 574 if (bootverbose) | |
575 printf("%s: Reading SEEPROM...", ahd_name(ahd)); 576 577 /* Address is always in units of 16bit words */ 578 start_addr = (sizeof(*sc) / 2) * (ahd->channel - 'A'); 579 580 error = ahd_read_seeprom(ahd, (uint16_t *)sc, | 367 printf("%s: Reading SEEPROM...", ahd_name(ahd)); 368 369 /* Address is always in units of 16bit words */ 370 start_addr = (sizeof(*sc) / 2) * (ahd->channel - 'A'); 371 372 error = ahd_read_seeprom(ahd, (uint16_t *)sc, |
581 start_addr, sizeof(*sc)/2, 582 /*bytestream*/FALSE); | 373 start_addr, sizeof(*sc)/2); |
583 584 if (error != 0) { 585 printf("Unable to read SEEPROM\n"); 586 have_seeprom = 0; 587 } else { 588 have_seeprom = ahd_verify_cksum(sc); 589 590 if (bootverbose) { --- 13 unchanged lines hidden (view full) --- 604 * Pull scratch ram settings and treat them as 605 * if they are the contents of an seeprom if 606 * the 'ADPT', 'BIOS', or 'ASPI' signature is found 607 * in SCB 0xFF. We manually compose the data as 16bit 608 * values to avoid endian issues. 609 */ 610 ahd_set_scbptr(ahd, 0xFF); 611 nvram_scb = ahd_inb_scbram(ahd, SCB_BASE + NVRAM_SCB_OFFSET); | 374 375 if (error != 0) { 376 printf("Unable to read SEEPROM\n"); 377 have_seeprom = 0; 378 } else { 379 have_seeprom = ahd_verify_cksum(sc); 380 381 if (bootverbose) { --- 13 unchanged lines hidden (view full) --- 395 * Pull scratch ram settings and treat them as 396 * if they are the contents of an seeprom if 397 * the 'ADPT', 'BIOS', or 'ASPI' signature is found 398 * in SCB 0xFF. We manually compose the data as 16bit 399 * values to avoid endian issues. 400 */ 401 ahd_set_scbptr(ahd, 0xFF); 402 nvram_scb = ahd_inb_scbram(ahd, SCB_BASE + NVRAM_SCB_OFFSET); |
403 printf("nvram_scb == 0x%x\n", nvram_scb); 404 printf("SCBPTR == 0x%x\n", ahd_get_scbptr(ahd)); 405 printf("Signature = %c%c%c%c\n", 406 ahd_inb_scbram(ahd, SCB_BASE + 0), 407 ahd_inb_scbram(ahd, SCB_BASE + 1), 408 ahd_inb_scbram(ahd, SCB_BASE + 2), 409 ahd_inb_scbram(ahd, SCB_BASE + 3)); |
|
612 if (nvram_scb != 0xFF 613 && ((ahd_inb_scbram(ahd, SCB_BASE + 0) == 'A' 614 && ahd_inb_scbram(ahd, SCB_BASE + 1) == 'D' 615 && ahd_inb_scbram(ahd, SCB_BASE + 2) == 'P' 616 && ahd_inb_scbram(ahd, SCB_BASE + 3) == 'T') 617 || (ahd_inb_scbram(ahd, SCB_BASE + 0) == 'B' 618 && ahd_inb_scbram(ahd, SCB_BASE + 1) == 'I' 619 && ahd_inb_scbram(ahd, SCB_BASE + 2) == 'O' --- 10 unchanged lines hidden (view full) --- 630 for (i = 0; i < 64; i += 2) 631 *sc_data++ = ahd_inw_scbram(ahd, SCB_BASE+i); 632 have_seeprom = ahd_verify_cksum(sc); 633 if (have_seeprom) 634 ahd->flags |= AHD_SCB_CONFIG_USED; 635 } 636 } 637 | 410 if (nvram_scb != 0xFF 411 && ((ahd_inb_scbram(ahd, SCB_BASE + 0) == 'A' 412 && ahd_inb_scbram(ahd, SCB_BASE + 1) == 'D' 413 && ahd_inb_scbram(ahd, SCB_BASE + 2) == 'P' 414 && ahd_inb_scbram(ahd, SCB_BASE + 3) == 'T') 415 || (ahd_inb_scbram(ahd, SCB_BASE + 0) == 'B' 416 && ahd_inb_scbram(ahd, SCB_BASE + 1) == 'I' 417 && ahd_inb_scbram(ahd, SCB_BASE + 2) == 'O' --- 10 unchanged lines hidden (view full) --- 428 for (i = 0; i < 64; i += 2) 429 *sc_data++ = ahd_inw_scbram(ahd, SCB_BASE+i); 430 have_seeprom = ahd_verify_cksum(sc); 431 if (have_seeprom) 432 ahd->flags |= AHD_SCB_CONFIG_USED; 433 } 434 } 435 |
638#ifdef AHD_DEBUG | 436#if AHD_DEBUG |
639 if (have_seeprom != 0 640 && (ahd_debug & AHD_DUMP_SEEPROM) != 0) { | 437 if (have_seeprom != 0 438 && (ahd_debug & AHD_DUMP_SEEPROM) != 0) { |
641 uint16_t *sc_data; 642 int i; | 439 uint8_t *sc_data; 440 int i; |
643 644 printf("%s: Seeprom Contents:", ahd_name(ahd)); | 441 442 printf("%s: Seeprom Contents:", ahd_name(ahd)); |
645 sc_data = (uint16_t *)sc; | 443 sc_data = (uint8_t *)sc; |
646 for (i = 0; i < (sizeof(*sc)); i += 2) | 444 for (i = 0; i < (sizeof(*sc)); i += 2) |
647 printf("\n\t0x%.4x", sc_data[i]); | 445 printf("\n\t0x%.4x", 446 sc_data[i] | (sc_data[i+1] << 8)); |
648 printf("\n"); 649 } 650#endif 651 652 if (!have_seeprom) { 653 if (bootverbose) 654 printf("%s: No SEEPROM available.\n", ahd_name(ahd)); 655 ahd->flags |= AHD_USEDEFAULTS; --- 16 unchanged lines hidden (view full) --- 672static void 673ahd_configure_termination(struct ahd_softc *ahd, u_int adapter_control) 674{ 675 int error; 676 u_int sxfrctl1; 677 uint8_t termctl; 678 uint32_t devconfig; 679 | 447 printf("\n"); 448 } 449#endif 450 451 if (!have_seeprom) { 452 if (bootverbose) 453 printf("%s: No SEEPROM available.\n", ahd_name(ahd)); 454 ahd->flags |= AHD_USEDEFAULTS; --- 16 unchanged lines hidden (view full) --- 471static void 472ahd_configure_termination(struct ahd_softc *ahd, u_int adapter_control) 473{ 474 int error; 475 u_int sxfrctl1; 476 uint8_t termctl; 477 uint32_t devconfig; 478 |
680 devconfig = aic_pci_read_config(ahd->dev_softc, DEVCONFIG, /*bytes*/4); | 479 devconfig = ahd_pci_read_config(ahd->dev_softc, DEVCONFIG, /*bytes*/4); |
681 devconfig &= ~STPWLEVEL; | 480 devconfig &= ~STPWLEVEL; |
682 if ((ahd->flags & AHD_STPWLEVEL_A) != 0) | 481 if ((ahd->flags & AHD_STPWLEVEL_A) != 0) { |
683 devconfig |= STPWLEVEL; | 482 devconfig |= STPWLEVEL; |
684 if (bootverbose) 685 printf("%s: STPWLEVEL is %s\n", 686 ahd_name(ahd), (devconfig & STPWLEVEL) ? "on" : "off"); 687 aic_pci_write_config(ahd->dev_softc, DEVCONFIG, devconfig, /*bytes*/4); | 483 } 484 ahd_pci_write_config(ahd->dev_softc, DEVCONFIG, devconfig, /*bytes*/4); |
688 689 /* Make sure current sensing is off. */ 690 if ((ahd->flags & AHD_CURRENT_SENSING) != 0) { 691 (void)ahd_write_flexport(ahd, FLXADDR_ROMSTAT_CURSENSECTL, 0); 692 } 693 694 /* 695 * Read to sense. Write to set. --- 28 unchanged lines hidden (view full) --- 724 "Using Defaults.\n", ahd_name(ahd)); 725 termctl |= FLX_TERMCTL_ENSECLOW|FLX_TERMCTL_ENSECHIGH; 726 } 727 728 /* 729 * Now set the termination based on what we found. 730 */ 731 sxfrctl1 = ahd_inb(ahd, SXFRCTL1) & ~STPWEN; | 485 486 /* Make sure current sensing is off. */ 487 if ((ahd->flags & AHD_CURRENT_SENSING) != 0) { 488 (void)ahd_write_flexport(ahd, FLXADDR_ROMSTAT_CURSENSECTL, 0); 489 } 490 491 /* 492 * Read to sense. Write to set. --- 28 unchanged lines hidden (view full) --- 521 "Using Defaults.\n", ahd_name(ahd)); 522 termctl |= FLX_TERMCTL_ENSECLOW|FLX_TERMCTL_ENSECHIGH; 523 } 524 525 /* 526 * Now set the termination based on what we found. 527 */ 528 sxfrctl1 = ahd_inb(ahd, SXFRCTL1) & ~STPWEN; |
732 ahd->flags &= ~AHD_TERM_ENB_A; | |
733 if ((termctl & FLX_TERMCTL_ENPRILOW) != 0) { 734 ahd->flags |= AHD_TERM_ENB_A; 735 sxfrctl1 |= STPWEN; 736 } 737 /* Must set the latch once in order to be effective. */ 738 ahd_outb(ahd, SXFRCTL1, sxfrctl1|STPWEN); 739 ahd_outb(ahd, SXFRCTL1, sxfrctl1); 740 --- 45 unchanged lines hidden (view full) --- 786 "OVLY", 787 "NONE", 788 "MSI", 789 "TARG" 790}; 791 792static const char *split_status_strings[] = 793{ | 529 if ((termctl & FLX_TERMCTL_ENPRILOW) != 0) { 530 ahd->flags |= AHD_TERM_ENB_A; 531 sxfrctl1 |= STPWEN; 532 } 533 /* Must set the latch once in order to be effective. */ 534 ahd_outb(ahd, SXFRCTL1, sxfrctl1|STPWEN); 535 ahd_outb(ahd, SXFRCTL1, sxfrctl1); 536 --- 45 unchanged lines hidden (view full) --- 582 "OVLY", 583 "NONE", 584 "MSI", 585 "TARG" 586}; 587 588static const char *split_status_strings[] = 589{ |
794 "%s: Received split response in %s.\n", | 590 "%s: Received split response in %s.\n" |
795 "%s: Received split completion error message in %s\n", 796 "%s: Receive overrun in %s\n", 797 "%s: Count not complete in %s\n", 798 "%s: Split completion data bucket in %s\n", 799 "%s: Split completion address error in %s\n", 800 "%s: Split completion byte count error in %s\n", | 591 "%s: Received split completion error message in %s\n", 592 "%s: Receive overrun in %s\n", 593 "%s: Count not complete in %s\n", 594 "%s: Split completion data bucket in %s\n", 595 "%s: Split completion address error in %s\n", 596 "%s: Split completion byte count error in %s\n", |
801 "%s: Signaled Target-abort to early terminate a split in %s\n" | 597 "%s: Signaled Target-abort to early terminate a split in %s\n", |
802}; 803 804static const char *pci_status_strings[] = 805{ 806 "%s: Data Parity Error has been reported via PERR# in %s\n", 807 "%s: Target initial wait state error in %s\n", 808 "%s: Split completion read data parity error in %s\n", 809 "%s: Split completion address attribute parity error in %s\n", --- 25 unchanged lines hidden (view full) --- 835 saved_modes = ahd_save_modes(ahd); 836 ahd_dump_card_state(ahd); 837 ahd_set_modes(ahd, AHD_MODE_CFG, AHD_MODE_CFG); 838 for (i = 0, reg = DF0PCISTAT; i < 8; i++, reg++) { 839 840 if (i == 5) 841 continue; 842 pci_status[i] = ahd_inb(ahd, reg); | 598}; 599 600static const char *pci_status_strings[] = 601{ 602 "%s: Data Parity Error has been reported via PERR# in %s\n", 603 "%s: Target initial wait state error in %s\n", 604 "%s: Split completion read data parity error in %s\n", 605 "%s: Split completion address attribute parity error in %s\n", --- 25 unchanged lines hidden (view full) --- 631 saved_modes = ahd_save_modes(ahd); 632 ahd_dump_card_state(ahd); 633 ahd_set_modes(ahd, AHD_MODE_CFG, AHD_MODE_CFG); 634 for (i = 0, reg = DF0PCISTAT; i < 8; i++, reg++) { 635 636 if (i == 5) 637 continue; 638 pci_status[i] = ahd_inb(ahd, reg); |
843 /* Clear latched errors. So our interrupt deasserts. */ | 639 /* Clear latched errors. So our interupt deasserts. */ |
844 ahd_outb(ahd, reg, pci_status[i]); 845 } 846 847 for (i = 0; i < 8; i++) { 848 u_int bit; 849 850 if (i == 5) 851 continue; 852 853 for (bit = 0; bit < 8; bit++) { 854 855 if ((pci_status[i] & (0x1 << bit)) != 0) { 856 static const char *s; 857 858 s = pci_status_strings[bit]; 859 if (i == 7/*TARG*/ && bit == 3) | 640 ahd_outb(ahd, reg, pci_status[i]); 641 } 642 643 for (i = 0; i < 8; i++) { 644 u_int bit; 645 646 if (i == 5) 647 continue; 648 649 for (bit = 0; bit < 8; bit++) { 650 651 if ((pci_status[i] & (0x1 << bit)) != 0) { 652 static const char *s; 653 654 s = pci_status_strings[bit]; 655 if (i == 7/*TARG*/ && bit == 3) |
860 s = "%s: Signaled Target Abort\n"; | 656 s = "%s: Signal Target Abort\n"; |
861 printf(s, ahd_name(ahd), pci_status_source[i]); 862 } 863 } 864 } | 657 printf(s, ahd_name(ahd), pci_status_source[i]); 658 } 659 } 660 } |
865 pci_status1 = aic_pci_read_config(ahd->dev_softc, | 661 pci_status1 = ahd_pci_read_config(ahd->dev_softc, |
866 PCIR_STATUS + 1, /*bytes*/1); | 662 PCIR_STATUS + 1, /*bytes*/1); |
867 aic_pci_write_config(ahd->dev_softc, PCIR_STATUS + 1, | 663 ahd_pci_write_config(ahd->dev_softc, PCIR_STATUS + 1, |
868 pci_status1, /*bytes*/1); 869 ahd_restore_modes(ahd, saved_modes); | 664 pci_status1, /*bytes*/1); 665 ahd_restore_modes(ahd, saved_modes); |
870 ahd_outb(ahd, CLRINT, CLRPCIINT); | |
871 ahd_unpause(ahd); 872} 873 874static void 875ahd_pci_split_intr(struct ahd_softc *ahd, u_int intstat) 876{ 877 uint8_t split_status[4]; 878 uint8_t split_status1[4]; 879 uint8_t sg_split_status[2]; 880 uint8_t sg_split_status1[2]; 881 ahd_mode_state saved_modes; 882 u_int i; | 666 ahd_unpause(ahd); 667} 668 669static void 670ahd_pci_split_intr(struct ahd_softc *ahd, u_int intstat) 671{ 672 uint8_t split_status[4]; 673 uint8_t split_status1[4]; 674 uint8_t sg_split_status[2]; 675 uint8_t sg_split_status1[2]; 676 ahd_mode_state saved_modes; 677 u_int i; |
883 uint32_t pcix_status; | 678 uint16_t pcix_status; |
884 885 /* 886 * Check for splits in all modes. Modes 0 and 1 887 * additionally have SG engine splits to look at. 888 */ | 679 680 /* 681 * Check for splits in all modes. Modes 0 and 1 682 * additionally have SG engine splits to look at. 683 */ |
889 pcix_status = aic_pci_read_config(ahd->dev_softc, 890 ahd->pcix_ptr + PCIXR_STATUS, /*bytes*/ 4); | 684 pcix_status = ahd_pci_read_config(ahd->dev_softc, PCIXR_STATUS, 685 /*bytes*/2); |
891 printf("%s: PCI Split Interrupt - PCI-X status = 0x%x\n", | 686 printf("%s: PCI Split Interrupt - PCI-X status = 0x%x\n", |
892 ahd_name(ahd), pcix_status >> 16); | 687 ahd_name(ahd), pcix_status); |
893 saved_modes = ahd_save_modes(ahd); 894 for (i = 0; i < 4; i++) { 895 ahd_set_modes(ahd, i, i); 896 897 split_status[i] = ahd_inb(ahd, DCHSPLTSTAT0); 898 split_status1[i] = ahd_inb(ahd, DCHSPLTSTAT1); | 688 saved_modes = ahd_save_modes(ahd); 689 for (i = 0; i < 4; i++) { 690 ahd_set_modes(ahd, i, i); 691 692 split_status[i] = ahd_inb(ahd, DCHSPLTSTAT0); 693 split_status1[i] = ahd_inb(ahd, DCHSPLTSTAT1); |
899 /* Clear latched errors. So our interrupt deasserts. */ | 694 /* Clear latched errors. So our interupt deasserts. */ |
900 ahd_outb(ahd, DCHSPLTSTAT0, split_status[i]); 901 ahd_outb(ahd, DCHSPLTSTAT1, split_status1[i]); | 695 ahd_outb(ahd, DCHSPLTSTAT0, split_status[i]); 696 ahd_outb(ahd, DCHSPLTSTAT1, split_status1[i]); |
902 if (i > 1) | 697 if (i != 0) |
903 continue; 904 sg_split_status[i] = ahd_inb(ahd, SGSPLTSTAT0); 905 sg_split_status1[i] = ahd_inb(ahd, SGSPLTSTAT1); | 698 continue; 699 sg_split_status[i] = ahd_inb(ahd, SGSPLTSTAT0); 700 sg_split_status1[i] = ahd_inb(ahd, SGSPLTSTAT1); |
906 /* Clear latched errors. So our interrupt deasserts. */ | 701 /* Clear latched errors. So our interupt deasserts. */ |
907 ahd_outb(ahd, SGSPLTSTAT0, sg_split_status[i]); 908 ahd_outb(ahd, SGSPLTSTAT1, sg_split_status1[i]); 909 } 910 911 for (i = 0; i < 4; i++) { 912 u_int bit; 913 914 for (bit = 0; bit < 8; bit++) { 915 916 if ((split_status[i] & (0x1 << bit)) != 0) { 917 static const char *s; 918 919 s = split_status_strings[bit]; 920 printf(s, ahd_name(ahd), 921 split_status_source[i]); 922 } 923 | 702 ahd_outb(ahd, SGSPLTSTAT0, sg_split_status[i]); 703 ahd_outb(ahd, SGSPLTSTAT1, sg_split_status1[i]); 704 } 705 706 for (i = 0; i < 4; i++) { 707 u_int bit; 708 709 for (bit = 0; bit < 8; bit++) { 710 711 if ((split_status[i] & (0x1 << bit)) != 0) { 712 static const char *s; 713 714 s = split_status_strings[bit]; 715 printf(s, ahd_name(ahd), 716 split_status_source[i]); 717 } 718 |
924 if (i > 1) | 719 if (i != 0) |
925 continue; 926 927 if ((sg_split_status[i] & (0x1 << bit)) != 0) { 928 static const char *s; 929 930 s = split_status_strings[bit]; 931 printf(s, ahd_name(ahd), "SG"); 932 } 933 } 934 } 935 /* 936 * Clear PCI-X status bits. 937 */ | 720 continue; 721 722 if ((sg_split_status[i] & (0x1 << bit)) != 0) { 723 static const char *s; 724 725 s = split_status_strings[bit]; 726 printf(s, ahd_name(ahd), "SG"); 727 } 728 } 729 } 730 /* 731 * Clear PCI-X status bits. 732 */ |
938 aic_pci_write_config(ahd->dev_softc, ahd->pcix_ptr + PCIXR_STATUS, 939 pcix_status, /*bytes*/4); 940 ahd_outb(ahd, CLRINT, CLRSPLTINT); | 733 ahd_pci_write_config(ahd->dev_softc, PCIXR_STATUS, 734 pcix_status, /*bytes*/2); |
941 ahd_restore_modes(ahd, saved_modes); 942} 943 944static int 945ahd_aic7901_setup(struct ahd_softc *ahd) 946{ | 735 ahd_restore_modes(ahd, saved_modes); 736} 737 738static int 739ahd_aic7901_setup(struct ahd_softc *ahd) 740{ |
947 | 741 ahd_dev_softc_t pci; 742 743 pci = ahd->dev_softc; 744 ahd->channel = 'A'; |
948 ahd->chip = AHD_AIC7901; 949 ahd->features = AHD_AIC7901_FE; | 745 ahd->chip = AHD_AIC7901; 746 ahd->features = AHD_AIC7901_FE; |
950 return (ahd_aic790X_setup(ahd)); | 747 return (0); |
951} 952 953static int | 748} 749 750static int |
954ahd_aic7901A_setup(struct ahd_softc *ahd) 955{ 956 957 ahd->chip = AHD_AIC7901A; 958 ahd->features = AHD_AIC7901A_FE; 959 return (ahd_aic790X_setup(ahd)); 960} 961 962static int | |
963ahd_aic7902_setup(struct ahd_softc *ahd) 964{ | 751ahd_aic7902_setup(struct ahd_softc *ahd) 752{ |
965 ahd->chip = AHD_AIC7902; 966 ahd->features = AHD_AIC7902_FE; 967 return (ahd_aic790X_setup(ahd)); 968} 969 970static int 971ahd_aic790X_setup(struct ahd_softc *ahd) 972{ 973 aic_dev_softc_t pci; | 753 ahd_dev_softc_t pci; |
974 u_int rev; | 754 u_int rev; |
755 u_int devconfig1; |
|
975 976 pci = ahd->dev_softc; | 756 757 pci = ahd->dev_softc; |
977 rev = aic_pci_read_config(pci, PCIR_REVID, /*bytes*/1); 978 if (rev < ID_AIC7902_PCI_REV_A4) { | 758 rev = ahd_pci_read_config(pci, PCIR_REVID, /*bytes*/1); 759 if (rev < ID_AIC7902_PCI_REV_A3) { |
979 printf("%s: Unable to attach to unsupported chip revision %d\n", 980 ahd_name(ahd), rev); | 760 printf("%s: Unable to attach to unsupported chip revision %d\n", 761 ahd_name(ahd), rev); |
981 aic_pci_write_config(pci, PCIR_COMMAND, 0, /*bytes*/2); | 762 ahd_pci_write_config(pci, PCIR_COMMAND, 0, /*bytes*/1); |
982 return (ENXIO); 983 } | 763 return (ENXIO); 764 } |
984 ahd->channel = aic_get_pci_function(pci) + 'A'; | |
985 if (rev < ID_AIC7902_PCI_REV_B0) { 986 /* | 765 if (rev < ID_AIC7902_PCI_REV_B0) { 766 /* |
767 * Pending request assertion does not work on the A if we have 768 * DMA requests outstanding on both channels. See H2A3 Razors 769 * #327 and #365. 770 */ 771 devconfig1 = ahd_pci_read_config(pci, DEVCONFIG1, /*bytes*/1); 772 ahd_pci_write_config(pci, DEVCONFIG1, 773 devconfig1|PREQDIS, /*bytes*/1); 774 devconfig1 = ahd_pci_read_config(pci, DEVCONFIG1, /*bytes*/1); 775 /* |
|
987 * Enable A series workarounds. 988 */ 989 ahd->bugs |= AHD_SENT_SCB_UPDATE_BUG|AHD_ABORT_LQI_BUG 990 | AHD_PKT_BITBUCKET_BUG|AHD_LONG_SETIMO_BUG 991 | AHD_NLQICRC_DELAYED_BUG|AHD_SCSIRST_BUG 992 | AHD_LQO_ATNO_BUG|AHD_AUTOFLUSH_BUG 993 | AHD_CLRLQO_AUTOCLR_BUG|AHD_PCIX_MMAPIO_BUG | 776 * Enable A series workarounds. 777 */ 778 ahd->bugs |= AHD_SENT_SCB_UPDATE_BUG|AHD_ABORT_LQI_BUG 779 | AHD_PKT_BITBUCKET_BUG|AHD_LONG_SETIMO_BUG 780 | AHD_NLQICRC_DELAYED_BUG|AHD_SCSIRST_BUG 781 | AHD_LQO_ATNO_BUG|AHD_AUTOFLUSH_BUG 782 | AHD_CLRLQO_AUTOCLR_BUG|AHD_PCIX_MMAPIO_BUG |
994 | AHD_PCIX_CHIPRST_BUG|AHD_PCIX_SCBRAM_RD_BUG 995 | AHD_PKTIZED_STATUS_BUG|AHD_PKT_LUN_BUG 996 | AHD_MDFF_WSCBPTR_BUG|AHD_REG_SLOW_SETTLE_BUG 997 | AHD_SET_MODE_BUG|AHD_BUSFREEREV_BUG 998 | AHD_NONPACKFIFO_BUG|AHD_PACED_NEGTABLE_BUG 999 | AHD_FAINT_LED_BUG; 1000 1001 /* 1002 * IO Cell paramter setup. 1003 */ 1004 AHD_SET_PRECOMP(ahd, AHD_PRECOMP_CUTBACK_29); 1005 1006 if ((ahd->flags & AHD_HP_BOARD) == 0) 1007 AHD_SET_SLEWRATE(ahd, AHD_SLEWRATE_DEF_REVA); 1008 } else { 1009 u_int devconfig1; 1010 1011 ahd->features |= AHD_RTI|AHD_NEW_IOCELL_OPTS 1012 | AHD_NEW_DFCNTRL_OPTS|AHD_FAST_CDB_DELIVERY; 1013 ahd->bugs |= AHD_LQOOVERRUN_BUG|AHD_EARLY_REQ_BUG; 1014 1015 /* 1016 * Some issues have been resolved in the 7901B. 1017 */ 1018 if ((ahd->features & AHD_MULTI_FUNC) != 0) 1019 ahd->bugs |= AHD_INTCOLLISION_BUG|AHD_ABORT_LQI_BUG 1020 | AHD_BUSFREEREV_BUG; 1021 1022 /* 1023 * IO Cell paramter setup. 1024 */ 1025 AHD_SET_PRECOMP(ahd, AHD_PRECOMP_CUTBACK_29); 1026 AHD_SET_SLEWRATE(ahd, AHD_SLEWRATE_DEF_REVB); 1027 AHD_SET_AMPLITUDE(ahd, AHD_AMPLITUDE_DEF); 1028 1029 /* 1030 * Set the PREQDIS bit for H2B which disables some workaround 1031 * that doesn't work on regular PCI busses. 1032 * XXX - Find out exactly what this does from the hardware 1033 * folks! 1034 */ 1035 devconfig1 = aic_pci_read_config(pci, DEVCONFIG1, /*bytes*/1); 1036 aic_pci_write_config(pci, DEVCONFIG1, 1037 devconfig1|PREQDIS, /*bytes*/1); 1038 devconfig1 = aic_pci_read_config(pci, DEVCONFIG1, /*bytes*/1); | 783 | AHD_PCIX_CHIPRST_BUG|AHD_PKTIZED_STATUS_BUG; 784 if (rev < ID_AIC7902_PCI_REV_A4) 785 ahd->bugs |= AHD_PCIX_ARBITER_BUG|AHD_PCIX_SPLIT_BUG; |
1039 } 1040 | 786 } 787 |
788 ahd->channel = ahd_get_pci_function(pci) + 'A'; 789 ahd->chip = AHD_AIC7902; 790 ahd->features = AHD_AIC7902_FE; |
|
1041 return (0); 1042} | 791 return (0); 792} |