Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[TC] defxx: TURBOchannel support

This is a set of changes to add TURBOchannel support to the defxx driver. As
at this point the EISA support in the driver has become the only not having
been converted to the driver model, I took the opportunity to convert it as
well. Plus support for MMIO in addition to PIO operation as TURBOchannel
requires it anyway.

Signed-off-by: Maciej W. Rozycki <macro@linux-mips.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Acked-by: Jeff Garzik <jeff@garzik.org>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>

authored by

Maciej W. Rozycki and committed by
Ralf Baechle
e89a2cfb 33cf45b9

+680 -370
+26 -6
drivers/net/Kconfig
··· 2534 2534 2535 2535 config FDDI 2536 2536 bool "FDDI driver support" 2537 - depends on (PCI || EISA) 2537 + depends on (PCI || EISA || TC) 2538 2538 help 2539 2539 Fiber Distributed Data Interface is a high speed local area network 2540 2540 design; essentially a replacement for high speed Ethernet. FDDI can ··· 2544 2544 will say N. 2545 2545 2546 2546 config DEFXX 2547 - tristate "Digital DEFEA and DEFPA adapter support" 2548 - depends on FDDI && (PCI || EISA) 2549 - help 2550 - This is support for the DIGITAL series of EISA (DEFEA) and PCI 2551 - (DEFPA) controllers which can connect you to a local FDDI network. 2547 + tristate "Digital DEFTA/DEFEA/DEFPA adapter support" 2548 + depends on FDDI && (PCI || EISA || TC) 2549 + ---help--- 2550 + This is support for the DIGITAL series of TURBOchannel (DEFTA), 2551 + EISA (DEFEA) and PCI (DEFPA) controllers which can connect you 2552 + to a local FDDI network. 2553 + 2554 + To compile this driver as a module, choose M here: the module 2555 + will be called defxx. If unsure, say N. 2556 + 2557 + config DEFXX_MMIO 2558 + bool 2559 + prompt "Use MMIO instead of PIO" if PCI || EISA 2560 + depends on DEFXX 2561 + default n if PCI || EISA 2562 + default y 2563 + ---help--- 2564 + This instructs the driver to use EISA or PCI memory-mapped I/O 2565 + (MMIO) as appropriate instead of programmed I/O ports (PIO). 2566 + Enabling this gives an improvement in processing time in parts 2567 + of the driver, but it may cause problems with EISA (DEFEA) 2568 + adapters. TURBOchannel does not have the concept of I/O ports, 2569 + so MMIO is always used for these (DEFTA) adapters. 2570 + 2571 + If unsure, say N. 2552 2572 2553 2573 config SKFP 2554 2574 tristate "SysKonnect FDDI PCI support"
+618 -342
drivers/net/defxx.c
··· 10 10 * 11 11 * Abstract: 12 12 * A Linux device driver supporting the Digital Equipment Corporation 13 - * FDDI EISA and PCI controller families. Supported adapters include: 13 + * FDDI TURBOchannel, EISA and PCI controller families. Supported 14 + * adapters include: 14 15 * 15 - * DEC FDDIcontroller/EISA (DEFEA) 16 - * DEC FDDIcontroller/PCI (DEFPA) 16 + * DEC FDDIcontroller/TURBOchannel (DEFTA) 17 + * DEC FDDIcontroller/EISA (DEFEA) 18 + * DEC FDDIcontroller/PCI (DEFPA) 17 19 * 18 20 * The original author: 19 21 * LVS Lawrence V. Stefani <lstefani@yahoo.com> ··· 195 193 * 14 Aug 2004 macro Fix device names reported. 196 194 * 14 Jun 2005 macro Use irqreturn_t. 197 195 * 23 Oct 2006 macro Big-endian host support. 196 + * 14 Dec 2006 macro TURBOchannel support. 198 197 */ 199 198 200 199 /* Include files */ 201 - 202 - #include <linux/module.h> 203 - #include <linux/kernel.h> 204 - #include <linux/string.h> 205 - #include <linux/errno.h> 206 - #include <linux/ioport.h> 207 - #include <linux/slab.h> 208 - #include <linux/interrupt.h> 209 - #include <linux/pci.h> 210 - #include <linux/delay.h> 211 - #include <linux/init.h> 212 - #include <linux/netdevice.h> 213 - #include <linux/fddidevice.h> 214 - #include <linux/skbuff.h> 215 200 #include <linux/bitops.h> 201 + #include <linux/delay.h> 202 + #include <linux/dma-mapping.h> 203 + #include <linux/eisa.h> 204 + #include <linux/errno.h> 205 + #include <linux/fddidevice.h> 206 + #include <linux/init.h> 207 + #include <linux/interrupt.h> 208 + #include <linux/ioport.h> 209 + #include <linux/kernel.h> 210 + #include <linux/module.h> 211 + #include <linux/netdevice.h> 212 + #include <linux/pci.h> 213 + #include <linux/skbuff.h> 214 + #include <linux/slab.h> 215 + #include <linux/string.h> 216 + #include <linux/tc.h> 216 217 217 218 #include <asm/byteorder.h> 218 219 #include <asm/io.h> ··· 224 219 225 220 /* Version information string should be updated prior to each new release! */ 226 221 #define DRV_NAME "defxx" 227 - #define DRV_VERSION "v1.09" 228 - #define DRV_RELDATE "2006/10/23" 222 + #define DRV_VERSION "v1.10" 223 + #define DRV_RELDATE "2006/12/14" 229 224 230 225 static char version[] __devinitdata = 231 226 DRV_NAME ": " DRV_VERSION " " DRV_RELDATE ··· 240 235 */ 241 236 #define NEW_SKB_SIZE (PI_RCV_DATA_K_SIZE_MAX+128) 242 237 238 + #define __unused __attribute__ ((unused)) 239 + 240 + #ifdef CONFIG_PCI 241 + #define DFX_BUS_PCI(dev) (dev->bus == &pci_bus_type) 242 + #else 243 + #define DFX_BUS_PCI(dev) 0 244 + #endif 245 + 246 + #ifdef CONFIG_EISA 247 + #define DFX_BUS_EISA(dev) (dev->bus == &eisa_bus_type) 248 + #else 249 + #define DFX_BUS_EISA(dev) 0 250 + #endif 251 + 252 + #ifdef CONFIG_TC 253 + #define DFX_BUS_TC(dev) (dev->bus == &tc_bus_type) 254 + #else 255 + #define DFX_BUS_TC(dev) 0 256 + #endif 257 + 258 + #ifdef CONFIG_DEFXX_MMIO 259 + #define DFX_MMIO 1 260 + #else 261 + #define DFX_MMIO 0 262 + #endif 263 + 243 264 /* Define module-wide (static) routines */ 244 265 245 266 static void dfx_bus_init(struct net_device *dev); 267 + static void dfx_bus_uninit(struct net_device *dev); 246 268 static void dfx_bus_config_check(DFX_board_t *bp); 247 269 248 - static int dfx_driver_init(struct net_device *dev, const char *print_name); 270 + static int dfx_driver_init(struct net_device *dev, 271 + const char *print_name, 272 + resource_size_t bar_start); 249 273 static int dfx_adap_init(DFX_board_t *bp, int get_buffers); 250 274 251 275 static int dfx_open(struct net_device *dev); ··· 307 273 308 274 /* Define module-wide (static) variables */ 309 275 310 - static struct net_device *root_dfx_eisa_dev; 276 + static struct pci_driver dfx_pci_driver; 277 + static struct eisa_driver dfx_eisa_driver; 278 + static struct tc_driver dfx_tc_driver; 311 279 312 280 313 281 /* 314 282 * ======================= 315 - * = dfx_port_write_byte = 316 - * = dfx_port_read_byte = 317 283 * = dfx_port_write_long = 318 284 * = dfx_port_read_long = 319 285 * ======================= ··· 325 291 * None 326 292 * 327 293 * Arguments: 328 - * bp - pointer to board information 329 - * offset - register offset from base I/O address 330 - * data - for dfx_port_write_byte and dfx_port_write_long, this 331 - * is a value to write. 332 - * for dfx_port_read_byte and dfx_port_read_byte, this 333 - * is a pointer to store the read value. 294 + * bp - pointer to board information 295 + * offset - register offset from base I/O address 296 + * data - for dfx_port_write_long, this is a value to write; 297 + * for dfx_port_read_long, this is a pointer to store 298 + * the read value 334 299 * 335 300 * Functional Description: 336 301 * These routines perform the correct operation to read or write ··· 343 310 * registers using the register offsets defined in DEFXX.H. 344 311 * 345 312 * PCI port block base addresses are assigned by the PCI BIOS or system 346 - * firmware. There is one 128 byte port block which can be accessed. It 313 + * firmware. There is one 128 byte port block which can be accessed. It 347 314 * allows for I/O mapping of both PDQ and PFI registers using the register 348 315 * offsets defined in DEFXX.H. 349 316 * ··· 351 318 * None 352 319 * 353 320 * Assumptions: 354 - * bp->base_addr is a valid base I/O address for this adapter. 321 + * bp->base is a valid base I/O address for this adapter. 355 322 * offset is a valid register offset for this adapter. 356 323 * 357 324 * Side Effects: ··· 362 329 * advantage of strict data type checking. 363 330 */ 364 331 365 - static inline void dfx_port_write_byte( 366 - DFX_board_t *bp, 367 - int offset, 368 - u8 data 369 - ) 332 + static inline void dfx_writel(DFX_board_t *bp, int offset, u32 data) 333 + { 334 + writel(data, bp->base.mem + offset); 335 + mb(); 336 + } 370 337 371 - { 372 - u16 port = bp->base_addr + offset; 338 + static inline void dfx_outl(DFX_board_t *bp, int offset, u32 data) 339 + { 340 + outl(data, bp->base.port + offset); 341 + } 373 342 374 - outb(data, port); 375 - } 343 + static void dfx_port_write_long(DFX_board_t *bp, int offset, u32 data) 344 + { 345 + struct device __unused *bdev = bp->bus_dev; 346 + int dfx_bus_tc = DFX_BUS_TC(bdev); 347 + int dfx_use_mmio = DFX_MMIO || dfx_bus_tc; 376 348 377 - static inline void dfx_port_read_byte( 378 - DFX_board_t *bp, 379 - int offset, 380 - u8 *data 381 - ) 349 + if (dfx_use_mmio) 350 + dfx_writel(bp, offset, data); 351 + else 352 + dfx_outl(bp, offset, data); 353 + } 382 354 383 - { 384 - u16 port = bp->base_addr + offset; 385 355 386 - *data = inb(port); 387 - } 356 + static inline void dfx_readl(DFX_board_t *bp, int offset, u32 *data) 357 + { 358 + mb(); 359 + *data = readl(bp->base.mem + offset); 360 + } 388 361 389 - static inline void dfx_port_write_long( 390 - DFX_board_t *bp, 391 - int offset, 392 - u32 data 393 - ) 362 + static inline void dfx_inl(DFX_board_t *bp, int offset, u32 *data) 363 + { 364 + *data = inl(bp->base.port + offset); 365 + } 394 366 395 - { 396 - u16 port = bp->base_addr + offset; 367 + static void dfx_port_read_long(DFX_board_t *bp, int offset, u32 *data) 368 + { 369 + struct device __unused *bdev = bp->bus_dev; 370 + int dfx_bus_tc = DFX_BUS_TC(bdev); 371 + int dfx_use_mmio = DFX_MMIO || dfx_bus_tc; 397 372 398 - outl(data, port); 399 - } 400 - 401 - static inline void dfx_port_read_long( 402 - DFX_board_t *bp, 403 - int offset, 404 - u32 *data 405 - ) 406 - 407 - { 408 - u16 port = bp->base_addr + offset; 409 - 410 - *data = inl(port); 411 - } 373 + if (dfx_use_mmio) 374 + dfx_readl(bp, offset, data); 375 + else 376 + dfx_inl(bp, offset, data); 377 + } 412 378 413 379 414 380 /* 415 - * ============= 416 - * = dfx_init_one_pci_or_eisa = 417 - * ============= 381 + * ================ 382 + * = dfx_get_bars = 383 + * ================ 418 384 * 419 385 * Overview: 420 - * Initializes a supported FDDI EISA or PCI controller 386 + * Retrieves the address range used to access control and status 387 + * registers. 388 + * 389 + * Returns: 390 + * None 391 + * 392 + * Arguments: 393 + * bdev - pointer to device information 394 + * bar_start - pointer to store the start address 395 + * bar_len - pointer to store the length of the area 396 + * 397 + * Assumptions: 398 + * I am sure there are some. 399 + * 400 + * Side Effects: 401 + * None 402 + */ 403 + static void dfx_get_bars(struct device *bdev, 404 + resource_size_t *bar_start, resource_size_t *bar_len) 405 + { 406 + int dfx_bus_pci = DFX_BUS_PCI(bdev); 407 + int dfx_bus_eisa = DFX_BUS_EISA(bdev); 408 + int dfx_bus_tc = DFX_BUS_TC(bdev); 409 + int dfx_use_mmio = DFX_MMIO || dfx_bus_tc; 410 + 411 + if (dfx_bus_pci) { 412 + int num = dfx_use_mmio ? 0 : 1; 413 + 414 + *bar_start = pci_resource_start(to_pci_dev(bdev), num); 415 + *bar_len = pci_resource_len(to_pci_dev(bdev), num); 416 + } 417 + if (dfx_bus_eisa) { 418 + unsigned long base_addr = to_eisa_device(bdev)->base_addr; 419 + resource_size_t bar; 420 + 421 + if (dfx_use_mmio) { 422 + bar = inb(base_addr + PI_ESIC_K_MEM_ADD_CMP_2); 423 + bar <<= 8; 424 + bar |= inb(base_addr + PI_ESIC_K_MEM_ADD_CMP_1); 425 + bar <<= 8; 426 + bar |= inb(base_addr + PI_ESIC_K_MEM_ADD_CMP_0); 427 + bar <<= 16; 428 + *bar_start = bar; 429 + bar = inb(base_addr + PI_ESIC_K_MEM_ADD_MASK_2); 430 + bar <<= 8; 431 + bar |= inb(base_addr + PI_ESIC_K_MEM_ADD_MASK_1); 432 + bar <<= 8; 433 + bar |= inb(base_addr + PI_ESIC_K_MEM_ADD_MASK_0); 434 + bar <<= 16; 435 + *bar_len = (bar | PI_MEM_ADD_MASK_M) + 1; 436 + } else { 437 + *bar_start = base_addr; 438 + *bar_len = PI_ESIC_K_CSR_IO_LEN; 439 + } 440 + } 441 + if (dfx_bus_tc) { 442 + *bar_start = to_tc_dev(bdev)->resource.start + 443 + PI_TC_K_CSR_OFFSET; 444 + *bar_len = PI_TC_K_CSR_LEN; 445 + } 446 + } 447 + 448 + /* 449 + * ================ 450 + * = dfx_register = 451 + * ================ 452 + * 453 + * Overview: 454 + * Initializes a supported FDDI controller 421 455 * 422 456 * Returns: 423 457 * Condition code 424 458 * 425 459 * Arguments: 426 - * pdev - pointer to pci device information (NULL for EISA) 427 - * ioaddr - pointer to port (NULL for PCI) 460 + * bdev - pointer to device information 428 461 * 429 462 * Functional Description: 430 463 * ··· 506 407 * initialized and the board resources are read and stored in 507 408 * the device structure. 508 409 */ 509 - static int __devinit dfx_init_one_pci_or_eisa(struct pci_dev *pdev, long ioaddr) 410 + static int __devinit dfx_register(struct device *bdev) 510 411 { 511 412 static int version_disp; 512 - char *print_name = DRV_NAME; 413 + int dfx_bus_pci = DFX_BUS_PCI(bdev); 414 + int dfx_bus_tc = DFX_BUS_TC(bdev); 415 + int dfx_use_mmio = DFX_MMIO || dfx_bus_tc; 416 + char *print_name = bdev->bus_id; 513 417 struct net_device *dev; 514 418 DFX_board_t *bp; /* board pointer */ 419 + resource_size_t bar_start = 0; /* pointer to port */ 420 + resource_size_t bar_len = 0; /* resource length */ 515 421 int alloc_size; /* total buffer size used */ 516 - int err; 422 + struct resource *region; 423 + int err = 0; 517 424 518 425 if (!version_disp) { /* display version info if adapter is found */ 519 426 version_disp = 1; /* set display flag to TRUE so that */ 520 427 printk(version); /* we only display this string ONCE */ 521 428 } 522 429 523 - if (pdev != NULL) 524 - print_name = pci_name(pdev); 525 - 526 430 dev = alloc_fddidev(sizeof(*bp)); 527 431 if (!dev) { 528 - printk(KERN_ERR "%s: unable to allocate fddidev, aborting\n", 432 + printk(KERN_ERR "%s: Unable to allocate fddidev, aborting\n", 529 433 print_name); 530 434 return -ENOMEM; 531 435 } 532 436 533 437 /* Enable PCI device. */ 534 - if (pdev != NULL) { 535 - err = pci_enable_device (pdev); 536 - if (err) goto err_out; 537 - ioaddr = pci_resource_start (pdev, 1); 538 - } 539 - 540 - SET_MODULE_OWNER(dev); 541 - if (pdev != NULL) 542 - SET_NETDEV_DEV(dev, &pdev->dev); 543 - 544 - bp = dev->priv; 545 - 546 - if (!request_region(ioaddr, 547 - pdev ? PFI_K_CSR_IO_LEN : PI_ESIC_K_CSR_IO_LEN, 548 - print_name)) { 549 - printk(KERN_ERR "%s: Cannot reserve I/O resource " 550 - "0x%x @ 0x%lx, aborting\n", print_name, 551 - pdev ? PFI_K_CSR_IO_LEN : PI_ESIC_K_CSR_IO_LEN, ioaddr); 552 - err = -EBUSY; 438 + if (dfx_bus_pci && pci_enable_device(to_pci_dev(bdev))) { 439 + printk(KERN_ERR "%s: Cannot enable PCI device, aborting\n", 440 + print_name); 553 441 goto err_out; 554 442 } 555 443 556 - /* Initialize new device structure */ 444 + SET_MODULE_OWNER(dev); 445 + SET_NETDEV_DEV(dev, bdev); 557 446 558 - dev->base_addr = ioaddr; /* save port (I/O) base address */ 447 + bp = netdev_priv(dev); 448 + bp->bus_dev = bdev; 449 + dev_set_drvdata(bdev, dev); 450 + 451 + dfx_get_bars(bdev, &bar_start, &bar_len); 452 + 453 + if (dfx_use_mmio) 454 + region = request_mem_region(bar_start, bar_len, print_name); 455 + else 456 + region = request_region(bar_start, bar_len, print_name); 457 + if (!region) { 458 + printk(KERN_ERR "%s: Cannot reserve I/O resource " 459 + "0x%lx @ 0x%lx, aborting\n", 460 + print_name, (long)bar_len, (long)bar_start); 461 + err = -EBUSY; 462 + goto err_out_disable; 463 + } 464 + 465 + /* Set up I/O base address. */ 466 + if (dfx_use_mmio) { 467 + bp->base.mem = ioremap_nocache(bar_start, bar_len); 468 + if (!bp->base.mem) { 469 + printk(KERN_ERR "%s: Cannot map MMIO\n", print_name); 470 + goto err_out_region; 471 + } 472 + } else { 473 + bp->base.port = bar_start; 474 + dev->base_addr = bar_start; 475 + } 476 + 477 + /* Initialize new device structure */ 559 478 560 479 dev->get_stats = dfx_ctl_get_stats; 561 480 dev->open = dfx_open; ··· 582 465 dev->set_multicast_list = dfx_ctl_set_multicast_list; 583 466 dev->set_mac_address = dfx_ctl_set_mac_address; 584 467 585 - if (pdev == NULL) { 586 - /* EISA board */ 587 - bp->bus_type = DFX_BUS_TYPE_EISA; 588 - bp->next = root_dfx_eisa_dev; 589 - root_dfx_eisa_dev = dev; 590 - } else { 591 - /* PCI board */ 592 - bp->bus_type = DFX_BUS_TYPE_PCI; 593 - bp->pci_dev = pdev; 594 - pci_set_drvdata (pdev, dev); 595 - pci_set_master (pdev); 596 - } 468 + if (dfx_bus_pci) 469 + pci_set_master(to_pci_dev(bdev)); 597 470 598 - if (dfx_driver_init(dev, print_name) != DFX_K_SUCCESS) { 471 + if (dfx_driver_init(dev, print_name, bar_start) != DFX_K_SUCCESS) { 599 472 err = -ENODEV; 600 - goto err_out_region; 473 + goto err_out_unmap; 601 474 } 602 475 603 476 err = register_netdev(dev); ··· 606 499 sizeof(PI_CONSUMER_BLOCK) + 607 500 (PI_ALIGN_K_DESC_BLK - 1); 608 501 if (bp->kmalloced) 609 - pci_free_consistent(pdev, alloc_size, 610 - bp->kmalloced, bp->kmalloced_dma); 502 + dma_free_coherent(bdev, alloc_size, 503 + bp->kmalloced, bp->kmalloced_dma); 504 + 505 + err_out_unmap: 506 + if (dfx_use_mmio) 507 + iounmap(bp->base.mem); 508 + 611 509 err_out_region: 612 - release_region(ioaddr, pdev ? PFI_K_CSR_IO_LEN : PI_ESIC_K_CSR_IO_LEN); 510 + if (dfx_use_mmio) 511 + release_mem_region(bar_start, bar_len); 512 + else 513 + release_region(bar_start, bar_len); 514 + 515 + err_out_disable: 516 + if (dfx_bus_pci) 517 + pci_disable_device(to_pci_dev(bdev)); 518 + 613 519 err_out: 614 520 free_netdev(dev); 615 521 return err; 616 522 } 617 523 618 - static int __devinit dfx_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) 619 - { 620 - return dfx_init_one_pci_or_eisa(pdev, 0); 621 - } 622 - 623 - static int __init dfx_eisa_init(void) 624 - { 625 - int rc = -ENODEV; 626 - int i; /* used in for loops */ 627 - u16 port; /* temporary I/O (port) address */ 628 - u32 slot_id; /* EISA hardware (slot) ID read from adapter */ 629 - 630 - DBG_printk("In dfx_eisa_init...\n"); 631 - 632 - /* Scan for FDDI EISA controllers */ 633 - 634 - for (i=0; i < DFX_MAX_EISA_SLOTS; i++) /* only scan for up to 16 EISA slots */ 635 - { 636 - port = (i << 12) + PI_ESIC_K_SLOT_ID; /* port = I/O address for reading slot ID */ 637 - slot_id = inl(port); /* read EISA HW (slot) ID */ 638 - if ((slot_id & 0xF0FFFFFF) == DEFEA_PRODUCT_ID) 639 - { 640 - port = (i << 12); /* recalc base addr */ 641 - 642 - if (dfx_init_one_pci_or_eisa(NULL, port) == 0) rc = 0; 643 - } 644 - } 645 - return rc; 646 - } 647 524 648 525 /* 649 526 * ================ ··· 635 544 * ================ 636 545 * 637 546 * Overview: 638 - * Initializes EISA and PCI controller bus-specific logic. 547 + * Initializes the bus-specific controller logic. 639 548 * 640 549 * Returns: 641 550 * None ··· 651 560 * None 652 561 * 653 562 * Assumptions: 654 - * dev->base_addr has already been set with the proper 563 + * bp->base has already been set with the proper 655 564 * base I/O address for this device. 656 565 * 657 566 * Side Effects: ··· 662 571 663 572 static void __devinit dfx_bus_init(struct net_device *dev) 664 573 { 665 - DFX_board_t *bp = dev->priv; 666 - u8 val; /* used for I/O read/writes */ 574 + DFX_board_t *bp = netdev_priv(dev); 575 + struct device *bdev = bp->bus_dev; 576 + int dfx_bus_pci = DFX_BUS_PCI(bdev); 577 + int dfx_bus_eisa = DFX_BUS_EISA(bdev); 578 + int dfx_bus_tc = DFX_BUS_TC(bdev); 579 + int dfx_use_mmio = DFX_MMIO || dfx_bus_tc; 580 + u8 val; 667 581 668 582 DBG_printk("In dfx_bus_init...\n"); 669 583 670 - /* 671 - * Initialize base I/O address field in bp structure 672 - * 673 - * Note: bp->base_addr is the same as dev->base_addr. 674 - * It's useful because often we'll need to read 675 - * or write registers where we already have the 676 - * bp pointer instead of the dev pointer. Having 677 - * the base address in the bp structure will 678 - * save a pointer dereference. 679 - * 680 - * IMPORTANT!! This field must be defined before 681 - * any of the dfx_port_* inline functions are 682 - * called. 683 - */ 684 - 685 - bp->base_addr = dev->base_addr; 686 - 687 - /* And a pointer back to the net_device struct */ 584 + /* Initialize a pointer back to the net_device struct */ 688 585 bp->dev = dev; 689 586 690 587 /* Initialize adapter based on bus type */ 691 588 692 - if (bp->bus_type == DFX_BUS_TYPE_EISA) 693 - { 694 - /* Get the interrupt level from the ESIC chip */ 589 + if (dfx_bus_tc) 590 + dev->irq = to_tc_dev(bdev)->interrupt; 591 + if (dfx_bus_eisa) { 592 + unsigned long base_addr = to_eisa_device(bdev)->base_addr; 695 593 696 - dfx_port_read_byte(bp, PI_ESIC_K_IO_CONFIG_STAT_0, &val); 697 - switch ((val & PI_CONFIG_STAT_0_M_IRQ) >> PI_CONFIG_STAT_0_V_IRQ) 698 - { 699 - case PI_CONFIG_STAT_0_IRQ_K_9: 700 - dev->irq = 9; 701 - break; 594 + /* Get the interrupt level from the ESIC chip. */ 595 + val = inb(base_addr + PI_ESIC_K_IO_CONFIG_STAT_0); 596 + val &= PI_CONFIG_STAT_0_M_IRQ; 597 + val >>= PI_CONFIG_STAT_0_V_IRQ; 702 598 703 - case PI_CONFIG_STAT_0_IRQ_K_10: 704 - dev->irq = 10; 705 - break; 599 + switch (val) { 600 + case PI_CONFIG_STAT_0_IRQ_K_9: 601 + dev->irq = 9; 602 + break; 706 603 707 - case PI_CONFIG_STAT_0_IRQ_K_11: 708 - dev->irq = 11; 709 - break; 604 + case PI_CONFIG_STAT_0_IRQ_K_10: 605 + dev->irq = 10; 606 + break; 710 607 711 - case PI_CONFIG_STAT_0_IRQ_K_15: 712 - dev->irq = 15; 713 - break; 714 - } 608 + case PI_CONFIG_STAT_0_IRQ_K_11: 609 + dev->irq = 11; 610 + break; 715 611 716 - /* Enable access to I/O on the board by writing 0x03 to Function Control Register */ 717 - 718 - dfx_port_write_byte(bp, PI_ESIC_K_FUNCTION_CNTRL, PI_ESIC_K_FUNCTION_CNTRL_IO_ENB); 719 - 720 - /* Set the I/O decode range of the board */ 721 - 722 - val = ((dev->base_addr >> 12) << PI_IO_CMP_V_SLOT); 723 - dfx_port_write_byte(bp, PI_ESIC_K_IO_CMP_0_1, val); 724 - dfx_port_write_byte(bp, PI_ESIC_K_IO_CMP_1_1, val); 725 - 726 - /* Enable access to rest of module (including PDQ and packet memory) */ 727 - 728 - dfx_port_write_byte(bp, PI_ESIC_K_SLOT_CNTRL, PI_SLOT_CNTRL_M_ENB); 612 + case PI_CONFIG_STAT_0_IRQ_K_15: 613 + dev->irq = 15; 614 + break; 615 + } 729 616 730 617 /* 731 - * Map PDQ registers into I/O space. This is done by clearing a bit 732 - * in Burst Holdoff register. 618 + * Enable memory decoding (MEMCS0) and/or port decoding 619 + * (IOCS1/IOCS0) as appropriate in Function Control 620 + * Register. One of the port chip selects seems to be 621 + * used for the Burst Holdoff register, but this bit of 622 + * documentation is missing and as yet it has not been 623 + * determined which of the two. This is also the reason 624 + * the size of the decoded port range is twice as large 625 + * as one required by the PDQ. 733 626 */ 734 627 735 - dfx_port_read_byte(bp, PI_ESIC_K_BURST_HOLDOFF, &val); 736 - dfx_port_write_byte(bp, PI_ESIC_K_BURST_HOLDOFF, (val & ~PI_BURST_HOLDOFF_M_MEM_MAP)); 628 + /* Set the decode range of the board. */ 629 + val = ((bp->base.port >> 12) << PI_IO_CMP_V_SLOT); 630 + outb(base_addr + PI_ESIC_K_IO_ADD_CMP_0_1, val); 631 + outb(base_addr + PI_ESIC_K_IO_ADD_CMP_0_0, 0); 632 + outb(base_addr + PI_ESIC_K_IO_ADD_CMP_1_1, val); 633 + outb(base_addr + PI_ESIC_K_IO_ADD_CMP_1_0, 0); 634 + val = PI_ESIC_K_CSR_IO_LEN - 1; 635 + outb(base_addr + PI_ESIC_K_IO_ADD_MASK_0_1, (val >> 8) & 0xff); 636 + outb(base_addr + PI_ESIC_K_IO_ADD_MASK_0_0, val & 0xff); 637 + outb(base_addr + PI_ESIC_K_IO_ADD_MASK_1_1, (val >> 8) & 0xff); 638 + outb(base_addr + PI_ESIC_K_IO_ADD_MASK_1_0, val & 0xff); 639 + 640 + /* Enable the decoders. */ 641 + val = PI_FUNCTION_CNTRL_M_IOCS1 | PI_FUNCTION_CNTRL_M_IOCS0; 642 + if (dfx_use_mmio) 643 + val |= PI_FUNCTION_CNTRL_M_MEMCS0; 644 + outb(base_addr + PI_ESIC_K_FUNCTION_CNTRL, val); 645 + 646 + /* 647 + * Enable access to the rest of the module 648 + * (including PDQ and packet memory). 649 + */ 650 + val = PI_SLOT_CNTRL_M_ENB; 651 + outb(base_addr + PI_ESIC_K_SLOT_CNTRL, val); 652 + 653 + /* 654 + * Map PDQ registers into memory or port space. This is 655 + * done with a bit in the Burst Holdoff register. 656 + */ 657 + val = inb(base_addr + PI_DEFEA_K_BURST_HOLDOFF); 658 + if (dfx_use_mmio) 659 + val |= PI_BURST_HOLDOFF_V_MEM_MAP; 660 + else 661 + val &= ~PI_BURST_HOLDOFF_V_MEM_MAP; 662 + outb(base_addr + PI_DEFEA_K_BURST_HOLDOFF, val); 737 663 738 664 /* Enable interrupts at EISA bus interface chip (ESIC) */ 739 - 740 - dfx_port_read_byte(bp, PI_ESIC_K_IO_CONFIG_STAT_0, &val); 741 - dfx_port_write_byte(bp, PI_ESIC_K_IO_CONFIG_STAT_0, (val | PI_CONFIG_STAT_0_M_INT_ENB)); 742 - } 743 - else 744 - { 745 - struct pci_dev *pdev = bp->pci_dev; 665 + val = inb(base_addr + PI_ESIC_K_IO_CONFIG_STAT_0); 666 + val |= PI_CONFIG_STAT_0_M_INT_ENB; 667 + outb(base_addr + PI_ESIC_K_IO_CONFIG_STAT_0, val); 668 + } 669 + if (dfx_bus_pci) { 670 + struct pci_dev *pdev = to_pci_dev(bdev); 746 671 747 672 /* Get the interrupt level from the PCI Configuration Table */ 748 673 ··· 767 660 /* Check Latency Timer and set if less than minimal */ 768 661 769 662 pci_read_config_byte(pdev, PCI_LATENCY_TIMER, &val); 770 - if (val < PFI_K_LAT_TIMER_MIN) /* if less than min, override with default */ 771 - { 663 + if (val < PFI_K_LAT_TIMER_MIN) { 772 664 val = PFI_K_LAT_TIMER_DEF; 773 665 pci_write_config_byte(pdev, PCI_LATENCY_TIMER, val); 774 - } 666 + } 775 667 776 668 /* Enable interrupts at PCI bus interface chip (PFI) */ 777 - 778 - dfx_port_write_long(bp, PFI_K_REG_MODE_CTRL, (PFI_MODE_M_PDQ_INT_ENB | PFI_MODE_M_DMA_ENB)); 779 - } 669 + val = PFI_MODE_M_PDQ_INT_ENB | PFI_MODE_M_DMA_ENB; 670 + dfx_port_write_long(bp, PFI_K_REG_MODE_CTRL, val); 780 671 } 672 + } 673 + 674 + /* 675 + * ================== 676 + * = dfx_bus_uninit = 677 + * ================== 678 + * 679 + * Overview: 680 + * Uninitializes the bus-specific controller logic. 681 + * 682 + * Returns: 683 + * None 684 + * 685 + * Arguments: 686 + * dev - pointer to device information 687 + * 688 + * Functional Description: 689 + * Perform bus-specific logic uninitialization. 690 + * 691 + * Return Codes: 692 + * None 693 + * 694 + * Assumptions: 695 + * bp->base has already been set with the proper 696 + * base I/O address for this device. 697 + * 698 + * Side Effects: 699 + * Interrupts are disabled at the adapter bus-specific logic. 700 + */ 701 + 702 + static void __devinit dfx_bus_uninit(struct net_device *dev) 703 + { 704 + DFX_board_t *bp = netdev_priv(dev); 705 + struct device *bdev = bp->bus_dev; 706 + int dfx_bus_pci = DFX_BUS_PCI(bdev); 707 + int dfx_bus_eisa = DFX_BUS_EISA(bdev); 708 + u8 val; 709 + 710 + DBG_printk("In dfx_bus_uninit...\n"); 711 + 712 + /* Uninitialize adapter based on bus type */ 713 + 714 + if (dfx_bus_eisa) { 715 + unsigned long base_addr = to_eisa_device(bdev)->base_addr; 716 + 717 + /* Disable interrupts at EISA bus interface chip (ESIC) */ 718 + val = inb(base_addr + PI_ESIC_K_IO_CONFIG_STAT_0); 719 + val &= ~PI_CONFIG_STAT_0_M_INT_ENB; 720 + outb(base_addr + PI_ESIC_K_IO_CONFIG_STAT_0, val); 721 + } 722 + if (dfx_bus_pci) { 723 + /* Disable interrupts at PCI bus interface chip (PFI) */ 724 + dfx_port_write_long(bp, PFI_K_REG_MODE_CTRL, 0); 725 + } 726 + } 781 727 782 728 783 729 /* ··· 865 705 866 706 static void __devinit dfx_bus_config_check(DFX_board_t *bp) 867 707 { 708 + struct device __unused *bdev = bp->bus_dev; 709 + int dfx_bus_eisa = DFX_BUS_EISA(bdev); 868 710 int status; /* return code from adapter port control call */ 869 - u32 slot_id; /* EISA-bus hardware id (DEC3001, DEC3002,...) */ 870 711 u32 host_data; /* LW data returned from port control call */ 871 712 872 713 DBG_printk("In dfx_bus_config_check...\n"); 873 714 874 715 /* Configuration check only valid for EISA adapter */ 875 716 876 - if (bp->bus_type == DFX_BUS_TYPE_EISA) 877 - { 878 - dfx_port_read_long(bp, PI_ESIC_K_SLOT_ID, &slot_id); 879 - 717 + if (dfx_bus_eisa) { 880 718 /* 881 719 * First check if revision 2 EISA controller. Rev. 1 cards used 882 720 * PDQ revision B, so no workaround needed in this case. Rev. 3 ··· 882 724 * case, either. Only Rev. 2 cards used either Rev. D or E 883 725 * chips, so we must verify the chip revision on Rev. 2 cards. 884 726 */ 885 - 886 - if (slot_id == DEFEA_PROD_ID_2) 887 - { 727 + if (to_eisa_device(bdev)->id.driver_data == DEFEA_PROD_ID_2) { 888 728 /* 889 - * Revision 2 FDDI EISA controller found, so let's check PDQ 890 - * revision of adapter. 729 + * Revision 2 FDDI EISA controller found, 730 + * so let's check PDQ revision of adapter. 891 731 */ 892 - 893 732 status = dfx_hw_port_ctrl_req(bp, 894 733 PI_PCTRL_M_SUB_CMD, 895 734 PI_SUB_CMD_K_PDQ_REV_GET, ··· 960 805 */ 961 806 962 807 static int __devinit dfx_driver_init(struct net_device *dev, 963 - const char *print_name) 808 + const char *print_name, 809 + resource_size_t bar_start) 964 810 { 965 - DFX_board_t *bp = dev->priv; 966 - int alloc_size; /* total buffer size needed */ 967 - char *top_v, *curr_v; /* virtual addrs into memory block */ 968 - dma_addr_t top_p, curr_p; /* physical addrs into memory block */ 969 - u32 data; /* host data register value */ 811 + DFX_board_t *bp = netdev_priv(dev); 812 + struct device *bdev = bp->bus_dev; 813 + int dfx_bus_pci = DFX_BUS_PCI(bdev); 814 + int dfx_bus_eisa = DFX_BUS_EISA(bdev); 815 + int dfx_bus_tc = DFX_BUS_TC(bdev); 816 + int dfx_use_mmio = DFX_MMIO || dfx_bus_tc; 817 + int alloc_size; /* total buffer size needed */ 818 + char *top_v, *curr_v; /* virtual addrs into memory block */ 819 + dma_addr_t top_p, curr_p; /* physical addrs into memory block */ 820 + u32 data, le32; /* host data register value */ 821 + char *board_name = NULL; 970 822 971 823 DBG_printk("In dfx_driver_init...\n"); 972 824 ··· 1022 860 print_name); 1023 861 return(DFX_K_FAILURE); 1024 862 } 1025 - data = cpu_to_le32(data); 1026 - memcpy(&bp->factory_mac_addr[0], &data, sizeof(u32)); 863 + le32 = cpu_to_le32(data); 864 + memcpy(&bp->factory_mac_addr[0], &le32, sizeof(u32)); 1027 865 1028 866 if (dfx_hw_port_ctrl_req(bp, PI_PCTRL_M_MLA, PI_PDATA_A_MLA_K_HI, 0, 1029 867 &data) != DFX_K_SUCCESS) { ··· 1031 869 print_name); 1032 870 return(DFX_K_FAILURE); 1033 871 } 1034 - data = cpu_to_le32(data); 1035 - memcpy(&bp->factory_mac_addr[4], &data, sizeof(u16)); 872 + le32 = cpu_to_le32(data); 873 + memcpy(&bp->factory_mac_addr[4], &le32, sizeof(u16)); 1036 874 1037 875 /* 1038 876 * Set current address to factory address ··· 1042 880 */ 1043 881 1044 882 memcpy(dev->dev_addr, bp->factory_mac_addr, FDDI_K_ALEN); 1045 - if (bp->bus_type == DFX_BUS_TYPE_EISA) 1046 - printk("%s: DEFEA at I/O addr = 0x%lX, IRQ = %d, " 1047 - "Hardware addr = %02X-%02X-%02X-%02X-%02X-%02X\n", 1048 - print_name, dev->base_addr, dev->irq, 1049 - dev->dev_addr[0], dev->dev_addr[1], 1050 - dev->dev_addr[2], dev->dev_addr[3], 1051 - dev->dev_addr[4], dev->dev_addr[5]); 1052 - else 1053 - printk("%s: DEFPA at I/O addr = 0x%lX, IRQ = %d, " 1054 - "Hardware addr = %02X-%02X-%02X-%02X-%02X-%02X\n", 1055 - print_name, dev->base_addr, dev->irq, 1056 - dev->dev_addr[0], dev->dev_addr[1], 1057 - dev->dev_addr[2], dev->dev_addr[3], 1058 - dev->dev_addr[4], dev->dev_addr[5]); 883 + if (dfx_bus_tc) 884 + board_name = "DEFTA"; 885 + if (dfx_bus_eisa) 886 + board_name = "DEFEA"; 887 + if (dfx_bus_pci) 888 + board_name = "DEFPA"; 889 + pr_info("%s: %s at %saddr = 0x%llx, IRQ = %d, " 890 + "Hardware addr = %02X-%02X-%02X-%02X-%02X-%02X\n", 891 + print_name, board_name, dfx_use_mmio ? "" : "I/O ", 892 + (long long)bar_start, dev->irq, 893 + dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2], 894 + dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]); 1059 895 1060 896 /* 1061 897 * Get memory for descriptor block, consumer block, and other buffers ··· 1068 908 #endif 1069 909 sizeof(PI_CONSUMER_BLOCK) + 1070 910 (PI_ALIGN_K_DESC_BLK - 1); 1071 - bp->kmalloced = top_v = pci_alloc_consistent(bp->pci_dev, alloc_size, 1072 - &bp->kmalloced_dma); 911 + bp->kmalloced = top_v = dma_alloc_coherent(bp->bus_dev, alloc_size, 912 + &bp->kmalloced_dma, 913 + GFP_ATOMIC); 1073 914 if (top_v == NULL) { 1074 915 printk("%s: Could not allocate memory for host buffers " 1075 916 "and structures!\n", print_name); ··· 1380 1219 1381 1220 static int dfx_open(struct net_device *dev) 1382 1221 { 1222 + DFX_board_t *bp = netdev_priv(dev); 1383 1223 int ret; 1384 - DFX_board_t *bp = dev->priv; 1385 1224 1386 1225 DBG_printk("In dfx_open...\n"); 1387 1226 1388 1227 /* Register IRQ - support shared interrupts by passing device ptr */ 1389 1228 1390 - ret = request_irq(dev->irq, dfx_interrupt, IRQF_SHARED, dev->name, dev); 1229 + ret = request_irq(dev->irq, dfx_interrupt, IRQF_SHARED, dev->name, 1230 + dev); 1391 1231 if (ret) { 1392 1232 printk(KERN_ERR "%s: Requested IRQ %d is busy\n", dev->name, dev->irq); 1393 1233 return ret; ··· 1471 1309 1472 1310 static int dfx_close(struct net_device *dev) 1473 1311 { 1474 - DFX_board_t *bp = dev->priv; 1312 + DFX_board_t *bp = netdev_priv(dev); 1475 1313 1476 1314 DBG_printk("In dfx_close...\n"); 1477 1315 ··· 1807 1645 1808 1646 static void dfx_int_common(struct net_device *dev) 1809 1647 { 1810 - DFX_board_t *bp = dev->priv; 1648 + DFX_board_t *bp = netdev_priv(dev); 1811 1649 PI_UINT32 port_status; /* Port Status register */ 1812 1650 1813 1651 /* Process xmt interrupts - frequent case, so always call this routine */ ··· 1877 1715 1878 1716 static irqreturn_t dfx_interrupt(int irq, void *dev_id) 1879 1717 { 1880 - struct net_device *dev = dev_id; 1881 - DFX_board_t *bp; /* private board structure pointer */ 1882 - 1883 - /* Get board pointer only if device structure is valid */ 1884 - 1885 - bp = dev->priv; 1886 - 1887 - /* See if we're already servicing an interrupt */ 1718 + struct net_device *dev = dev_id; 1719 + DFX_board_t *bp = netdev_priv(dev); 1720 + struct device *bdev = bp->bus_dev; 1721 + int dfx_bus_pci = DFX_BUS_PCI(bdev); 1722 + int dfx_bus_eisa = DFX_BUS_EISA(bdev); 1723 + int dfx_bus_tc = DFX_BUS_TC(bdev); 1888 1724 1889 1725 /* Service adapter interrupts */ 1890 1726 1891 - if (bp->bus_type == DFX_BUS_TYPE_PCI) { 1727 + if (dfx_bus_pci) { 1892 1728 u32 status; 1893 1729 1894 1730 dfx_port_read_long(bp, PFI_K_REG_STATUS, &status); ··· 1910 1750 PFI_MODE_M_DMA_ENB)); 1911 1751 1912 1752 spin_unlock(&bp->lock); 1913 - } else { 1753 + } 1754 + if (dfx_bus_eisa) { 1755 + unsigned long base_addr = to_eisa_device(bdev)->base_addr; 1914 1756 u8 status; 1915 1757 1916 - dfx_port_read_byte(bp, PI_ESIC_K_IO_CONFIG_STAT_0, &status); 1758 + status = inb(base_addr + PI_ESIC_K_IO_CONFIG_STAT_0); 1917 1759 if (!(status & PI_CONFIG_STAT_0_M_PEND)) 1918 1760 return IRQ_NONE; 1919 1761 ··· 1923 1761 1924 1762 /* Disable interrupts at the ESIC */ 1925 1763 status &= ~PI_CONFIG_STAT_0_M_INT_ENB; 1926 - dfx_port_write_byte(bp, PI_ESIC_K_IO_CONFIG_STAT_0, status); 1764 + outb(base_addr + PI_ESIC_K_IO_CONFIG_STAT_0, status); 1927 1765 1928 1766 /* Call interrupt service routine for this adapter */ 1929 1767 dfx_int_common(dev); 1930 1768 1931 1769 /* Reenable interrupts at the ESIC */ 1932 - dfx_port_read_byte(bp, PI_ESIC_K_IO_CONFIG_STAT_0, &status); 1770 + status = inb(base_addr + PI_ESIC_K_IO_CONFIG_STAT_0); 1933 1771 status |= PI_CONFIG_STAT_0_M_INT_ENB; 1934 - dfx_port_write_byte(bp, PI_ESIC_K_IO_CONFIG_STAT_0, status); 1772 + outb(base_addr + PI_ESIC_K_IO_CONFIG_STAT_0, status); 1773 + 1774 + spin_unlock(&bp->lock); 1775 + } 1776 + if (dfx_bus_tc) { 1777 + u32 status; 1778 + 1779 + dfx_port_read_long(bp, PI_PDQ_K_REG_PORT_STATUS, &status); 1780 + if (!(status & (PI_PSTATUS_M_RCV_DATA_PENDING | 1781 + PI_PSTATUS_M_XMT_DATA_PENDING | 1782 + PI_PSTATUS_M_SMT_HOST_PENDING | 1783 + PI_PSTATUS_M_UNSOL_PENDING | 1784 + PI_PSTATUS_M_CMD_RSP_PENDING | 1785 + PI_PSTATUS_M_CMD_REQ_PENDING | 1786 + PI_PSTATUS_M_TYPE_0_PENDING))) 1787 + return IRQ_NONE; 1788 + 1789 + spin_lock(&bp->lock); 1790 + 1791 + /* Call interrupt service routine for this adapter */ 1792 + dfx_int_common(dev); 1935 1793 1936 1794 spin_unlock(&bp->lock); 1937 1795 } ··· 2005 1823 2006 1824 static struct net_device_stats *dfx_ctl_get_stats(struct net_device *dev) 2007 1825 { 2008 - DFX_board_t *bp = dev->priv; 1826 + DFX_board_t *bp = netdev_priv(dev); 2009 1827 2010 1828 /* Fill the bp->stats structure with driver-maintained counters */ 2011 1829 ··· 2191 2009 */ 2192 2010 2193 2011 static void dfx_ctl_set_multicast_list(struct net_device *dev) 2194 - { 2195 - DFX_board_t *bp = dev->priv; 2012 + { 2013 + DFX_board_t *bp = netdev_priv(dev); 2196 2014 int i; /* used as index in for loop */ 2197 2015 struct dev_mc_list *dmi; /* ptr to multicast addr entry */ 2198 2016 ··· 2306 2124 2307 2125 static int dfx_ctl_set_mac_address(struct net_device *dev, void *addr) 2308 2126 { 2309 - DFX_board_t *bp = dev->priv; 2310 2127 struct sockaddr *p_sockaddr = (struct sockaddr *)addr; 2128 + DFX_board_t *bp = netdev_priv(dev); 2311 2129 2312 2130 /* Copy unicast address to driver-maintained structs and update count */ 2313 2131 ··· 2946 2764 2947 2765 my_skb_align(newskb, 128); 2948 2766 bp->descr_block_virt->rcv_data[i + j].long_1 = 2949 - (u32)pci_map_single(bp->pci_dev, newskb->data, 2767 + (u32)dma_map_single(bp->bus_dev, newskb->data, 2950 2768 NEW_SKB_SIZE, 2951 - PCI_DMA_FROMDEVICE); 2769 + DMA_FROM_DEVICE); 2952 2770 /* 2953 2771 * p_rcv_buff_va is only used inside the 2954 2772 * kernel so we put the skb pointer here. ··· 3062 2880 3063 2881 my_skb_align(newskb, 128); 3064 2882 skb = (struct sk_buff *)bp->p_rcv_buff_va[entry]; 3065 - pci_unmap_single(bp->pci_dev, 2883 + dma_unmap_single(bp->bus_dev, 3066 2884 bp->descr_block_virt->rcv_data[entry].long_1, 3067 2885 NEW_SKB_SIZE, 3068 - PCI_DMA_FROMDEVICE); 2886 + DMA_FROM_DEVICE); 3069 2887 skb_reserve(skb, RCV_BUFF_K_PADDING); 3070 2888 bp->p_rcv_buff_va[entry] = (char *)newskb; 3071 2889 bp->descr_block_virt->rcv_data[entry].long_1 = 3072 - (u32)pci_map_single(bp->pci_dev, 2890 + (u32)dma_map_single(bp->bus_dev, 3073 2891 newskb->data, 3074 2892 NEW_SKB_SIZE, 3075 - PCI_DMA_FROMDEVICE); 2893 + DMA_FROM_DEVICE); 3076 2894 } else 3077 2895 skb = NULL; 3078 2896 } else ··· 3192 3010 ) 3193 3011 3194 3012 { 3195 - DFX_board_t *bp = dev->priv; 3013 + DFX_board_t *bp = netdev_priv(dev); 3196 3014 u8 prod; /* local transmit producer index */ 3197 3015 PI_XMT_DESCR *p_xmt_descr; /* ptr to transmit descriptor block entry */ 3198 3016 XMT_DRIVER_DESCR *p_xmt_drv_descr; /* ptr to transmit driver descriptor */ ··· 3298 3116 */ 3299 3117 3300 3118 p_xmt_descr->long_0 = (u32) (PI_XMT_DESCR_M_SOP | PI_XMT_DESCR_M_EOP | ((skb->len) << PI_XMT_DESCR_V_SEG_LEN)); 3301 - p_xmt_descr->long_1 = (u32)pci_map_single(bp->pci_dev, skb->data, 3302 - skb->len, PCI_DMA_TODEVICE); 3119 + p_xmt_descr->long_1 = (u32)dma_map_single(bp->bus_dev, skb->data, 3120 + skb->len, DMA_TO_DEVICE); 3303 3121 3304 3122 /* 3305 3123 * Verify that descriptor is actually available ··· 3402 3220 3403 3221 /* Return skb to operating system */ 3404 3222 comp = bp->rcv_xmt_reg.index.xmt_comp; 3405 - pci_unmap_single(bp->pci_dev, 3223 + dma_unmap_single(bp->bus_dev, 3406 3224 bp->descr_block_virt->xmt_data[comp].long_1, 3407 3225 p_xmt_drv_descr->p_skb->len, 3408 - PCI_DMA_TODEVICE); 3226 + DMA_TO_DEVICE); 3409 3227 dev_kfree_skb_irq(p_xmt_drv_descr->p_skb); 3410 3228 3411 3229 /* ··· 3526 3344 3527 3345 /* Return skb to operating system */ 3528 3346 comp = bp->rcv_xmt_reg.index.xmt_comp; 3529 - pci_unmap_single(bp->pci_dev, 3347 + dma_unmap_single(bp->bus_dev, 3530 3348 bp->descr_block_virt->xmt_data[comp].long_1, 3531 3349 p_xmt_drv_descr->p_skb->len, 3532 - PCI_DMA_TODEVICE); 3350 + DMA_TO_DEVICE); 3533 3351 dev_kfree_skb(p_xmt_drv_descr->p_skb); 3534 3352 3535 3353 /* Increment transmit error counter */ ··· 3557 3375 bp->cons_block_virt->xmt_rcv_data = prod_cons; 3558 3376 } 3559 3377 3560 - static void __devexit dfx_remove_one_pci_or_eisa(struct pci_dev *pdev, struct net_device *dev) 3378 + /* 3379 + * ================== 3380 + * = dfx_unregister = 3381 + * ================== 3382 + * 3383 + * Overview: 3384 + * Shuts down an FDDI controller 3385 + * 3386 + * Returns: 3387 + * Condition code 3388 + * 3389 + * Arguments: 3390 + * bdev - pointer to device information 3391 + * 3392 + * Functional Description: 3393 + * 3394 + * Return Codes: 3395 + * None 3396 + * 3397 + * Assumptions: 3398 + * It compiles so it should work :-( (PCI cards do :-) 3399 + * 3400 + * Side Effects: 3401 + * Device structures for FDDI adapters (fddi0, fddi1, etc) are 3402 + * freed. 3403 + */ 3404 + static void __devexit dfx_unregister(struct device *bdev) 3561 3405 { 3562 - DFX_board_t *bp = dev->priv; 3406 + struct net_device *dev = dev_get_drvdata(bdev); 3407 + DFX_board_t *bp = netdev_priv(dev); 3408 + int dfx_bus_pci = DFX_BUS_PCI(bdev); 3409 + int dfx_bus_tc = DFX_BUS_TC(bdev); 3410 + int dfx_use_mmio = DFX_MMIO || dfx_bus_tc; 3411 + resource_size_t bar_start = 0; /* pointer to port */ 3412 + resource_size_t bar_len = 0; /* resource length */ 3563 3413 int alloc_size; /* total buffer size used */ 3564 3414 3565 3415 unregister_netdev(dev); 3566 - release_region(dev->base_addr, pdev ? PFI_K_CSR_IO_LEN : PI_ESIC_K_CSR_IO_LEN ); 3567 3416 3568 3417 alloc_size = sizeof(PI_DESCR_BLOCK) + 3569 3418 PI_CMD_REQ_K_SIZE_MAX + PI_CMD_RSP_K_SIZE_MAX + ··· 3604 3391 sizeof(PI_CONSUMER_BLOCK) + 3605 3392 (PI_ALIGN_K_DESC_BLK - 1); 3606 3393 if (bp->kmalloced) 3607 - pci_free_consistent(pdev, alloc_size, bp->kmalloced, 3608 - bp->kmalloced_dma); 3394 + dma_free_coherent(bdev, alloc_size, 3395 + bp->kmalloced, bp->kmalloced_dma); 3396 + 3397 + dfx_bus_uninit(dev); 3398 + 3399 + dfx_get_bars(bdev, &bar_start, &bar_len); 3400 + if (dfx_use_mmio) { 3401 + iounmap(bp->base.mem); 3402 + release_mem_region(bar_start, bar_len); 3403 + } else 3404 + release_region(bar_start, bar_len); 3405 + 3406 + if (dfx_bus_pci) 3407 + pci_disable_device(to_pci_dev(bdev)); 3408 + 3609 3409 free_netdev(dev); 3610 3410 } 3611 3411 3612 - static void __devexit dfx_remove_one (struct pci_dev *pdev) 3613 - { 3614 - struct net_device *dev = pci_get_drvdata(pdev); 3615 3412 3616 - dfx_remove_one_pci_or_eisa(pdev, dev); 3617 - pci_set_drvdata(pdev, NULL); 3618 - } 3413 + static int __devinit __unused dfx_dev_register(struct device *); 3414 + static int __devexit __unused dfx_dev_unregister(struct device *); 3619 3415 3620 - static struct pci_device_id dfx_pci_tbl[] = { 3621 - { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_FDDI, PCI_ANY_ID, PCI_ANY_ID, }, 3622 - { 0, } 3416 + #ifdef CONFIG_PCI 3417 + static int __devinit dfx_pci_register(struct pci_dev *, 3418 + const struct pci_device_id *); 3419 + static void __devexit dfx_pci_unregister(struct pci_dev *); 3420 + 3421 + static struct pci_device_id dfx_pci_table[] = { 3422 + { PCI_DEVICE(PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_FDDI) }, 3423 + { } 3623 3424 }; 3624 - MODULE_DEVICE_TABLE(pci, dfx_pci_tbl); 3425 + MODULE_DEVICE_TABLE(pci, dfx_pci_table); 3625 3426 3626 - static struct pci_driver dfx_driver = { 3427 + static struct pci_driver dfx_pci_driver = { 3627 3428 .name = "defxx", 3628 - .probe = dfx_init_one, 3629 - .remove = __devexit_p(dfx_remove_one), 3630 - .id_table = dfx_pci_tbl, 3429 + .id_table = dfx_pci_table, 3430 + .probe = dfx_pci_register, 3431 + .remove = __devexit_p(dfx_pci_unregister), 3631 3432 }; 3632 3433 3633 - static int dfx_have_pci; 3634 - static int dfx_have_eisa; 3635 - 3636 - 3637 - static void __exit dfx_eisa_cleanup(void) 3434 + static __devinit int dfx_pci_register(struct pci_dev *pdev, 3435 + const struct pci_device_id *ent) 3638 3436 { 3639 - struct net_device *dev = root_dfx_eisa_dev; 3640 - 3641 - while (dev) 3642 - { 3643 - struct net_device *tmp; 3644 - DFX_board_t *bp; 3645 - 3646 - bp = (DFX_board_t*)dev->priv; 3647 - tmp = bp->next; 3648 - dfx_remove_one_pci_or_eisa(NULL, dev); 3649 - dev = tmp; 3650 - } 3437 + return dfx_register(&pdev->dev); 3651 3438 } 3652 3439 3653 - static int __init dfx_init(void) 3440 + static void __devexit dfx_pci_unregister(struct pci_dev *pdev) 3654 3441 { 3655 - int rc_pci, rc_eisa; 3442 + dfx_unregister(&pdev->dev); 3443 + } 3444 + #endif /* CONFIG_PCI */ 3656 3445 3657 - rc_pci = pci_register_driver(&dfx_driver); 3658 - if (rc_pci >= 0) dfx_have_pci = 1; 3446 + #ifdef CONFIG_EISA 3447 + static struct eisa_device_id dfx_eisa_table[] = { 3448 + { "DEC3001", DEFEA_PROD_ID_1 }, 3449 + { "DEC3002", DEFEA_PROD_ID_2 }, 3450 + { "DEC3003", DEFEA_PROD_ID_3 }, 3451 + { "DEC3004", DEFEA_PROD_ID_4 }, 3452 + { } 3453 + }; 3454 + MODULE_DEVICE_TABLE(eisa, dfx_eisa_table); 3659 3455 3660 - rc_eisa = dfx_eisa_init(); 3661 - if (rc_eisa >= 0) dfx_have_eisa = 1; 3456 + static struct eisa_driver dfx_eisa_driver = { 3457 + .id_table = dfx_eisa_table, 3458 + .driver = { 3459 + .name = "defxx", 3460 + .bus = &eisa_bus_type, 3461 + .probe = dfx_dev_register, 3462 + .remove = __devexit_p(dfx_dev_unregister), 3463 + }, 3464 + }; 3465 + #endif /* CONFIG_EISA */ 3662 3466 3663 - return ((rc_eisa < 0) ? 0 : rc_eisa) + ((rc_pci < 0) ? 0 : rc_pci); 3467 + #ifdef CONFIG_TC 3468 + static struct tc_device_id const dfx_tc_table[] = { 3469 + { "DEC ", "PMAF-FA " }, 3470 + { "DEC ", "PMAF-FD " }, 3471 + { "DEC ", "PMAF-FS " }, 3472 + { "DEC ", "PMAF-FU " }, 3473 + { } 3474 + }; 3475 + MODULE_DEVICE_TABLE(tc, dfx_tc_table); 3476 + 3477 + static struct tc_driver dfx_tc_driver = { 3478 + .id_table = dfx_tc_table, 3479 + .driver = { 3480 + .name = "defxx", 3481 + .bus = &tc_bus_type, 3482 + .probe = dfx_dev_register, 3483 + .remove = __devexit_p(dfx_dev_unregister), 3484 + }, 3485 + }; 3486 + #endif /* CONFIG_TC */ 3487 + 3488 + static int __devinit __unused dfx_dev_register(struct device *dev) 3489 + { 3490 + int status; 3491 + 3492 + status = dfx_register(dev); 3493 + if (!status) 3494 + get_device(dev); 3495 + return status; 3664 3496 } 3665 3497 3666 - static void __exit dfx_cleanup(void) 3498 + static int __devexit __unused dfx_dev_unregister(struct device *dev) 3667 3499 { 3668 - if (dfx_have_pci) 3669 - pci_unregister_driver(&dfx_driver); 3670 - if (dfx_have_eisa) 3671 - dfx_eisa_cleanup(); 3500 + put_device(dev); 3501 + dfx_unregister(dev); 3502 + return 0; 3503 + } 3672 3504 3505 + 3506 + static int __devinit dfx_init(void) 3507 + { 3508 + int status; 3509 + 3510 + status = pci_register_driver(&dfx_pci_driver); 3511 + if (!status) 3512 + status = eisa_driver_register(&dfx_eisa_driver); 3513 + if (!status) 3514 + status = tc_register_driver(&dfx_tc_driver); 3515 + return status; 3516 + } 3517 + 3518 + static void __devexit dfx_cleanup(void) 3519 + { 3520 + tc_unregister_driver(&dfx_tc_driver); 3521 + eisa_driver_unregister(&dfx_eisa_driver); 3522 + pci_unregister_driver(&dfx_pci_driver); 3673 3523 } 3674 3524 3675 3525 module_init(dfx_init); 3676 3526 module_exit(dfx_cleanup); 3677 3527 MODULE_AUTHOR("Lawrence V. Stefani"); 3678 - MODULE_DESCRIPTION("DEC FDDIcontroller EISA/PCI (DEFEA/DEFPA) driver " 3528 + MODULE_DESCRIPTION("DEC FDDIcontroller TC/EISA/PCI (DEFTA/DEFEA/DEFPA) driver " 3679 3529 DRV_VERSION " " DRV_RELDATE); 3680 3530 MODULE_LICENSE("GPL"); 3681 3531
+36 -22
drivers/net/defxx.h
··· 26 26 * 12-Sep-96 LVS Removed packet request header pointers. 27 27 * 04 Aug 2003 macro Converted to the DMA API. 28 28 * 23 Oct 2006 macro Big-endian host support. 29 + * 14 Dec 2006 macro TURBOchannel support. 29 30 */ 30 31 31 32 #ifndef _DEFXX_H_ ··· 1472 1471 1473 1472 #endif /* __BIG_ENDIAN */ 1474 1473 1474 + /* Define TC PDQ CSR offset and length */ 1475 + 1476 + #define PI_TC_K_CSR_OFFSET 0x100000 1477 + #define PI_TC_K_CSR_LEN 0x40 /* 64 bytes */ 1478 + 1475 1479 /* Define EISA controller register offsets */ 1476 1480 1477 - #define PI_ESIC_K_BURST_HOLDOFF 0x040 1481 + #define PI_ESIC_K_CSR_IO_LEN 0x80 /* 128 bytes */ 1482 + 1483 + #define PI_DEFEA_K_BURST_HOLDOFF 0x040 1484 + 1478 1485 #define PI_ESIC_K_SLOT_ID 0xC80 1479 1486 #define PI_ESIC_K_SLOT_CNTRL 0xC84 1480 1487 #define PI_ESIC_K_MEM_ADD_CMP_0 0xC85 ··· 1497 1488 #define PI_ESIC_K_MEM_ADD_LO_CMP_0 0xC8E 1498 1489 #define PI_ESIC_K_MEM_ADD_LO_CMP_1 0xC8F 1499 1490 #define PI_ESIC_K_MEM_ADD_LO_CMP_2 0xC90 1500 - #define PI_ESIC_K_IO_CMP_0_0 0xC91 1501 - #define PI_ESIC_K_IO_CMP_0_1 0xC92 1502 - #define PI_ESIC_K_IO_CMP_1_0 0xC93 1503 - #define PI_ESIC_K_IO_CMP_1_1 0xC94 1504 - #define PI_ESIC_K_IO_CMP_2_0 0xC95 1505 - #define PI_ESIC_K_IO_CMP_2_1 0xC96 1506 - #define PI_ESIC_K_IO_CMP_3_0 0xC97 1507 - #define PI_ESIC_K_IO_CMP_3_1 0xC98 1491 + #define PI_ESIC_K_IO_ADD_CMP_0_0 0xC91 1492 + #define PI_ESIC_K_IO_ADD_CMP_0_1 0xC92 1493 + #define PI_ESIC_K_IO_ADD_CMP_1_0 0xC93 1494 + #define PI_ESIC_K_IO_ADD_CMP_1_1 0xC94 1495 + #define PI_ESIC_K_IO_ADD_CMP_2_0 0xC95 1496 + #define PI_ESIC_K_IO_ADD_CMP_2_1 0xC96 1497 + #define PI_ESIC_K_IO_ADD_CMP_3_0 0xC97 1498 + #define PI_ESIC_K_IO_ADD_CMP_3_1 0xC98 1508 1499 #define PI_ESIC_K_IO_ADD_MASK_0_0 0xC99 1509 1500 #define PI_ESIC_K_IO_ADD_MASK_0_1 0xC9A 1510 1501 #define PI_ESIC_K_IO_ADD_MASK_1_0 0xC9B ··· 1527 1518 #define PI_ESIC_K_INPUT_PORT 0xCAC 1528 1519 #define PI_ESIC_K_OUTPUT_PORT 0xCAD 1529 1520 #define PI_ESIC_K_FUNCTION_CNTRL 0xCAE 1530 - #define PI_ESIC_K_CSR_IO_LEN PI_ESIC_K_FUNCTION_CNTRL+1 /* always last reg + 1 */ 1531 1521 1532 - /* Define the value all drivers must write to the function control register. */ 1522 + /* Define the bits in the function control register. */ 1533 1523 1534 - #define PI_ESIC_K_FUNCTION_CNTRL_IO_ENB 0x03 1524 + #define PI_FUNCTION_CNTRL_M_IOCS0 0x01 1525 + #define PI_FUNCTION_CNTRL_M_IOCS1 0x02 1526 + #define PI_FUNCTION_CNTRL_M_IOCS2 0x04 1527 + #define PI_FUNCTION_CNTRL_M_IOCS3 0x08 1528 + #define PI_FUNCTION_CNTRL_M_MEMCS0 0x10 1529 + #define PI_FUNCTION_CNTRL_M_MEMCS1 0x20 1530 + #define PI_FUNCTION_CNTRL_M_DMA 0x80 1535 1531 1536 1532 /* Define the bits in the slot control register. */ 1537 1533 ··· 1553 1539 #define PI_BURST_HOLDOFF_V_HOLDOFF 2 1554 1540 #define PI_BURST_HOLDOFF_V_RESERVED 1 1555 1541 #define PI_BURST_HOLDOFF_V_MEM_MAP 0 1542 + 1543 + /* Define the implicit mask of the Memory Address Mask Register. */ 1544 + 1545 + #define PI_MEM_ADD_MASK_M 0x3ff 1556 1546 1557 1547 /* 1558 1548 * Define the fields in the IO Compare registers. ··· 1595 1577 #define DEFEA_PROD_ID_1 0x0130A310 /* DEC product 300, rev 1 */ 1596 1578 #define DEFEA_PROD_ID_2 0x0230A310 /* DEC product 300, rev 2 */ 1597 1579 #define DEFEA_PROD_ID_3 0x0330A310 /* DEC product 300, rev 3 */ 1580 + #define DEFEA_PROD_ID_4 0x0430A310 /* DEC product 300, rev 4 */ 1598 1581 1599 1582 /**********************************************/ 1600 1583 /* Digital PFI Specification v1.0 Definitions */ ··· 1651 1632 #define PFI_STATUS_V_FIFO_FULL 2 1652 1633 #define PFI_STATUS_V_FIFO_EMPTY 1 1653 1634 #define PFI_STATUS_V_DMA_IN_PROGRESS 0 1654 - 1655 - #define DFX_MAX_EISA_SLOTS 16 /* maximum number of EISA slots to scan */ 1656 - #define DFX_MAX_NUM_BOARDS 8 /* maximum number of adapters supported */ 1657 - 1658 - #define DFX_BUS_TYPE_PCI 0 /* type code for DEC FDDIcontroller/PCI */ 1659 - #define DFX_BUS_TYPE_EISA 1 /* type code for DEC FDDIcontroller/EISA */ 1660 1635 1661 1636 #define DFX_FC_PRH2_PRH1_PRH0 0x54003820 /* Packet Request Header bytes + FC */ 1662 1637 #define DFX_PRH0_BYTE 0x20 /* Packet Request Header byte 0 */ ··· 1769 1756 /* Store device, bus-specific, and parameter information for this adapter */ 1770 1757 1771 1758 struct net_device *dev; /* pointer to device structure */ 1772 - struct net_device *next; 1773 - u32 bus_type; /* bus type (0 == PCI, 1 == EISA) */ 1774 - u16 base_addr; /* base I/O address (same as dev->base_addr) */ 1775 - struct pci_dev * pci_dev; 1759 + union { 1760 + void __iomem *mem; 1761 + int port; 1762 + } base; /* base address */ 1763 + struct device *bus_dev; 1776 1764 u32 full_duplex_enb; /* FDDI Full Duplex enable (1 == on, 2 == off) */ 1777 1765 u32 req_ttrt; /* requested TTRT value (in 80ns units) */ 1778 1766 u32 burst_size; /* adapter burst size (enumerated) */