1 /* $NetBSD: pdcsata.c,v 1.4 2005/12/04 17:39:03 christos Exp $ */ 2 3 /* 4 * Copyright (c) 2004, Manuel Bouyer. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 3. All advertising materials mentioning features or use of this software 15 * must display the following acknowledgement: 16 * This product includes software developed by Manuel Bouyer. 17 * 4. The name of the author may not be used to endorse or promote products 18 * derived from this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 21 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 22 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 23 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 24 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 25 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 29 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 #include <sys/types.h> 33 #include <sys/malloc.h> 34 #include <sys/param.h> 35 #include <sys/systm.h> 36 37 #include <dev/pci/pcivar.h> 38 #include <dev/pci/pcidevs.h> 39 #include <dev/pci/pciidereg.h> 40 #include <dev/pci/pciidevar.h> 41 #include <dev/ata/atareg.h> 42 #include <dev/ata/satavar.h> 43 #include <dev/ata/satareg.h> 44 45 #define PDC203xx_NCHANNELS 4 46 #define PDC40718_NCHANNELS 4 47 48 #define PDC203xx_BAR_IDEREGS 0x1c /* BAR where the IDE registers are mapped */ 49 50 static void pdcsata_chip_map(struct pciide_softc *, struct pci_attach_args *); 51 static void pdc203xx_setup_channel(struct ata_channel *); 52 static int pdc203xx_pci_intr(void *); 53 static void pdc203xx_irqack(struct ata_channel *); 54 static int pdc203xx_dma_init(void *, int, int, void *, size_t, int); 55 static void pdc203xx_dma_start(void *,int ,int); 56 static int pdc203xx_dma_finish(void *, int, int, int); 57 58 /* PDC205xx, PDC405xx and PDC407xx. but tested only pdc40718 */ 59 static int pdc205xx_pci_intr(void *); 60 static void pdc205xx_do_reset(struct ata_channel *, int); 61 static void pdc205xx_drv_probe(struct ata_channel *); 62 63 static int pdcsata_match(struct device *, struct cfdata *, void *); 64 static void pdcsata_attach(struct device *, struct device *, void *); 65 66 CFATTACH_DECL(pdcsata, sizeof(struct pciide_softc), 67 pdcsata_match, pdcsata_attach, NULL, NULL); 68 69 static const struct pciide_product_desc pciide_pdcsata_products[] = { 70 { PCI_PRODUCT_PROMISE_PDC20318, 71 0, 72 "Promise PDC20318 SATA150 controller", 73 pdcsata_chip_map, 74 }, 75 { PCI_PRODUCT_PROMISE_PDC20319, 76 0, 77 "Promise PDC20319 SATA150 controller", 78 pdcsata_chip_map, 79 }, 80 { PCI_PRODUCT_PROMISE_PDC20371, 81 0, 82 "Promise PDC20371 SATA150 controller", 83 pdcsata_chip_map, 84 }, 85 { PCI_PRODUCT_PROMISE_PDC20375, 86 0, 87 "Promise PDC20375 SATA150 controller", 88 pdcsata_chip_map, 89 }, 90 { PCI_PRODUCT_PROMISE_PDC20376, 91 0, 92 "Promise PDC20376 SATA150 controller", 93 pdcsata_chip_map, 94 }, 95 { PCI_PRODUCT_PROMISE_PDC20377, 96 0, 97 "Promise PDC20377 SATA150 controller", 98 pdcsata_chip_map, 99 }, 100 { PCI_PRODUCT_PROMISE_PDC20378, 101 0, 102 "Promise PDC20378 SATA150 controller", 103 pdcsata_chip_map, 104 }, 105 { PCI_PRODUCT_PROMISE_PDC20379, 106 0, 107 "Promise PDC20379 SATA150 controller", 108 pdcsata_chip_map, 109 }, 110 { PCI_PRODUCT_PROMISE_PDC40718, 111 0, 112 "Promise PDC40718 SATA300 controller", 113 pdcsata_chip_map, 114 }, 115 { PCI_PRODUCT_PROMISE_PDC40719, 116 0, 117 "Promise PDC40719 SATA300 controller", 118 pdcsata_chip_map, 119 }, 120 { 0, 121 0, 122 NULL, 123 NULL 124 } 125 }; 126 127 static int 128 pdcsata_match(struct device *parent, struct cfdata *match, void *aux) 129 { 130 struct pci_attach_args *pa = aux; 131 132 if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_PROMISE) { 133 if (pciide_lookup_product(pa->pa_id, pciide_pdcsata_products)) 134 return (2); 135 } 136 return (0); 137 } 138 139 static void 140 pdcsata_attach(struct device *parent, struct device *self, void *aux) 141 { 142 struct pci_attach_args *pa = aux; 143 struct pciide_softc *sc = (struct pciide_softc *)self; 144 145 pciide_common_attach(sc, pa, 146 pciide_lookup_product(pa->pa_id, pciide_pdcsata_products)); 147 } 148 149 static void 150 pdcsata_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa) 151 { 152 struct pciide_channel *cp; 153 struct ata_channel *wdc_cp; 154 struct wdc_regs *wdr; 155 int channel, i; 156 bus_size_t dmasize; 157 pci_intr_handle_t intrhandle; 158 const char *intrstr; 159 160 /* 161 * Promise SATA controllers have 3 or 4 channels, 162 * the usual IDE registers are mapped in I/O space, with offsets. 163 */ 164 if (pci_intr_map(pa, &intrhandle) != 0) { 165 aprint_error("%s: couldn't map interrupt\n", 166 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname); 167 return; 168 } 169 intrstr = pci_intr_string(pa->pa_pc, intrhandle); 170 171 switch (sc->sc_pp->ide_product) { 172 case PCI_PRODUCT_PROMISE_PDC20318: 173 case PCI_PRODUCT_PROMISE_PDC20319: 174 case PCI_PRODUCT_PROMISE_PDC20371: 175 case PCI_PRODUCT_PROMISE_PDC20375: 176 case PCI_PRODUCT_PROMISE_PDC20376: 177 case PCI_PRODUCT_PROMISE_PDC20377: 178 case PCI_PRODUCT_PROMISE_PDC20378: 179 case PCI_PRODUCT_PROMISE_PDC20379: 180 default: 181 sc->sc_pci_ih = pci_intr_establish(pa->pa_pc, 182 intrhandle, IPL_BIO, pdc203xx_pci_intr, sc); 183 break; 184 185 case PCI_PRODUCT_PROMISE_PDC40718: 186 case PCI_PRODUCT_PROMISE_PDC40719: 187 sc->sc_pci_ih = pci_intr_establish(pa->pa_pc, 188 intrhandle, IPL_BIO, pdc205xx_pci_intr, sc); 189 break; 190 } 191 192 if (sc->sc_pci_ih == NULL) { 193 aprint_error("%s: couldn't establish native-PCI interrupt", 194 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname); 195 if (intrstr != NULL) 196 aprint_normal(" at %s", intrstr); 197 aprint_normal("\n"); 198 return; 199 } 200 aprint_normal("%s: interrupting at %s\n", 201 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname, 202 intrstr ? intrstr : "unknown interrupt"); 203 204 sc->sc_dma_ok = (pci_mapreg_map(pa, PCIIDE_REG_BUS_MASTER_DMA, 205 PCI_MAPREG_MEM_TYPE_32BIT, 0, &sc->sc_dma_iot, 206 &sc->sc_dma_ioh, NULL, &dmasize) == 0); 207 if (!sc->sc_dma_ok) { 208 aprint_error("%s: couldn't map bus-master DMA registers\n", 209 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname); 210 pci_intr_disestablish(pa->pa_pc, sc->sc_pci_ih); 211 return; 212 } 213 214 sc->sc_dmat = pa->pa_dmat; 215 216 if (pci_mapreg_map(pa, PDC203xx_BAR_IDEREGS, 217 PCI_MAPREG_MEM_TYPE_32BIT, 0, &sc->sc_ba5_st, 218 &sc->sc_ba5_sh, NULL, NULL) != 0) { 219 aprint_error("%s: couldn't map IDE registers\n", 220 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname); 221 bus_space_unmap(sc->sc_dma_iot, sc->sc_dma_ioh, dmasize); 222 pci_intr_disestablish(pa->pa_pc, sc->sc_pci_ih); 223 return; 224 } 225 226 aprint_normal("%s: bus-master DMA support present\n", 227 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname); 228 sc->sc_wdcdev.sc_atac.atac_cap = ATAC_CAP_DATA16; 229 if (sc->sc_dma_ok) { 230 sc->sc_wdcdev.sc_atac.atac_cap |= ATAC_CAP_DMA | ATAC_CAP_UDMA; 231 } 232 if (PCI_CLASS(pa->pa_class) == PCI_CLASS_MASS_STORAGE && 233 PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_MASS_STORAGE_RAID) 234 sc->sc_wdcdev.sc_atac.atac_cap |= ATAC_CAP_RAID; 235 sc->sc_wdcdev.irqack = pdc203xx_irqack; 236 sc->sc_wdcdev.sc_atac.atac_pio_cap = 4; 237 sc->sc_wdcdev.sc_atac.atac_dma_cap = 2; 238 sc->sc_wdcdev.sc_atac.atac_udma_cap = 6; 239 sc->sc_wdcdev.sc_atac.atac_set_modes = pdc203xx_setup_channel; 240 sc->sc_wdcdev.sc_atac.atac_channels = sc->wdc_chanarray; 241 242 switch (sc->sc_pp->ide_product) { 243 case PCI_PRODUCT_PROMISE_PDC20318: 244 case PCI_PRODUCT_PROMISE_PDC20319: 245 case PCI_PRODUCT_PROMISE_PDC20371: 246 case PCI_PRODUCT_PROMISE_PDC20375: 247 case PCI_PRODUCT_PROMISE_PDC20376: 248 case PCI_PRODUCT_PROMISE_PDC20377: 249 case PCI_PRODUCT_PROMISE_PDC20378: 250 case PCI_PRODUCT_PROMISE_PDC20379: 251 default: 252 bus_space_write_4(sc->sc_ba5_st, sc->sc_ba5_sh, 0x6c, 0x00ff0033); 253 sc->sc_wdcdev.sc_atac.atac_nchannels = 254 (bus_space_read_4(sc->sc_ba5_st, sc->sc_ba5_sh, 0x48) & 0x02) ? 255 PDC203xx_NCHANNELS : 3; 256 257 break; 258 259 case PCI_PRODUCT_PROMISE_PDC40718: 260 case PCI_PRODUCT_PROMISE_PDC40719: 261 bus_space_write_4(sc->sc_ba5_st, sc->sc_ba5_sh, 0x60, 0x00ff00ff); 262 sc->sc_wdcdev.sc_atac.atac_nchannels = PDC40718_NCHANNELS; 263 264 sc->sc_wdcdev.reset = pdc205xx_do_reset; 265 sc->sc_wdcdev.sc_atac.atac_probe = pdc205xx_drv_probe; 266 267 break; 268 } 269 270 wdc_allocate_regs(&sc->sc_wdcdev); 271 272 sc->sc_wdcdev.dma_arg = sc; 273 sc->sc_wdcdev.dma_init = pdc203xx_dma_init; 274 sc->sc_wdcdev.dma_start = pdc203xx_dma_start; 275 sc->sc_wdcdev.dma_finish = pdc203xx_dma_finish; 276 277 for (channel = 0; channel < sc->sc_wdcdev.sc_atac.atac_nchannels; 278 channel++) { 279 cp = &sc->pciide_channels[channel]; 280 sc->wdc_chanarray[channel] = &cp->ata_channel; 281 282 cp->ih = sc->sc_pci_ih; 283 cp->name = NULL; 284 cp->ata_channel.ch_channel = channel; 285 cp->ata_channel.ch_atac = &sc->sc_wdcdev.sc_atac; 286 cp->ata_channel.ch_queue = 287 malloc(sizeof(struct ata_queue), M_DEVBUF, M_NOWAIT); 288 if (cp->ata_channel.ch_queue == NULL) { 289 aprint_error("%s channel %d: " 290 "can't allocate memory for command queue\n", 291 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname, channel); 292 goto next_channel; 293 } 294 wdc_cp = &cp->ata_channel; 295 wdr = CHAN_TO_WDC_REGS(wdc_cp); 296 297 wdr->ctl_iot = sc->sc_ba5_st; 298 wdr->cmd_iot = sc->sc_ba5_st; 299 300 if (bus_space_subregion(sc->sc_ba5_st, sc->sc_ba5_sh, 301 0x0238 + (channel << 7), 1, &wdr->ctl_ioh) != 0) { 302 aprint_error("%s: couldn't map channel %d ctl regs\n", 303 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname, 304 channel); 305 goto next_channel; 306 } 307 for (i = 0; i < WDC_NREG; i++) { 308 if (bus_space_subregion(sc->sc_ba5_st, sc->sc_ba5_sh, 309 0x0200 + (i << 2) + (channel << 7), i == 0 ? 4 : 1, 310 &wdr->cmd_iohs[i]) != 0) { 311 aprint_error("%s: couldn't map channel %d cmd " 312 "regs\n", 313 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname, 314 channel); 315 goto next_channel; 316 } 317 } 318 wdc_init_shadow_regs(wdc_cp); 319 320 /* 321 * subregion de busmaster registers. They're spread all over 322 * the controller's register space :(. They are also 4 bytes 323 * sized, with some specific extentions in the extra bits. 324 * It also seems that the IDEDMA_CTL register isn't available. 325 */ 326 if (bus_space_subregion(sc->sc_ba5_st, sc->sc_ba5_sh, 327 0x260 + (channel << 7), 1, 328 &cp->dma_iohs[IDEDMA_CMD]) != 0) { 329 aprint_normal("%s channel %d: can't subregion DMA " 330 "registers\n", 331 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname, channel); 332 goto next_channel; 333 } 334 if (bus_space_subregion(sc->sc_ba5_st, sc->sc_ba5_sh, 335 0x244 + (channel << 7), 4, 336 &cp->dma_iohs[IDEDMA_TBL]) != 0) { 337 aprint_normal("%s channel %d: can't subregion DMA " 338 "registers\n", 339 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname, channel); 340 goto next_channel; 341 } 342 343 wdcattach(wdc_cp); 344 bus_space_write_4(sc->sc_dma_iot, cp->dma_iohs[IDEDMA_CMD], 0, 345 (bus_space_read_4(sc->sc_dma_iot, cp->dma_iohs[IDEDMA_CMD], 346 0) & ~0x00003f9f) | (channel + 1)); 347 bus_space_write_4(sc->sc_ba5_st, sc->sc_ba5_sh, 348 (channel + 1) << 2, 0x00000001); 349 next_channel: 350 continue; 351 } 352 return; 353 } 354 355 static void 356 pdc203xx_setup_channel(struct ata_channel *chp) 357 { 358 struct ata_drive_datas *drvp; 359 int drive, s; 360 struct pciide_channel *cp = CHAN_TO_PCHAN(chp); 361 362 pciide_channel_dma_setup(cp); 363 364 for (drive = 0; drive < 2; drive++) { 365 drvp = &chp->ch_drive[drive]; 366 if ((drvp->drive_flags & DRIVE) == 0) 367 continue; 368 if (drvp->drive_flags & DRIVE_UDMA) { 369 s = splbio(); 370 drvp->drive_flags &= ~DRIVE_DMA; 371 splx(s); 372 } 373 } 374 } 375 376 static int 377 pdc203xx_pci_intr(void *arg) 378 { 379 struct pciide_softc *sc = arg; 380 struct pciide_channel *cp; 381 struct ata_channel *wdc_cp; 382 int i, rv, crv; 383 u_int32_t scr; 384 385 rv = 0; 386 scr = bus_space_read_4(sc->sc_ba5_st, sc->sc_ba5_sh, 0x00040); 387 388 for (i = 0; i < sc->sc_wdcdev.sc_atac.atac_nchannels; i++) { 389 cp = &sc->pciide_channels[i]; 390 wdc_cp = &cp->ata_channel; 391 if (scr & (1 << (i + 1))) { 392 crv = wdcintr(wdc_cp); 393 if (crv == 0) { 394 printf("%s:%d: bogus intr (reg 0x%x)\n", 395 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname, 396 i, scr); 397 } else 398 rv = 1; 399 } 400 } 401 return rv; 402 } 403 404 static int 405 pdc205xx_pci_intr(void *arg) 406 { 407 struct pciide_softc *sc = arg; 408 struct pciide_channel *cp; 409 struct ata_channel *wdc_cp; 410 int i, rv, crv; 411 u_int32_t scr, status; 412 413 rv = 0; 414 scr = bus_space_read_4(sc->sc_ba5_st, sc->sc_ba5_sh, 0x40); 415 bus_space_write_4(sc->sc_ba5_st, sc->sc_ba5_sh, 0x40, scr & 0x0000ffff); 416 417 status = bus_space_read_4(sc->sc_ba5_st, sc->sc_ba5_sh, 0x60); 418 bus_space_write_4(sc->sc_ba5_st, sc->sc_ba5_sh, 0x60, status & 0x000000ff); 419 420 for (i = 0; i < sc->sc_wdcdev.sc_atac.atac_nchannels; i++) { 421 cp = &sc->pciide_channels[i]; 422 wdc_cp = &cp->ata_channel; 423 if (scr & (1 << (i + 1))) { 424 crv = wdcintr(wdc_cp); 425 if (crv == 0) { 426 printf("%s:%d: bogus intr (reg 0x%x)\n", 427 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname, 428 i, scr); 429 } else 430 rv = 1; 431 } 432 } 433 return rv; 434 } 435 436 static void 437 pdc203xx_irqack(struct ata_channel *chp) 438 { 439 struct pciide_channel *cp = CHAN_TO_PCHAN(chp); 440 struct pciide_softc *sc = CHAN_TO_PCIIDE(chp); 441 442 bus_space_write_4(sc->sc_dma_iot, cp->dma_iohs[IDEDMA_CMD], 0, 443 (bus_space_read_4(sc->sc_dma_iot, cp->dma_iohs[IDEDMA_CMD], 444 0) & ~0x00003f9f) | (cp->ata_channel.ch_channel + 1)); 445 bus_space_write_4(sc->sc_ba5_st, sc->sc_ba5_sh, 446 (cp->ata_channel.ch_channel + 1) << 2, 0x00000001); 447 } 448 449 static int 450 pdc203xx_dma_init(void *v, int channel, int drive, void *databuf, 451 size_t datalen, int flags) 452 { 453 struct pciide_softc *sc = v; 454 455 return pciide_dma_dmamap_setup(sc, channel, drive, 456 databuf, datalen, flags); 457 } 458 459 static void 460 pdc203xx_dma_start(void *v, int channel, int drive) 461 { 462 struct pciide_softc *sc = v; 463 struct pciide_channel *cp = &sc->pciide_channels[channel]; 464 struct pciide_dma_maps *dma_maps = &cp->dma_maps[drive]; 465 466 /* Write table addr */ 467 bus_space_write_4(sc->sc_dma_iot, cp->dma_iohs[IDEDMA_TBL], 0, 468 dma_maps->dmamap_table->dm_segs[0].ds_addr); 469 /* start DMA engine */ 470 bus_space_write_4(sc->sc_dma_iot, cp->dma_iohs[IDEDMA_CMD], 0, 471 (bus_space_read_4(sc->sc_dma_iot, cp->dma_iohs[IDEDMA_CMD], 472 0) & ~0xc0) | ((dma_maps->dma_flags & WDC_DMA_READ) ? 0x80 : 0xc0)); 473 } 474 475 static int 476 pdc203xx_dma_finish(void *v, int channel, int drive, int force) 477 { 478 struct pciide_softc *sc = v; 479 struct pciide_channel *cp = &sc->pciide_channels[channel]; 480 struct pciide_dma_maps *dma_maps = &cp->dma_maps[drive]; 481 482 /* stop DMA channel */ 483 bus_space_write_4(sc->sc_dma_iot, cp->dma_iohs[IDEDMA_CMD], 0, 484 (bus_space_read_4(sc->sc_dma_iot, cp->dma_iohs[IDEDMA_CMD], 485 0) & ~0x80)); 486 487 /* Unload the map of the data buffer */ 488 bus_dmamap_sync(sc->sc_dmat, dma_maps->dmamap_xfer, 0, 489 dma_maps->dmamap_xfer->dm_mapsize, 490 (dma_maps->dma_flags & WDC_DMA_READ) ? 491 BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE); 492 bus_dmamap_unload(sc->sc_dmat, dma_maps->dmamap_xfer); 493 494 return 0; 495 } 496 497 #define PDC205_REGADDR(base,ch) ((base)+((ch)<<8)) 498 #define PDC205_SSTATUS(ch) PDC205_REGADDR(0x400,ch) 499 #define PDC205_SERROR(ch) PDC205_REGADDR(0x404,ch) 500 #define PDC205_SCONTROL(ch) PDC205_REGADDR(0x408,ch) 501 #define PDC205_MULTIPLIER(ch) PDC205_REGADDR(0x4e8,ch) 502 503 504 #define SCONTROL_WRITE(sc,channel,scontrol) \ 505 bus_space_write_4((sc)->sc_ba5_st, (sc)->sc_ba5_sh, \ 506 PDC205_SCONTROL(channel), scontrol) 507 508 #define SSTATUS_READ(sc,channel) \ 509 bus_space_read_4((sc)->sc_ba5_st, (sc)->sc_ba5_sh, \ 510 PDC205_SSTATUS(channel)) 511 512 513 514 static void 515 pdc205xx_do_reset(struct ata_channel *chp, int poll) 516 { 517 struct pciide_softc *sc = CHAN_TO_PCIIDE(chp); 518 u_int32_t scontrol; 519 520 wdc_do_reset(chp, poll); 521 522 /* reset SATA */ 523 scontrol = SControl_DET_INIT | SControl_SPD_ANY | SControl_IPM_NONE; 524 SCONTROL_WRITE(sc, chp->ch_channel, scontrol); 525 delay(50*1000); 526 527 scontrol &= ~SControl_DET_INIT; 528 SCONTROL_WRITE(sc, chp->ch_channel, scontrol); 529 delay(50*1000); 530 } 531 532 533 534 static void 535 pdc205xx_drv_probe(struct ata_channel *chp) 536 { 537 struct pciide_softc *sc = CHAN_TO_PCIIDE(chp); 538 struct wdc_regs *wdr = CHAN_TO_WDC_REGS(chp); 539 u_int32_t scontrol, sstatus; 540 u_int16_t scnt, sn, cl, ch; 541 int i, s; 542 543 /* XXX This should be done by other code. */ 544 for (i = 0; i < 2; i++) { 545 chp->ch_drive[i].chnl_softc = chp; 546 chp->ch_drive[i].drive = i; 547 } 548 549 SCONTROL_WRITE(sc, chp->ch_channel, 0); 550 delay(50*1000); 551 552 scontrol = SControl_DET_INIT | SControl_SPD_ANY | SControl_IPM_NONE; 553 SCONTROL_WRITE(sc,chp->ch_channel,scontrol); 554 delay(50*1000); 555 556 scontrol &= ~SControl_DET_INIT; 557 SCONTROL_WRITE(sc,chp->ch_channel,scontrol); 558 delay(50*1000); 559 560 sstatus = SSTATUS_READ(sc,chp->ch_channel); 561 562 switch (sstatus & SStatus_DET_mask) { 563 case SStatus_DET_NODEV: 564 /* No Device; be silent. */ 565 break; 566 567 case SStatus_DET_DEV_NE: 568 aprint_error("%s: port %d: device connected, but " 569 "communication not established\n", 570 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname, chp->ch_channel); 571 break; 572 573 case SStatus_DET_OFFLINE: 574 aprint_error("%s: port %d: PHY offline\n", 575 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname, chp->ch_channel); 576 break; 577 578 case SStatus_DET_DEV: 579 bus_space_write_1(wdr->cmd_iot, wdr->cmd_iohs[wd_sdh], 0, 580 WDSD_IBM); 581 delay(10); /* 400ns delay */ 582 scnt = bus_space_read_2(wdr->cmd_iot, 583 wdr->cmd_iohs[wd_seccnt], 0); 584 sn = bus_space_read_2(wdr->cmd_iot, 585 wdr->cmd_iohs[wd_sector], 0); 586 cl = bus_space_read_2(wdr->cmd_iot, 587 wdr->cmd_iohs[wd_cyl_lo], 0); 588 ch = bus_space_read_2(wdr->cmd_iot, 589 wdr->cmd_iohs[wd_cyl_hi], 0); 590 #if 0 591 printf("%s: port %d: scnt=0x%x sn=0x%x cl=0x%x ch=0x%x\n", 592 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname, chp->ch_channel, 593 scnt, sn, cl, ch); 594 #endif 595 /* 596 * scnt and sn are supposed to be 0x1 for ATAPI, but in some 597 * cases we get wrong values here, so ignore it. 598 */ 599 s = splbio(); 600 if (cl == 0x14 && ch == 0xeb) 601 chp->ch_drive[0].drive_flags |= DRIVE_ATAPI; 602 else 603 chp->ch_drive[0].drive_flags |= DRIVE_ATA; 604 splx(s); 605 #if 0 606 aprint_normal("%s: port %d: device present, speed: %s\n", 607 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname, chp->ch_channel, 608 sata_speed(sstatus)); 609 #endif 610 break; 611 612 default: 613 aprint_error("%s: port %d: unknown SStatus: 0x%08x\n", 614 sc->sc_wdcdev.sc_atac.atac_dev.dv_xname, chp->ch_channel, 615 sstatus); 616 } 617 } 618