1/*- 2 * Copyright (c) 2003 Hidetoshi Shimokawa 3 * Copyright (c) 1998-2002 Katsushi Kobayashi and Hidetoshi Shimokawa 4 * All rights reserved. 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: --- 19 unchanged lines hidden (view full) --- 28 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 30 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 31 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 32 * POSSIBILITY OF SUCH DAMAGE. 33 */ 34 35#include <sys/cdefs.h> |
36__FBSDID("$FreeBSD: head/sys/dev/firewire/fwohci_pci.c 272214 2014-09-27 16:50:21Z kan $"); |
37 38#define BOUNCE_BUFFER_TEST 0 39 40#include <sys/param.h> 41#include <sys/systm.h> 42#include <sys/kernel.h> 43#include <sys/module.h> 44#include <sys/bus.h> --- 17 unchanged lines hidden (view full) --- 62 63static int fwohci_pci_attach(device_t self); 64static int fwohci_pci_detach(device_t self); 65 66/* 67 * The probe routine. 68 */ 69static int |
70fwohci_pci_probe(device_t dev) |
71{ 72 uint32_t id; 73 74 id = pci_get_devid(dev); 75 if (id == (FW_VENDORID_NATSEMI | FW_DEVICE_CS4210)) { 76 device_set_desc(dev, "National Semiconductor CS4210"); 77 return BUS_PROBE_DEFAULT; 78 } --- 127 unchanged lines hidden (view full) --- 206fwohci_pci_init(device_t self) 207{ 208 int olatency, latency, ocache_line, cache_line; 209 uint16_t cmd; 210 211 cmd = pci_read_config(self, PCIR_COMMAND, 2); 212 cmd |= PCIM_CMD_BUSMASTEREN | PCIM_CMD_MWRICEN; 213#if 1 /* for broken hardware */ |
214 cmd &= ~PCIM_CMD_MWRICEN; |
215#endif 216 pci_write_config(self, PCIR_COMMAND, cmd, 2); 217 218 /* 219 * Some Sun PCIO-2 FireWire controllers have their intpin register 220 * bogusly set to 0, although it should be 3. Correct that. 221 */ 222 if (pci_get_devid(self) == (FW_VENDORID_SUN | FW_DEVICE_PCIO2FW) && --- 83 unchanged lines hidden (view full) --- 306 /*maxsize*/0x100000, 307 /*nsegments*/0x20, 308 /*maxsegsz*/0x8000, 309 /*flags*/BUS_DMA_ALLOCNOW, 310 /*lockfunc*/busdma_lock_mutex, 311 /*lockarg*/FW_GMTX(&sc->fc), 312 &sc->fc.dmat); 313 if (err != 0) { |
314 device_printf(self, "fwohci_pci_attach: Could not allocate DMA " 315 "tag - error %d\n", err); 316 fwohci_pci_detach(self); 317 return (ENOMEM); |
318 } 319 320 err = fwohci_init(sc, self); 321 |
322 if (err != 0) { |
323 device_printf(self, "fwohci_init failed with err=%d\n", err); 324 fwohci_pci_detach(self); 325 return EIO; 326 } 327 328 /* probe and attach a child device(firewire) */ 329 bus_generic_probe(self); 330 bus_generic_attach(self); 331 332 return 0; 333} 334 335static int 336fwohci_pci_detach(device_t self) 337{ 338 fwohci_softc_t *sc = device_get_softc(self); 339 int s; 340 |
341 s = splfw(); 342 343 if (sc->bsr) 344 fwohci_stop(sc, self); 345 346 bus_generic_detach(self); |
347 |
348 if (sc->fc.bdev) { 349 device_delete_child(self, sc->fc.bdev); 350 sc->fc.bdev = NULL; 351 } 352 353 /* disable interrupts that might have been switched on */ 354 if (sc->bst && sc->bsh) 355 bus_space_write_4(sc->bst, sc->bsh, --- 8 unchanged lines hidden (view full) --- 364 "Could not tear down irq, %d\n", err); 365 sc->ih = NULL; 366 } 367 bus_release_resource(self, SYS_RES_IRQ, 0, sc->irq_res); 368 sc->irq_res = NULL; 369 } 370 371 if (sc->bsr) { |
372 bus_release_resource(self, SYS_RES_MEMORY, PCI_CBMEM, sc->bsr); |
373 sc->bsr = NULL; 374 sc->bst = 0; 375 sc->bsh = 0; 376 } 377 378 fwohci_detach(sc, self); 379 mtx_destroy(FW_GMTX(&sc->fc)); 380 splx(s); --- 43 unchanged lines hidden (view full) --- 424 int err = 0; 425 426 sc = (struct fwohci_softc *)device_get_softc(dev); 427 child = device_add_child(dev, name, unit); 428 if (child == NULL) 429 return (child); 430 431 sc->fc.bdev = child; |
432 device_set_ivars(child, &sc->fc); |
433 434 err = device_probe_and_attach(child); 435 if (err) { 436 device_printf(dev, "probe_and_attach failed with err=%d\n", 437 err); 438 fwohci_pci_detach(dev); 439 device_delete_child(dev, child); 440 return NULL; 441 } 442 443 /* XXX 444 * Clear the bus reset event flag to start transactions even when 445 * interrupt is disabled during the boot process. 446 */ 447 if (cold) { 448 int s; 449 DELAY(250); /* 2 cycles */ 450 s = splfw(); |
451 fwohci_poll(&sc->fc, 0, -1); |
452 splx(s); 453 } 454 455 return (child); 456} 457 458static device_method_t fwohci_methods[] = { 459 /* Device interface */ --- 25 unchanged lines hidden --- |