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

Staging: slicoss: kill functions prototypes and reorder functions

Reorder functions to kill their prototypes.

Signed-off-by: Denis Kirjanov <dkirjanov@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

authored by

Denis Kirjanov and committed by
Greg Kroah-Hartman
4d6ea9c3 843894ad

+1930 -2000
+1930 -2000
drivers/staging/slicoss/slicoss.c
··· 97 97 #include "slichw.h" 98 98 #include "slic.h" 99 99 100 - static struct net_device_stats *slic_get_stats(struct net_device *dev); 101 - static int slic_entry_open(struct net_device *dev); 102 - static int slic_entry_halt(struct net_device *dev); 103 - static int slic_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); 104 - static netdev_tx_t slic_xmit_start(struct sk_buff *skb, struct net_device *dev); 105 - static void slic_xmit_fail(struct adapter *adapter, struct sk_buff *skb, 106 - void *cmd, u32 skbtype, u32 status); 107 - static void slic_config_pci(struct pci_dev *pcidev); 108 - static struct sk_buff *slic_rcvqueue_getnext(struct adapter *adapter); 109 - static int slic_mac_set_address(struct net_device *dev, void *ptr); 110 - static void slic_link_event_handler(struct adapter *adapter); 111 - static void slic_upr_request_complete(struct adapter *adapter, u32 isr); 112 - static int slic_rspqueue_init(struct adapter *adapter); 113 - static void slic_rspqueue_free(struct adapter *adapter); 114 - static struct slic_rspbuf *slic_rspqueue_getnext(struct adapter *adapter); 115 - static int slic_cmdq_init(struct adapter *adapter); 116 - static void slic_cmdq_free(struct adapter *adapter); 117 - static void slic_cmdq_reset(struct adapter *adapter); 118 - static void slic_cmdq_addcmdpage(struct adapter *adapter, u32 *page); 119 - static void slic_cmdq_getdone(struct adapter *adapter); 120 - static void slic_cmdq_putdone_irq(struct adapter *adapter, 121 - struct slic_hostcmd *cmd); 122 - static struct slic_hostcmd *slic_cmdq_getfree(struct adapter *adapter); 123 - static int slic_rcvqueue_init(struct adapter *adapter); 124 - static int slic_rcvqueue_fill(struct adapter *adapter); 125 - static u32 slic_rcvqueue_reinsert(struct adapter *adapter, struct sk_buff *skb); 126 - static void slic_rcvqueue_free(struct adapter *adapter); 127 - static void slic_adapter_set_hwaddr(struct adapter *adapter); 128 - static int slic_card_init(struct sliccard *card, struct adapter *adapter); 129 - static void slic_intagg_set(struct adapter *adapter, u32 value); 130 - static int slic_card_download(struct adapter *adapter); 131 - static u32 slic_card_locate(struct adapter *adapter); 132 - static int slic_if_init(struct adapter *adapter); 133 - static int slic_adapter_allocresources(struct adapter *adapter); 134 - static void slic_adapter_freeresources(struct adapter *adapter); 135 - static void slic_link_config(struct adapter *adapter, u32 linkspeed, 136 - u32 linkduplex); 137 - static void slic_unmap_mmio_space(struct adapter *adapter); 138 - static void slic_card_cleanup(struct sliccard *card); 139 - static void slic_soft_reset(struct adapter *adapter); 140 - static bool slic_mac_filter(struct adapter *adapter, 141 - struct ether_header *ether_frame); 142 - static void slic_mac_address_config(struct adapter *adapter); 143 - static void slic_mac_config(struct adapter *adapter); 144 - static void slic_mcast_set_mask(struct adapter *adapter); 145 - static void slic_config_set(struct adapter *adapter, bool linkchange); 146 - static void slic_config_clear(struct adapter *adapter); 147 - static void slic_config_get(struct adapter *adapter, u32 config, 148 - u32 configh); 149 - static void slic_timer_load_check(ulong context); 150 - static void slic_assert_fail(void); 151 - static ushort slic_eeprom_cksum(char *m, int len); 152 - static void slic_upr_start(struct adapter *adapter); 153 - static void slic_link_upr_complete(struct adapter *adapter, u32 Isr); 154 - static int slic_upr_request(struct adapter *adapter, u32 upr_request, 155 - u32 upr_data, u32 upr_data_h, u32 upr_buffer, 156 - u32 upr_buffer_h); 157 - static void slic_mcast_set_list(struct net_device *dev); 158 - 159 - 160 100 static uint slic_first_init = 1; 161 101 static char *slic_banner = "Alacritech SLIC Technology(tm) Server "\ 162 102 "and Storage Accelerator (Non-Accelerated)"; ··· 146 206 #undef ASSERT 147 207 #endif 148 208 209 + static void slic_assert_fail(void) 210 + { 211 + u32 cpuid; 212 + u32 curr_pid; 213 + cpuid = smp_processor_id(); 214 + curr_pid = current->pid; 215 + 216 + printk(KERN_ERR "%s CPU # %d ---- PID # %d\n", 217 + __func__, cpuid, curr_pid); 218 + } 219 + 149 220 #ifndef ASSERT 150 221 #define ASSERT(a) do { \ 151 222 if (!(a)) { \ ··· 192 241 _adapter->handle_lock.flags); \ 193 242 } 194 243 195 - static void slic_debug_init(void); 196 - static void slic_debug_cleanup(void); 197 - static void slic_debug_adapter_create(struct adapter *adapter); 198 - static void slic_debug_adapter_destroy(struct adapter *adapter); 199 - static void slic_debug_card_create(struct sliccard *card); 200 - static void slic_debug_card_destroy(struct sliccard *card); 201 - 202 244 static inline void slic_reg32_write(void __iomem *reg, u32 value, bool flush) 203 245 { 204 246 writel(value, reg); ··· 214 270 mb(); 215 271 spin_unlock_irqrestore(&adapter->bit64reglock.lock, 216 272 adapter->bit64reglock.flags); 217 - } 218 - 219 - static void slic_init_driver(void) 220 - { 221 - if (slic_first_init) { 222 - slic_first_init = 0; 223 - spin_lock_init(&slic_global.driver_lock.lock); 224 - slic_debug_init(); 225 - } 226 - } 227 - 228 - static void slic_init_adapter(struct net_device *netdev, 229 - struct pci_dev *pcidev, 230 - const struct pci_device_id *pci_tbl_entry, 231 - void __iomem *memaddr, int chip_idx) 232 - { 233 - ushort index; 234 - struct slic_handle *pslic_handle; 235 - struct adapter *adapter = netdev_priv(netdev); 236 - 237 - /* adapter->pcidev = pcidev;*/ 238 - adapter->vendid = pci_tbl_entry->vendor; 239 - adapter->devid = pci_tbl_entry->device; 240 - adapter->subsysid = pci_tbl_entry->subdevice; 241 - adapter->busnumber = pcidev->bus->number; 242 - adapter->slotnumber = ((pcidev->devfn >> 3) & 0x1F); 243 - adapter->functionnumber = (pcidev->devfn & 0x7); 244 - adapter->memorylength = pci_resource_len(pcidev, 0); 245 - adapter->slic_regs = (__iomem struct slic_regs *)memaddr; 246 - adapter->irq = pcidev->irq; 247 - /* adapter->netdev = netdev;*/ 248 - adapter->next_netdevice = head_netdevice; 249 - head_netdevice = netdev; 250 - adapter->chipid = chip_idx; 251 - adapter->port = 0; /*adapter->functionnumber;*/ 252 - adapter->cardindex = adapter->port; 253 - adapter->memorybase = memaddr; 254 - spin_lock_init(&adapter->upr_lock.lock); 255 - spin_lock_init(&adapter->bit64reglock.lock); 256 - spin_lock_init(&adapter->adapter_lock.lock); 257 - spin_lock_init(&adapter->reset_lock.lock); 258 - spin_lock_init(&adapter->handle_lock.lock); 259 - 260 - adapter->card_size = 1; 261 - /* 262 - Initialize slic_handle array 263 - */ 264 - ASSERT(SLIC_CMDQ_MAXCMDS <= 0xFFFF); 265 - /* 266 - Start with 1. 0 is an invalid host handle. 267 - */ 268 - for (index = 1, pslic_handle = &adapter->slic_handles[1]; 269 - index < SLIC_CMDQ_MAXCMDS; index++, pslic_handle++) { 270 - 271 - pslic_handle->token.handle_index = index; 272 - pslic_handle->type = SLIC_HANDLE_FREE; 273 - pslic_handle->next = adapter->pfree_slic_handles; 274 - adapter->pfree_slic_handles = pslic_handle; 275 - } 276 - adapter->pshmem = (struct slic_shmem *) 277 - pci_alloc_consistent(adapter->pcidev, 278 - sizeof(struct slic_shmem), 279 - &adapter-> 280 - phys_shmem); 281 - ASSERT(adapter->pshmem); 282 - 283 - memset(adapter->pshmem, 0, sizeof(struct slic_shmem)); 284 - 285 - return; 286 - } 287 - 288 - static const struct net_device_ops slic_netdev_ops = { 289 - .ndo_open = slic_entry_open, 290 - .ndo_stop = slic_entry_halt, 291 - .ndo_start_xmit = slic_xmit_start, 292 - .ndo_do_ioctl = slic_ioctl, 293 - .ndo_set_mac_address = slic_mac_set_address, 294 - .ndo_get_stats = slic_get_stats, 295 - .ndo_set_multicast_list = slic_mcast_set_list, 296 - .ndo_validate_addr = eth_validate_addr, 297 - .ndo_change_mtu = eth_change_mtu, 298 - }; 299 - 300 - static int __devinit slic_entry_probe(struct pci_dev *pcidev, 301 - const struct pci_device_id *pci_tbl_entry) 302 - { 303 - static int cards_found; 304 - static int did_version; 305 - int err = -ENODEV; 306 - struct net_device *netdev; 307 - struct adapter *adapter; 308 - void __iomem *memmapped_ioaddr = NULL; 309 - u32 status = 0; 310 - ulong mmio_start = 0; 311 - ulong mmio_len = 0; 312 - struct sliccard *card = NULL; 313 - int pci_using_dac = 0; 314 - 315 - slic_global.dynamic_intagg = dynamic_intagg; 316 - 317 - err = pci_enable_device(pcidev); 318 - 319 - if (err) 320 - return err; 321 - 322 - if (slic_debug > 0 && did_version++ == 0) { 323 - printk(KERN_DEBUG "%s\n", slic_banner); 324 - printk(KERN_DEBUG "%s\n", slic_proc_version); 325 - } 326 - 327 - if (!pci_set_dma_mask(pcidev, DMA_BIT_MASK(64))) { 328 - pci_using_dac = 1; 329 - if (pci_set_consistent_dma_mask(pcidev, DMA_BIT_MASK(64))) { 330 - dev_err(&pcidev->dev, "unable to obtain 64-bit DMA for " 331 - "consistent allocations\n"); 332 - goto err_out_disable_pci; 333 - } 334 - } else if (pci_set_dma_mask(pcidev, DMA_BIT_MASK(32))) { 335 - pci_using_dac = 0; 336 - pci_set_consistent_dma_mask(pcidev, DMA_BIT_MASK(32)); 337 - } else { 338 - dev_err(&pcidev->dev, "no usable DMA configuration\n"); 339 - goto err_out_disable_pci; 340 - } 341 - 342 - err = pci_request_regions(pcidev, DRV_NAME); 343 - if (err) { 344 - dev_err(&pcidev->dev, "can't obtain PCI resources\n"); 345 - goto err_out_disable_pci; 346 - } 347 - 348 - pci_set_master(pcidev); 349 - 350 - netdev = alloc_etherdev(sizeof(struct adapter)); 351 - if (!netdev) { 352 - err = -ENOMEM; 353 - goto err_out_exit_slic_probe; 354 - } 355 - 356 - SET_NETDEV_DEV(netdev, &pcidev->dev); 357 - 358 - pci_set_drvdata(pcidev, netdev); 359 - adapter = netdev_priv(netdev); 360 - adapter->netdev = netdev; 361 - adapter->pcidev = pcidev; 362 - if (pci_using_dac) 363 - netdev->features |= NETIF_F_HIGHDMA; 364 - 365 - mmio_start = pci_resource_start(pcidev, 0); 366 - mmio_len = pci_resource_len(pcidev, 0); 367 - 368 - 369 - /* memmapped_ioaddr = (u32)ioremap_nocache(mmio_start, mmio_len);*/ 370 - memmapped_ioaddr = ioremap(mmio_start, mmio_len); 371 - if (!memmapped_ioaddr) { 372 - dev_err(&pcidev->dev, "cannot remap MMIO region %lx @ %lx\n", 373 - mmio_len, mmio_start); 374 - goto err_out_free_netdev; 375 - } 376 - 377 - slic_config_pci(pcidev); 378 - 379 - slic_init_driver(); 380 - 381 - slic_init_adapter(netdev, 382 - pcidev, pci_tbl_entry, memmapped_ioaddr, cards_found); 383 - 384 - status = slic_card_locate(adapter); 385 - if (status) { 386 - dev_err(&pcidev->dev, "cannot locate card\n"); 387 - goto err_out_free_mmio_region; 388 - } 389 - 390 - card = adapter->card; 391 - 392 - if (!adapter->allocated) { 393 - card->adapters_allocated++; 394 - adapter->allocated = 1; 395 - } 396 - 397 - status = slic_card_init(card, adapter); 398 - 399 - if (status != 0) { 400 - card->state = CARD_FAIL; 401 - adapter->state = ADAPT_FAIL; 402 - adapter->linkstate = LINK_DOWN; 403 - dev_err(&pcidev->dev, "FAILED status[%x]\n", status); 404 - } else { 405 - slic_adapter_set_hwaddr(adapter); 406 - } 407 - 408 - netdev->base_addr = (unsigned long)adapter->memorybase; 409 - netdev->irq = adapter->irq; 410 - netdev->netdev_ops = &slic_netdev_ops; 411 - 412 - slic_debug_adapter_create(adapter); 413 - 414 - strcpy(netdev->name, "eth%d"); 415 - err = register_netdev(netdev); 416 - if (err) { 417 - dev_err(&pcidev->dev, "Cannot register net device, aborting.\n"); 418 - goto err_out_unmap; 419 - } 420 - 421 - cards_found++; 422 - 423 - return status; 424 - 425 - err_out_unmap: 426 - iounmap(memmapped_ioaddr); 427 - err_out_free_mmio_region: 428 - release_mem_region(mmio_start, mmio_len); 429 - err_out_free_netdev: 430 - free_netdev(netdev); 431 - err_out_exit_slic_probe: 432 - pci_release_regions(pcidev); 433 - err_out_disable_pci: 434 - pci_disable_device(pcidev); 435 - return err; 436 - } 437 - 438 - static int slic_entry_open(struct net_device *dev) 439 - { 440 - struct adapter *adapter = netdev_priv(dev); 441 - struct sliccard *card = adapter->card; 442 - u32 locked = 0; 443 - int status; 444 - 445 - ASSERT(adapter); 446 - ASSERT(card); 447 - 448 - netif_stop_queue(adapter->netdev); 449 - 450 - spin_lock_irqsave(&slic_global.driver_lock.lock, 451 - slic_global.driver_lock.flags); 452 - locked = 1; 453 - if (!adapter->activated) { 454 - card->adapters_activated++; 455 - slic_global.num_slic_ports_active++; 456 - adapter->activated = 1; 457 - } 458 - status = slic_if_init(adapter); 459 - 460 - if (status != 0) { 461 - if (adapter->activated) { 462 - card->adapters_activated--; 463 - slic_global.num_slic_ports_active--; 464 - adapter->activated = 0; 465 - } 466 - if (locked) { 467 - spin_unlock_irqrestore(&slic_global.driver_lock.lock, 468 - slic_global.driver_lock.flags); 469 - locked = 0; 470 - } 471 - return status; 472 - } 473 - if (!card->master) 474 - card->master = adapter; 475 - 476 - if (locked) { 477 - spin_unlock_irqrestore(&slic_global.driver_lock.lock, 478 - slic_global.driver_lock.flags); 479 - locked = 0; 480 - } 481 - 482 - return 0; 483 - } 484 - 485 - static void __devexit slic_entry_remove(struct pci_dev *pcidev) 486 - { 487 - struct net_device *dev = pci_get_drvdata(pcidev); 488 - u32 mmio_start = 0; 489 - uint mmio_len = 0; 490 - struct adapter *adapter = netdev_priv(dev); 491 - struct sliccard *card; 492 - struct mcast_address *mcaddr, *mlist; 493 - 494 - ASSERT(adapter); 495 - slic_adapter_freeresources(adapter); 496 - slic_unmap_mmio_space(adapter); 497 - unregister_netdev(dev); 498 - 499 - mmio_start = pci_resource_start(pcidev, 0); 500 - mmio_len = pci_resource_len(pcidev, 0); 501 - 502 - release_mem_region(mmio_start, mmio_len); 503 - 504 - iounmap((void __iomem *)dev->base_addr); 505 - /* free multicast addresses */ 506 - mlist = adapter->mcastaddrs; 507 - while (mlist) { 508 - mcaddr = mlist; 509 - mlist = mlist->next; 510 - kfree(mcaddr); 511 - } 512 - ASSERT(adapter->card); 513 - card = adapter->card; 514 - ASSERT(card->adapters_allocated); 515 - card->adapters_allocated--; 516 - adapter->allocated = 0; 517 - if (!card->adapters_allocated) { 518 - struct sliccard *curr_card = slic_global.slic_card; 519 - if (curr_card == card) { 520 - slic_global.slic_card = card->next; 521 - } else { 522 - while (curr_card->next != card) 523 - curr_card = curr_card->next; 524 - ASSERT(curr_card); 525 - curr_card->next = card->next; 526 - } 527 - ASSERT(slic_global.num_slic_cards); 528 - slic_global.num_slic_cards--; 529 - slic_card_cleanup(card); 530 - } 531 - kfree(dev); 532 - pci_release_regions(pcidev); 533 - } 534 - 535 - static int slic_entry_halt(struct net_device *dev) 536 - { 537 - struct adapter *adapter = netdev_priv(dev); 538 - struct sliccard *card = adapter->card; 539 - __iomem struct slic_regs *slic_regs = adapter->slic_regs; 540 - 541 - spin_lock_irqsave(&slic_global.driver_lock.lock, 542 - slic_global.driver_lock.flags); 543 - ASSERT(card); 544 - netif_stop_queue(adapter->netdev); 545 - adapter->state = ADAPT_DOWN; 546 - adapter->linkstate = LINK_DOWN; 547 - adapter->upr_list = NULL; 548 - adapter->upr_busy = 0; 549 - adapter->devflags_prev = 0; 550 - ASSERT(card->adapter[adapter->cardindex] == adapter); 551 - slic_reg32_write(&slic_regs->slic_icr, ICR_INT_OFF, FLUSH); 552 - adapter->all_reg_writes++; 553 - adapter->icr_reg_writes++; 554 - slic_config_clear(adapter); 555 - if (adapter->activated) { 556 - card->adapters_activated--; 557 - slic_global.num_slic_ports_active--; 558 - adapter->activated = 0; 559 - } 560 - #ifdef AUTOMATIC_RESET 561 - slic_reg32_write(&slic_regs->slic_reset_iface, 0, FLUSH); 562 - #endif 563 - /* 564 - * Reset the adapter's cmd queues 565 - */ 566 - slic_cmdq_reset(adapter); 567 - 568 - #ifdef AUTOMATIC_RESET 569 - if (!card->adapters_activated) 570 - slic_card_init(card, adapter); 571 - #endif 572 - 573 - spin_unlock_irqrestore(&slic_global.driver_lock.lock, 574 - slic_global.driver_lock.flags); 575 - return 0; 576 - } 577 - 578 - static int slic_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) 579 - { 580 - struct adapter *adapter = netdev_priv(dev); 581 - struct ethtool_cmd edata; 582 - struct ethtool_cmd ecmd; 583 - u32 data[7]; 584 - u32 intagg; 585 - 586 - ASSERT(rq); 587 - switch (cmd) { 588 - case SIOCSLICSETINTAGG: 589 - if (copy_from_user(data, rq->ifr_data, 28)) 590 - return -EFAULT; 591 - intagg = data[0]; 592 - dev_err(&dev->dev, "%s: set interrupt aggregation to %d\n", 593 - __func__, intagg); 594 - slic_intagg_set(adapter, intagg); 595 - return 0; 596 - 597 - #ifdef SLIC_TRACE_DUMP_ENABLED 598 - case SIOCSLICTRACEDUMP: 599 - { 600 - u32 value; 601 - DBG_IOCTL("slic_ioctl SIOCSLIC_TRACE_DUMP\n"); 602 - 603 - if (copy_from_user(data, rq->ifr_data, 28)) { 604 - PRINT_ERROR 605 - ("slic: copy_from_user FAILED getting initial simba param\n"); 606 - return -EFAULT; 607 - } 608 - 609 - value = data[0]; 610 - if (tracemon_request == SLIC_DUMP_DONE) { 611 - PRINT_ERROR 612 - ("ATK Diagnostic Trace Dump Requested\n"); 613 - tracemon_request = SLIC_DUMP_REQUESTED; 614 - tracemon_request_type = value; 615 - tracemon_timestamp = jiffies; 616 - } else if ((tracemon_request == SLIC_DUMP_REQUESTED) || 617 - (tracemon_request == 618 - SLIC_DUMP_IN_PROGRESS)) { 619 - PRINT_ERROR 620 - ("ATK Diagnostic Trace Dump Requested but already in progress... ignore\n"); 621 - } else { 622 - PRINT_ERROR 623 - ("ATK Diagnostic Trace Dump Requested\n"); 624 - tracemon_request = SLIC_DUMP_REQUESTED; 625 - tracemon_request_type = value; 626 - tracemon_timestamp = jiffies; 627 - } 628 - return 0; 629 - } 630 - #endif 631 - case SIOCETHTOOL: 632 - ASSERT(adapter); 633 - if (copy_from_user(&ecmd, rq->ifr_data, sizeof(ecmd))) 634 - return -EFAULT; 635 - 636 - if (ecmd.cmd == ETHTOOL_GSET) { 637 - edata.supported = (SUPPORTED_10baseT_Half | 638 - SUPPORTED_10baseT_Full | 639 - SUPPORTED_100baseT_Half | 640 - SUPPORTED_100baseT_Full | 641 - SUPPORTED_Autoneg | SUPPORTED_MII); 642 - edata.port = PORT_MII; 643 - edata.transceiver = XCVR_INTERNAL; 644 - edata.phy_address = 0; 645 - if (adapter->linkspeed == LINK_100MB) 646 - edata.speed = SPEED_100; 647 - else if (adapter->linkspeed == LINK_10MB) 648 - edata.speed = SPEED_10; 649 - else 650 - edata.speed = 0; 651 - 652 - if (adapter->linkduplex == LINK_FULLD) 653 - edata.duplex = DUPLEX_FULL; 654 - else 655 - edata.duplex = DUPLEX_HALF; 656 - 657 - edata.autoneg = AUTONEG_ENABLE; 658 - edata.maxtxpkt = 1; 659 - edata.maxrxpkt = 1; 660 - if (copy_to_user(rq->ifr_data, &edata, sizeof(edata))) 661 - return -EFAULT; 662 - 663 - } else if (ecmd.cmd == ETHTOOL_SSET) { 664 - if (!capable(CAP_NET_ADMIN)) 665 - return -EPERM; 666 - 667 - if (adapter->linkspeed == LINK_100MB) 668 - edata.speed = SPEED_100; 669 - else if (adapter->linkspeed == LINK_10MB) 670 - edata.speed = SPEED_10; 671 - else 672 - edata.speed = 0; 673 - 674 - if (adapter->linkduplex == LINK_FULLD) 675 - edata.duplex = DUPLEX_FULL; 676 - else 677 - edata.duplex = DUPLEX_HALF; 678 - 679 - edata.autoneg = AUTONEG_ENABLE; 680 - edata.maxtxpkt = 1; 681 - edata.maxrxpkt = 1; 682 - if ((ecmd.speed != edata.speed) || 683 - (ecmd.duplex != edata.duplex)) { 684 - u32 speed; 685 - u32 duplex; 686 - 687 - if (ecmd.speed == SPEED_10) 688 - speed = 0; 689 - else 690 - speed = PCR_SPEED_100; 691 - if (ecmd.duplex == DUPLEX_FULL) 692 - duplex = PCR_DUPLEX_FULL; 693 - else 694 - duplex = 0; 695 - slic_link_config(adapter, speed, duplex); 696 - slic_link_event_handler(adapter); 697 - } 698 - } 699 - return 0; 700 - default: 701 - return -EOPNOTSUPP; 702 - } 703 - } 704 - 705 - #define XMIT_FAIL_LINK_STATE 1 706 - #define XMIT_FAIL_ZERO_LENGTH 2 707 - #define XMIT_FAIL_HOSTCMD_FAIL 3 708 - 709 - static void slic_xmit_build_request(struct adapter *adapter, 710 - struct slic_hostcmd *hcmd, struct sk_buff *skb) 711 - { 712 - struct slic_host64_cmd *ihcmd; 713 - ulong phys_addr; 714 - 715 - ihcmd = &hcmd->cmd64; 716 - 717 - ihcmd->flags = (adapter->port << IHFLG_IFSHFT); 718 - ihcmd->command = IHCMD_XMT_REQ; 719 - ihcmd->u.slic_buffers.totlen = skb->len; 720 - phys_addr = pci_map_single(adapter->pcidev, skb->data, skb->len, 721 - PCI_DMA_TODEVICE); 722 - ihcmd->u.slic_buffers.bufs[0].paddrl = SLIC_GET_ADDR_LOW(phys_addr); 723 - ihcmd->u.slic_buffers.bufs[0].paddrh = SLIC_GET_ADDR_HIGH(phys_addr); 724 - ihcmd->u.slic_buffers.bufs[0].length = skb->len; 725 - #if defined(CONFIG_X86_64) 726 - hcmd->cmdsize = (u32) ((((u64)&ihcmd->u.slic_buffers.bufs[1] - 727 - (u64) hcmd) + 31) >> 5); 728 - #elif defined(CONFIG_X86) 729 - hcmd->cmdsize = ((((u32) &ihcmd->u.slic_buffers.bufs[1] - 730 - (u32) hcmd) + 31) >> 5); 731 - #else 732 - Stop Compilation; 733 - #endif 734 - } 735 - 736 - #define NORMAL_ETHFRAME 0 737 - 738 - static netdev_tx_t slic_xmit_start(struct sk_buff *skb, struct net_device *dev) 739 - { 740 - struct sliccard *card; 741 - struct adapter *adapter = netdev_priv(dev); 742 - struct slic_hostcmd *hcmd = NULL; 743 - u32 status = 0; 744 - u32 skbtype = NORMAL_ETHFRAME; 745 - void *offloadcmd = NULL; 746 - 747 - card = adapter->card; 748 - ASSERT(card); 749 - if ((adapter->linkstate != LINK_UP) || 750 - (adapter->state != ADAPT_UP) || (card->state != CARD_UP)) { 751 - status = XMIT_FAIL_LINK_STATE; 752 - goto xmit_fail; 753 - 754 - } else if (skb->len == 0) { 755 - status = XMIT_FAIL_ZERO_LENGTH; 756 - goto xmit_fail; 757 - } 758 - 759 - if (skbtype == NORMAL_ETHFRAME) { 760 - hcmd = slic_cmdq_getfree(adapter); 761 - if (!hcmd) { 762 - adapter->xmitq_full = 1; 763 - status = XMIT_FAIL_HOSTCMD_FAIL; 764 - goto xmit_fail; 765 - } 766 - ASSERT(hcmd->pslic_handle); 767 - ASSERT(hcmd->cmd64.hosthandle == 768 - hcmd->pslic_handle->token.handle_token); 769 - hcmd->skb = skb; 770 - hcmd->busy = 1; 771 - hcmd->type = SLIC_CMD_DUMB; 772 - if (skbtype == NORMAL_ETHFRAME) 773 - slic_xmit_build_request(adapter, hcmd, skb); 774 - } 775 - adapter->stats.tx_packets++; 776 - adapter->stats.tx_bytes += skb->len; 777 - 778 - #ifdef DEBUG_DUMP 779 - if (adapter->kill_card) { 780 - struct slic_host64_cmd ihcmd; 781 - 782 - ihcmd = &hcmd->cmd64; 783 - 784 - ihcmd->flags |= 0x40; 785 - adapter->kill_card = 0; /* only do this once */ 786 - } 787 - #endif 788 - if (hcmd->paddrh == 0) { 789 - slic_reg32_write(&adapter->slic_regs->slic_cbar, 790 - (hcmd->paddrl | hcmd->cmdsize), DONT_FLUSH); 791 - } else { 792 - slic_reg64_write(adapter, &adapter->slic_regs->slic_cbar64, 793 - (hcmd->paddrl | hcmd->cmdsize), 794 - &adapter->slic_regs->slic_addr_upper, 795 - hcmd->paddrh, DONT_FLUSH); 796 - } 797 - xmit_done: 798 - return NETDEV_TX_OK; 799 - xmit_fail: 800 - slic_xmit_fail(adapter, skb, offloadcmd, skbtype, status); 801 - goto xmit_done; 802 - } 803 - 804 - static void slic_xmit_fail(struct adapter *adapter, 805 - struct sk_buff *skb, 806 - void *cmd, u32 skbtype, u32 status) 807 - { 808 - if (adapter->xmitq_full) 809 - netif_stop_queue(adapter->netdev); 810 - if ((cmd == NULL) && (status <= XMIT_FAIL_HOSTCMD_FAIL)) { 811 - switch (status) { 812 - case XMIT_FAIL_LINK_STATE: 813 - dev_err(&adapter->netdev->dev, 814 - "reject xmit skb[%p: %x] linkstate[%s] " 815 - "adapter[%s:%d] card[%s:%d]\n", 816 - skb, skb->pkt_type, 817 - SLIC_LINKSTATE(adapter->linkstate), 818 - SLIC_ADAPTER_STATE(adapter->state), 819 - adapter->state, 820 - SLIC_CARD_STATE(adapter->card->state), 821 - adapter->card->state); 822 - break; 823 - case XMIT_FAIL_ZERO_LENGTH: 824 - dev_err(&adapter->netdev->dev, 825 - "xmit_start skb->len == 0 skb[%p] type[%x]\n", 826 - skb, skb->pkt_type); 827 - break; 828 - case XMIT_FAIL_HOSTCMD_FAIL: 829 - dev_err(&adapter->netdev->dev, 830 - "xmit_start skb[%p] type[%x] No host commands " 831 - "available\n", skb, skb->pkt_type); 832 - break; 833 - default: 834 - ASSERT(0); 835 - } 836 - } 837 - dev_kfree_skb(skb); 838 - adapter->stats.tx_dropped++; 839 - } 840 - 841 - static void slic_rcv_handle_error(struct adapter *adapter, 842 - struct slic_rcvbuf *rcvbuf) 843 - { 844 - struct slic_hddr_wds *hdr = (struct slic_hddr_wds *)rcvbuf->data; 845 - 846 - if (adapter->devid != SLIC_1GB_DEVICE_ID) { 847 - if (hdr->frame_status14 & VRHSTAT_802OE) 848 - adapter->if_events.oflow802++; 849 - if (hdr->frame_status14 & VRHSTAT_TPOFLO) 850 - adapter->if_events.Tprtoflow++; 851 - if (hdr->frame_status_b14 & VRHSTATB_802UE) 852 - adapter->if_events.uflow802++; 853 - if (hdr->frame_status_b14 & VRHSTATB_RCVE) { 854 - adapter->if_events.rcvearly++; 855 - adapter->stats.rx_fifo_errors++; 856 - } 857 - if (hdr->frame_status_b14 & VRHSTATB_BUFF) { 858 - adapter->if_events.Bufov++; 859 - adapter->stats.rx_over_errors++; 860 - } 861 - if (hdr->frame_status_b14 & VRHSTATB_CARRE) { 862 - adapter->if_events.Carre++; 863 - adapter->stats.tx_carrier_errors++; 864 - } 865 - if (hdr->frame_status_b14 & VRHSTATB_LONGE) 866 - adapter->if_events.Longe++; 867 - if (hdr->frame_status_b14 & VRHSTATB_PREA) 868 - adapter->if_events.Invp++; 869 - if (hdr->frame_status_b14 & VRHSTATB_CRC) { 870 - adapter->if_events.Crc++; 871 - adapter->stats.rx_crc_errors++; 872 - } 873 - if (hdr->frame_status_b14 & VRHSTATB_DRBL) 874 - adapter->if_events.Drbl++; 875 - if (hdr->frame_status_b14 & VRHSTATB_CODE) 876 - adapter->if_events.Code++; 877 - if (hdr->frame_status_b14 & VRHSTATB_TPCSUM) 878 - adapter->if_events.TpCsum++; 879 - if (hdr->frame_status_b14 & VRHSTATB_TPHLEN) 880 - adapter->if_events.TpHlen++; 881 - if (hdr->frame_status_b14 & VRHSTATB_IPCSUM) 882 - adapter->if_events.IpCsum++; 883 - if (hdr->frame_status_b14 & VRHSTATB_IPLERR) 884 - adapter->if_events.IpLen++; 885 - if (hdr->frame_status_b14 & VRHSTATB_IPHERR) 886 - adapter->if_events.IpHlen++; 887 - } else { 888 - if (hdr->frame_statusGB & VGBSTAT_XPERR) { 889 - u32 xerr = hdr->frame_statusGB >> VGBSTAT_XERRSHFT; 890 - 891 - if (xerr == VGBSTAT_XCSERR) 892 - adapter->if_events.TpCsum++; 893 - if (xerr == VGBSTAT_XUFLOW) 894 - adapter->if_events.Tprtoflow++; 895 - if (xerr == VGBSTAT_XHLEN) 896 - adapter->if_events.TpHlen++; 897 - } 898 - if (hdr->frame_statusGB & VGBSTAT_NETERR) { 899 - u32 nerr = 900 - (hdr-> 901 - frame_statusGB >> VGBSTAT_NERRSHFT) & 902 - VGBSTAT_NERRMSK; 903 - if (nerr == VGBSTAT_NCSERR) 904 - adapter->if_events.IpCsum++; 905 - if (nerr == VGBSTAT_NUFLOW) 906 - adapter->if_events.IpLen++; 907 - if (nerr == VGBSTAT_NHLEN) 908 - adapter->if_events.IpHlen++; 909 - } 910 - if (hdr->frame_statusGB & VGBSTAT_LNKERR) { 911 - u32 lerr = hdr->frame_statusGB & VGBSTAT_LERRMSK; 912 - 913 - if (lerr == VGBSTAT_LDEARLY) 914 - adapter->if_events.rcvearly++; 915 - if (lerr == VGBSTAT_LBOFLO) 916 - adapter->if_events.Bufov++; 917 - if (lerr == VGBSTAT_LCODERR) 918 - adapter->if_events.Code++; 919 - if (lerr == VGBSTAT_LDBLNBL) 920 - adapter->if_events.Drbl++; 921 - if (lerr == VGBSTAT_LCRCERR) 922 - adapter->if_events.Crc++; 923 - if (lerr == VGBSTAT_LOFLO) 924 - adapter->if_events.oflow802++; 925 - if (lerr == VGBSTAT_LUFLO) 926 - adapter->if_events.uflow802++; 927 - } 928 - } 929 - return; 930 - } 931 - 932 - #define TCP_OFFLOAD_FRAME_PUSHFLAG 0x10000000 933 - #define M_FAST_PATH 0x0040 934 - 935 - static void slic_rcv_handler(struct adapter *adapter) 936 - { 937 - struct sk_buff *skb; 938 - struct slic_rcvbuf *rcvbuf; 939 - u32 frames = 0; 940 - 941 - while ((skb = slic_rcvqueue_getnext(adapter))) { 942 - u32 rx_bytes; 943 - 944 - ASSERT(skb->head); 945 - rcvbuf = (struct slic_rcvbuf *)skb->head; 946 - adapter->card->events++; 947 - if (rcvbuf->status & IRHDDR_ERR) { 948 - adapter->rx_errors++; 949 - slic_rcv_handle_error(adapter, rcvbuf); 950 - slic_rcvqueue_reinsert(adapter, skb); 951 - continue; 952 - } 953 - 954 - if (!slic_mac_filter(adapter, (struct ether_header *) 955 - rcvbuf->data)) { 956 - slic_rcvqueue_reinsert(adapter, skb); 957 - continue; 958 - } 959 - skb_pull(skb, SLIC_RCVBUF_HEADSIZE); 960 - rx_bytes = (rcvbuf->length & IRHDDR_FLEN_MSK); 961 - skb_put(skb, rx_bytes); 962 - adapter->stats.rx_packets++; 963 - adapter->stats.rx_bytes += rx_bytes; 964 - #if SLIC_OFFLOAD_IP_CHECKSUM 965 - skb->ip_summed = CHECKSUM_UNNECESSARY; 966 - #endif 967 - 968 - skb->dev = adapter->netdev; 969 - skb->protocol = eth_type_trans(skb, skb->dev); 970 - netif_rx(skb); 971 - 972 - ++frames; 973 - #if SLIC_INTERRUPT_PROCESS_LIMIT 974 - if (frames >= SLIC_RCVQ_MAX_PROCESS_ISR) { 975 - adapter->rcv_interrupt_yields++; 976 - break; 977 - } 978 - #endif 979 - } 980 - adapter->max_isr_rcvs = max(adapter->max_isr_rcvs, frames); 981 - } 982 - 983 - static void slic_xmit_complete(struct adapter *adapter) 984 - { 985 - struct slic_hostcmd *hcmd; 986 - struct slic_rspbuf *rspbuf; 987 - u32 frames = 0; 988 - struct slic_handle_word slic_handle_word; 989 - 990 - do { 991 - rspbuf = slic_rspqueue_getnext(adapter); 992 - if (!rspbuf) 993 - break; 994 - adapter->xmit_completes++; 995 - adapter->card->events++; 996 - /* 997 - Get the complete host command buffer 998 - */ 999 - slic_handle_word.handle_token = rspbuf->hosthandle; 1000 - ASSERT(slic_handle_word.handle_index); 1001 - ASSERT(slic_handle_word.handle_index <= SLIC_CMDQ_MAXCMDS); 1002 - hcmd = 1003 - (struct slic_hostcmd *) 1004 - adapter->slic_handles[slic_handle_word.handle_index]. 1005 - address; 1006 - /* hcmd = (struct slic_hostcmd *) rspbuf->hosthandle; */ 1007 - ASSERT(hcmd); 1008 - ASSERT(hcmd->pslic_handle == 1009 - &adapter->slic_handles[slic_handle_word.handle_index]); 1010 - if (hcmd->type == SLIC_CMD_DUMB) { 1011 - if (hcmd->skb) 1012 - dev_kfree_skb_irq(hcmd->skb); 1013 - slic_cmdq_putdone_irq(adapter, hcmd); 1014 - } 1015 - rspbuf->status = 0; 1016 - rspbuf->hosthandle = 0; 1017 - frames++; 1018 - } while (1); 1019 - adapter->max_isr_xmits = max(adapter->max_isr_xmits, frames); 1020 - } 1021 - 1022 - static irqreturn_t slic_interrupt(int irq, void *dev_id) 1023 - { 1024 - struct net_device *dev = (struct net_device *)dev_id; 1025 - struct adapter *adapter = netdev_priv(dev); 1026 - u32 isr; 1027 - 1028 - if ((adapter->pshmem) && (adapter->pshmem->isr)) { 1029 - slic_reg32_write(&adapter->slic_regs->slic_icr, 1030 - ICR_INT_MASK, FLUSH); 1031 - isr = adapter->isrcopy = adapter->pshmem->isr; 1032 - adapter->pshmem->isr = 0; 1033 - adapter->num_isrs++; 1034 - switch (adapter->card->state) { 1035 - case CARD_UP: 1036 - if (isr & ~ISR_IO) { 1037 - if (isr & ISR_ERR) { 1038 - adapter->error_interrupts++; 1039 - if (isr & ISR_RMISS) { 1040 - int count; 1041 - int pre_count; 1042 - int errors; 1043 - 1044 - struct slic_rcvqueue *rcvq = 1045 - &adapter->rcvqueue; 1046 - 1047 - adapter-> 1048 - error_rmiss_interrupts++; 1049 - if (!rcvq->errors) 1050 - rcv_count = rcvq->count; 1051 - pre_count = rcvq->count; 1052 - errors = rcvq->errors; 1053 - 1054 - while (rcvq->count < 1055 - SLIC_RCVQ_FILLTHRESH) { 1056 - count = 1057 - slic_rcvqueue_fill 1058 - (adapter); 1059 - if (!count) 1060 - break; 1061 - } 1062 - } else if (isr & ISR_XDROP) { 1063 - dev_err(&dev->dev, 1064 - "isr & ISR_ERR [%x] " 1065 - "ISR_XDROP \n", isr); 1066 - } else { 1067 - dev_err(&dev->dev, 1068 - "isr & ISR_ERR [%x]\n", 1069 - isr); 1070 - } 1071 - } 1072 - 1073 - if (isr & ISR_LEVENT) { 1074 - adapter->linkevent_interrupts++; 1075 - slic_link_event_handler(adapter); 1076 - } 1077 - 1078 - if ((isr & ISR_UPC) || 1079 - (isr & ISR_UPCERR) || (isr & ISR_UPCBSY)) { 1080 - adapter->upr_interrupts++; 1081 - slic_upr_request_complete(adapter, isr); 1082 - } 1083 - } 1084 - 1085 - if (isr & ISR_RCV) { 1086 - adapter->rcv_interrupts++; 1087 - slic_rcv_handler(adapter); 1088 - } 1089 - 1090 - if (isr & ISR_CMD) { 1091 - adapter->xmit_interrupts++; 1092 - slic_xmit_complete(adapter); 1093 - } 1094 - break; 1095 - 1096 - case CARD_DOWN: 1097 - if ((isr & ISR_UPC) || 1098 - (isr & ISR_UPCERR) || (isr & ISR_UPCBSY)) { 1099 - adapter->upr_interrupts++; 1100 - slic_upr_request_complete(adapter, isr); 1101 - } 1102 - break; 1103 - 1104 - default: 1105 - break; 1106 - } 1107 - 1108 - adapter->isrcopy = 0; 1109 - adapter->all_reg_writes += 2; 1110 - adapter->isr_reg_writes++; 1111 - slic_reg32_write(&adapter->slic_regs->slic_isr, 0, FLUSH); 1112 - } else { 1113 - adapter->false_interrupts++; 1114 - } 1115 - return IRQ_HANDLED; 1116 - } 1117 - 1118 - /* 1119 - * slic_link_event_handler - 1120 - * 1121 - * Initiate a link configuration sequence. The link configuration begins 1122 - * by issuing a READ_LINK_STATUS command to the Utility Processor on the 1123 - * SLIC. Since the command finishes asynchronously, the slic_upr_comlete 1124 - * routine will follow it up witha UP configuration write command, which 1125 - * will also complete asynchronously. 1126 - * 1127 - */ 1128 - static void slic_link_event_handler(struct adapter *adapter) 1129 - { 1130 - int status; 1131 - struct slic_shmem *pshmem; 1132 - 1133 - if (adapter->state != ADAPT_UP) { 1134 - /* Adapter is not operational. Ignore. */ 1135 - return; 1136 - } 1137 - 1138 - pshmem = (struct slic_shmem *)adapter->phys_shmem; 1139 - 1140 - #if defined(CONFIG_X86_64) 1141 - status = slic_upr_request(adapter, 1142 - SLIC_UPR_RLSR, 1143 - SLIC_GET_ADDR_LOW(&pshmem->linkstatus), 1144 - SLIC_GET_ADDR_HIGH(&pshmem->linkstatus), 1145 - 0, 0); 1146 - #elif defined(CONFIG_X86) 1147 - status = slic_upr_request(adapter, SLIC_UPR_RLSR, 1148 - (u32) &pshmem->linkstatus, /* no 4GB wrap guaranteed */ 1149 - 0, 0, 0); 1150 - #else 1151 - Stop compilation; 1152 - #endif 1153 - ASSERT(status == 0); 1154 - } 1155 - 1156 - static void slic_init_cleanup(struct adapter *adapter) 1157 - { 1158 - if (adapter->intrregistered) { 1159 - adapter->intrregistered = 0; 1160 - free_irq(adapter->netdev->irq, adapter->netdev); 1161 - 1162 - } 1163 - if (adapter->pshmem) { 1164 - pci_free_consistent(adapter->pcidev, 1165 - sizeof(struct slic_shmem), 1166 - adapter->pshmem, adapter->phys_shmem); 1167 - adapter->pshmem = NULL; 1168 - adapter->phys_shmem = (dma_addr_t) NULL; 1169 - } 1170 - 1171 - if (adapter->pingtimerset) { 1172 - adapter->pingtimerset = 0; 1173 - del_timer(&adapter->pingtimer); 1174 - } 1175 - 1176 - slic_rspqueue_free(adapter); 1177 - slic_cmdq_free(adapter); 1178 - slic_rcvqueue_free(adapter); 1179 - } 1180 - 1181 - static struct net_device_stats *slic_get_stats(struct net_device *dev) 1182 - { 1183 - struct adapter *adapter = netdev_priv(dev); 1184 - 1185 - ASSERT(adapter); 1186 - dev->stats.collisions = adapter->slic_stats.iface.xmit_collisions; 1187 - dev->stats.rx_errors = adapter->slic_stats.iface.rcv_errors; 1188 - dev->stats.tx_errors = adapter->slic_stats.iface.xmt_errors; 1189 - dev->stats.rx_missed_errors = adapter->slic_stats.iface.rcv_discards; 1190 - dev->stats.tx_heartbeat_errors = 0; 1191 - dev->stats.tx_aborted_errors = 0; 1192 - dev->stats.tx_window_errors = 0; 1193 - dev->stats.tx_fifo_errors = 0; 1194 - dev->stats.rx_frame_errors = 0; 1195 - dev->stats.rx_length_errors = 0; 1196 - 1197 - return &dev->stats; 1198 - } 1199 - 1200 - /* 1201 - * Allocate a mcast_address structure to hold the multicast address. 1202 - * Link it in. 1203 - */ 1204 - static int slic_mcast_add_list(struct adapter *adapter, char *address) 1205 - { 1206 - struct mcast_address *mcaddr, *mlist; 1207 - 1208 - /* Check to see if it already exists */ 1209 - mlist = adapter->mcastaddrs; 1210 - while (mlist) { 1211 - if (!compare_ether_addr(mlist->address, address)) 1212 - return 0; 1213 - mlist = mlist->next; 1214 - } 1215 - 1216 - /* Doesn't already exist. Allocate a structure to hold it */ 1217 - mcaddr = kmalloc(sizeof(struct mcast_address), GFP_ATOMIC); 1218 - if (mcaddr == NULL) 1219 - return 1; 1220 - 1221 - memcpy(mcaddr->address, address, 6); 1222 - 1223 - mcaddr->next = adapter->mcastaddrs; 1224 - adapter->mcastaddrs = mcaddr; 1225 - 1226 - return 0; 1227 273 } 1228 274 1229 275 /* ··· 296 1362 adapter->mcastmask |= (u64) 1 << crcpoly; 297 1363 } 298 1364 299 - static void slic_mcast_set_list(struct net_device *dev) 300 - { 301 - struct adapter *adapter = netdev_priv(dev); 302 - int status = 0; 303 - char *addresses; 304 - struct netdev_hw_addr *ha; 305 - 306 - ASSERT(adapter); 307 - 308 - netdev_for_each_mc_addr(ha, dev) { 309 - addresses = (char *) &ha->addr; 310 - status = slic_mcast_add_list(adapter, addresses); 311 - if (status != 0) 312 - break; 313 - slic_mcast_set_bit(adapter, addresses); 314 - } 315 - 316 - if (adapter->devflags_prev != dev->flags) { 317 - adapter->macopts = MAC_DIRECTED; 318 - if (dev->flags) { 319 - if (dev->flags & IFF_BROADCAST) 320 - adapter->macopts |= MAC_BCAST; 321 - if (dev->flags & IFF_PROMISC) 322 - adapter->macopts |= MAC_PROMISC; 323 - if (dev->flags & IFF_ALLMULTI) 324 - adapter->macopts |= MAC_ALLMCAST; 325 - if (dev->flags & IFF_MULTICAST) 326 - adapter->macopts |= MAC_MCAST; 327 - } 328 - adapter->devflags_prev = dev->flags; 329 - slic_config_set(adapter, true); 330 - } else { 331 - if (status == 0) 332 - slic_mcast_set_mask(adapter); 333 - } 334 - return; 335 - } 336 - 337 1365 static void slic_mcast_set_mask(struct adapter *adapter) 338 1366 { 339 1367 __iomem struct slic_regs *slic_regs = adapter->slic_regs; ··· 335 1439 add_timer(&adapter->pingtimer); 336 1440 } 337 1441 338 - /* 339 - * slic_if_init 340 - * 341 - * Perform initialization of our slic interface. 342 - * 343 - */ 344 - static int slic_if_init(struct adapter *adapter) 345 - { 346 - struct sliccard *card = adapter->card; 347 - struct net_device *dev = adapter->netdev; 348 - __iomem struct slic_regs *slic_regs = adapter->slic_regs; 349 - struct slic_shmem *pshmem; 350 - int rc; 351 - 352 - ASSERT(card); 353 - 354 - /* adapter should be down at this point */ 355 - if (adapter->state != ADAPT_DOWN) { 356 - dev_err(&dev->dev, "%s: adapter->state != ADAPT_DOWN\n", 357 - __func__); 358 - rc = -EIO; 359 - goto err; 360 - } 361 - ASSERT(adapter->linkstate == LINK_DOWN); 362 - 363 - adapter->devflags_prev = dev->flags; 364 - adapter->macopts = MAC_DIRECTED; 365 - if (dev->flags) { 366 - if (dev->flags & IFF_BROADCAST) 367 - adapter->macopts |= MAC_BCAST; 368 - if (dev->flags & IFF_PROMISC) 369 - adapter->macopts |= MAC_PROMISC; 370 - if (dev->flags & IFF_ALLMULTI) 371 - adapter->macopts |= MAC_ALLMCAST; 372 - if (dev->flags & IFF_MULTICAST) 373 - adapter->macopts |= MAC_MCAST; 374 - } 375 - rc = slic_adapter_allocresources(adapter); 376 - if (rc) { 377 - dev_err(&dev->dev, 378 - "%s: slic_adapter_allocresources FAILED %x\n", 379 - __func__, rc); 380 - slic_adapter_freeresources(adapter); 381 - goto err; 382 - } 383 - 384 - if (!adapter->queues_initialized) { 385 - if ((rc = slic_rspqueue_init(adapter))) 386 - goto err; 387 - if ((rc = slic_cmdq_init(adapter))) 388 - goto err; 389 - if ((rc = slic_rcvqueue_init(adapter))) 390 - goto err; 391 - adapter->queues_initialized = 1; 392 - } 393 - 394 - slic_reg32_write(&slic_regs->slic_icr, ICR_INT_OFF, FLUSH); 395 - mdelay(1); 396 - 397 - if (!adapter->isp_initialized) { 398 - pshmem = (struct slic_shmem *)adapter->phys_shmem; 399 - 400 - spin_lock_irqsave(&adapter->bit64reglock.lock, 401 - adapter->bit64reglock.flags); 402 - 403 - #if defined(CONFIG_X86_64) 404 - slic_reg32_write(&slic_regs->slic_addr_upper, 405 - SLIC_GET_ADDR_HIGH(&pshmem->isr), DONT_FLUSH); 406 - slic_reg32_write(&slic_regs->slic_isp, 407 - SLIC_GET_ADDR_LOW(&pshmem->isr), FLUSH); 408 - #elif defined(CONFIG_X86) 409 - slic_reg32_write(&slic_regs->slic_addr_upper, 0, DONT_FLUSH); 410 - slic_reg32_write(&slic_regs->slic_isp, (u32)&pshmem->isr, FLUSH); 411 - #else 412 - Stop Compilations 413 - #endif 414 - spin_unlock_irqrestore(&adapter->bit64reglock.lock, 415 - adapter->bit64reglock.flags); 416 - adapter->isp_initialized = 1; 417 - } 418 - 419 - adapter->state = ADAPT_UP; 420 - if (!card->loadtimerset) { 421 - init_timer(&card->loadtimer); 422 - card->loadtimer.expires = 423 - jiffies + (SLIC_LOADTIMER_PERIOD * HZ); 424 - card->loadtimer.data = (ulong) card; 425 - card->loadtimer.function = &slic_timer_load_check; 426 - add_timer(&card->loadtimer); 427 - 428 - card->loadtimerset = 1; 429 - } 430 - 431 - if (!adapter->pingtimerset) { 432 - init_timer(&adapter->pingtimer); 433 - adapter->pingtimer.expires = 434 - jiffies + (PING_TIMER_INTERVAL * HZ); 435 - adapter->pingtimer.data = (ulong) dev; 436 - adapter->pingtimer.function = &slic_timer_ping; 437 - add_timer(&adapter->pingtimer); 438 - adapter->pingtimerset = 1; 439 - adapter->card->pingstatus = ISR_PINGMASK; 440 - } 441 - 442 - /* 443 - * clear any pending events, then enable interrupts 444 - */ 445 - adapter->isrcopy = 0; 446 - adapter->pshmem->isr = 0; 447 - slic_reg32_write(&slic_regs->slic_isr, 0, FLUSH); 448 - slic_reg32_write(&slic_regs->slic_icr, ICR_INT_ON, FLUSH); 449 - 450 - slic_link_config(adapter, LINK_AUTOSPEED, LINK_AUTOD); 451 - slic_link_event_handler(adapter); 452 - 453 - err: 454 - return rc; 455 - } 456 - 457 1442 static void slic_unmap_mmio_space(struct adapter *adapter) 458 1443 { 459 1444 if (adapter->slic_regs) 460 1445 iounmap(adapter->slic_regs); 461 1446 adapter->slic_regs = NULL; 462 - } 463 - 464 - static int slic_adapter_allocresources(struct adapter *adapter) 465 - { 466 - if (!adapter->intrregistered) { 467 - int retval; 468 - 469 - spin_unlock_irqrestore(&slic_global.driver_lock.lock, 470 - slic_global.driver_lock.flags); 471 - 472 - retval = request_irq(adapter->netdev->irq, 473 - &slic_interrupt, 474 - IRQF_SHARED, 475 - adapter->netdev->name, adapter->netdev); 476 - 477 - spin_lock_irqsave(&slic_global.driver_lock.lock, 478 - slic_global.driver_lock.flags); 479 - 480 - if (retval) { 481 - dev_err(&adapter->netdev->dev, 482 - "request_irq (%s) FAILED [%x]\n", 483 - adapter->netdev->name, retval); 484 - return retval; 485 - } 486 - adapter->intrregistered = 1; 487 - } 488 - return 0; 489 - } 490 - 491 - static void slic_config_pci(struct pci_dev *pcidev) 492 - { 493 - u16 pci_command; 494 - u16 new_command; 495 - 496 - pci_read_config_word(pcidev, PCI_COMMAND, &pci_command); 497 - 498 - new_command = pci_command | PCI_COMMAND_MASTER 499 - | PCI_COMMAND_MEMORY 500 - | PCI_COMMAND_INVALIDATE 501 - | PCI_COMMAND_PARITY | PCI_COMMAND_SERR | PCI_COMMAND_FAST_BACK; 502 - if (pci_command != new_command) 503 - pci_write_config_word(pcidev, PCI_COMMAND, new_command); 504 - } 505 - 506 - static void slic_adapter_freeresources(struct adapter *adapter) 507 - { 508 - slic_init_cleanup(adapter); 509 - memset(&adapter->stats, 0, sizeof(struct net_device_stats)); 510 - adapter->error_interrupts = 0; 511 - adapter->rcv_interrupts = 0; 512 - adapter->xmit_interrupts = 0; 513 - adapter->linkevent_interrupts = 0; 514 - adapter->upr_interrupts = 0; 515 - adapter->num_isrs = 0; 516 - adapter->xmit_completes = 0; 517 - adapter->rcv_broadcasts = 0; 518 - adapter->rcv_multicasts = 0; 519 - adapter->rcv_unicasts = 0; 520 1447 } 521 1448 522 1449 /* ··· 493 1774 slic_reg32_write(wphy, phy_config, FLUSH); 494 1775 } 495 1776 } 496 - } 497 - 498 - static void slic_card_cleanup(struct sliccard *card) 499 - { 500 - if (card->loadtimerset) { 501 - card->loadtimerset = 0; 502 - del_timer(&card->loadtimer); 503 - } 504 - 505 - slic_debug_card_destroy(card); 506 - 507 - kfree(card); 508 1777 } 509 1778 510 1779 static int slic_card_download_gbrcv(struct adapter *adapter) ··· 708 2001 adapter->card->loadlevel_current = value; 709 2002 } 710 2003 711 - static int slic_card_init(struct sliccard *card, struct adapter *adapter) 712 - { 713 - __iomem struct slic_regs *slic_regs = adapter->slic_regs; 714 - struct slic_eeprom *peeprom; 715 - struct oslic_eeprom *pOeeprom; 716 - dma_addr_t phys_config; 717 - u32 phys_configh; 718 - u32 phys_configl; 719 - u32 i = 0; 720 - struct slic_shmem *pshmem; 721 - int status; 722 - uint macaddrs = card->card_size; 723 - ushort eecodesize; 724 - ushort dramsize; 725 - ushort ee_chksum; 726 - ushort calc_chksum; 727 - struct slic_config_mac *pmac; 728 - unsigned char fruformat; 729 - unsigned char oemfruformat; 730 - struct atk_fru *patkfru; 731 - union oemfru *poemfru; 732 - 733 - /* Reset everything except PCI configuration space */ 734 - slic_soft_reset(adapter); 735 - 736 - /* Download the microcode */ 737 - status = slic_card_download(adapter); 738 - 739 - if (status != 0) { 740 - dev_err(&adapter->pcidev->dev, 741 - "download failed bus %d slot %d\n", 742 - adapter->busnumber, adapter->slotnumber); 743 - return status; 744 - } 745 - 746 - if (!card->config_set) { 747 - peeprom = pci_alloc_consistent(adapter->pcidev, 748 - sizeof(struct slic_eeprom), 749 - &phys_config); 750 - 751 - phys_configl = SLIC_GET_ADDR_LOW(phys_config); 752 - phys_configh = SLIC_GET_ADDR_HIGH(phys_config); 753 - 754 - if (!peeprom) { 755 - dev_err(&adapter->pcidev->dev, 756 - "eeprom read failed to get memory " 757 - "bus %d slot %d\n", adapter->busnumber, 758 - adapter->slotnumber); 759 - return -ENOMEM; 760 - } else { 761 - memset(peeprom, 0, sizeof(struct slic_eeprom)); 762 - } 763 - slic_reg32_write(&slic_regs->slic_icr, ICR_INT_OFF, FLUSH); 764 - mdelay(1); 765 - pshmem = (struct slic_shmem *)adapter->phys_shmem; 766 - 767 - spin_lock_irqsave(&adapter->bit64reglock.lock, 768 - adapter->bit64reglock.flags); 769 - slic_reg32_write(&slic_regs->slic_addr_upper, 0, DONT_FLUSH); 770 - slic_reg32_write(&slic_regs->slic_isp, 771 - SLIC_GET_ADDR_LOW(&pshmem->isr), FLUSH); 772 - spin_unlock_irqrestore(&adapter->bit64reglock.lock, 773 - adapter->bit64reglock.flags); 774 - 775 - slic_config_get(adapter, phys_configl, phys_configh); 776 - 777 - for (;;) { 778 - if (adapter->pshmem->isr) { 779 - if (adapter->pshmem->isr & ISR_UPC) { 780 - adapter->pshmem->isr = 0; 781 - slic_reg64_write(adapter, 782 - &slic_regs->slic_isp, 0, 783 - &slic_regs->slic_addr_upper, 784 - 0, FLUSH); 785 - slic_reg32_write(&slic_regs->slic_isr, 786 - 0, FLUSH); 787 - 788 - slic_upr_request_complete(adapter, 0); 789 - break; 790 - } else { 791 - adapter->pshmem->isr = 0; 792 - slic_reg32_write(&slic_regs->slic_isr, 793 - 0, FLUSH); 794 - } 795 - } else { 796 - mdelay(1); 797 - i++; 798 - if (i > 5000) { 799 - dev_err(&adapter->pcidev->dev, 800 - "%d config data fetch timed out!\n", 801 - adapter->port); 802 - slic_reg64_write(adapter, 803 - &slic_regs->slic_isp, 0, 804 - &slic_regs->slic_addr_upper, 805 - 0, FLUSH); 806 - return -EINVAL; 807 - } 808 - } 809 - } 810 - 811 - switch (adapter->devid) { 812 - /* Oasis card */ 813 - case SLIC_2GB_DEVICE_ID: 814 - /* extract EEPROM data and pointers to EEPROM data */ 815 - pOeeprom = (struct oslic_eeprom *) peeprom; 816 - eecodesize = pOeeprom->EecodeSize; 817 - dramsize = pOeeprom->DramSize; 818 - pmac = pOeeprom->MacInfo; 819 - fruformat = pOeeprom->FruFormat; 820 - patkfru = &pOeeprom->AtkFru; 821 - oemfruformat = pOeeprom->OemFruFormat; 822 - poemfru = &pOeeprom->OemFru; 823 - macaddrs = 2; 824 - /* Minor kludge for Oasis card 825 - get 2 MAC addresses from the 826 - EEPROM to ensure that function 1 827 - gets the Port 1 MAC address */ 828 - break; 829 - default: 830 - /* extract EEPROM data and pointers to EEPROM data */ 831 - eecodesize = peeprom->EecodeSize; 832 - dramsize = peeprom->DramSize; 833 - pmac = peeprom->u2.mac.MacInfo; 834 - fruformat = peeprom->FruFormat; 835 - patkfru = &peeprom->AtkFru; 836 - oemfruformat = peeprom->OemFruFormat; 837 - poemfru = &peeprom->OemFru; 838 - break; 839 - } 840 - 841 - card->config.EepromValid = false; 842 - 843 - /* see if the EEPROM is valid by checking it's checksum */ 844 - if ((eecodesize <= MAX_EECODE_SIZE) && 845 - (eecodesize >= MIN_EECODE_SIZE)) { 846 - 847 - ee_chksum = 848 - *(u16 *) ((char *) peeprom + (eecodesize - 2)); 849 - /* 850 - calculate the EEPROM checksum 851 - */ 852 - calc_chksum = 853 - ~slic_eeprom_cksum((char *) peeprom, 854 - (eecodesize - 2)); 855 - /* 856 - if the ucdoe chksum flag bit worked, 857 - we wouldn't need this shit 858 - */ 859 - if (ee_chksum == calc_chksum) 860 - card->config.EepromValid = true; 861 - } 862 - /* copy in the DRAM size */ 863 - card->config.DramSize = dramsize; 864 - 865 - /* copy in the MAC address(es) */ 866 - for (i = 0; i < macaddrs; i++) { 867 - memcpy(&card->config.MacInfo[i], 868 - &pmac[i], sizeof(struct slic_config_mac)); 869 - } 870 - 871 - /* copy the Alacritech FRU information */ 872 - card->config.FruFormat = fruformat; 873 - memcpy(&card->config.AtkFru, patkfru, 874 - sizeof(struct atk_fru)); 875 - 876 - pci_free_consistent(adapter->pcidev, 877 - sizeof(struct slic_eeprom), 878 - peeprom, phys_config); 879 - 880 - if ((!card->config.EepromValid) && 881 - (adapter->reg_params.fail_on_bad_eeprom)) { 882 - slic_reg64_write(adapter, &slic_regs->slic_isp, 0, 883 - &slic_regs->slic_addr_upper, 884 - 0, FLUSH); 885 - dev_err(&adapter->pcidev->dev, 886 - "unsupported CONFIGURATION EEPROM invalid\n"); 887 - return -EINVAL; 888 - } 889 - 890 - card->config_set = 1; 891 - } 892 - 893 - if (slic_card_download_gbrcv(adapter)) { 894 - dev_err(&adapter->pcidev->dev, 895 - "unable to download GB receive microcode\n"); 896 - return -EINVAL; 897 - } 898 - 899 - if (slic_global.dynamic_intagg) 900 - slic_intagg_set(adapter, 0); 901 - else 902 - slic_intagg_set(adapter, intagg_delay); 903 - 904 - /* 905 - * Initialize ping status to "ok" 906 - */ 907 - card->pingstatus = ISR_PINGMASK; 908 - 909 - /* 910 - * Lastly, mark our card state as up and return success 911 - */ 912 - card->state = CARD_UP; 913 - card->reset_in_progress = 0; 914 - 915 - return 0; 916 - } 917 - 918 - static u32 slic_card_locate(struct adapter *adapter) 919 - { 920 - struct sliccard *card = slic_global.slic_card; 921 - struct physcard *physcard = slic_global.phys_card; 922 - ushort card_hostid; 923 - u16 __iomem *hostid_reg; 924 - uint i; 925 - uint rdhostid_offset = 0; 926 - 927 - switch (adapter->devid) { 928 - case SLIC_2GB_DEVICE_ID: 929 - rdhostid_offset = SLIC_RDHOSTID_2GB; 930 - break; 931 - case SLIC_1GB_DEVICE_ID: 932 - rdhostid_offset = SLIC_RDHOSTID_1GB; 933 - break; 934 - default: 935 - ASSERT(0); 936 - break; 937 - } 938 - 939 - hostid_reg = 940 - (u16 __iomem *) (((u8 __iomem *) (adapter->slic_regs)) + 941 - rdhostid_offset); 942 - 943 - /* read the 16 bit hostid from SRAM */ 944 - card_hostid = (ushort) readw(hostid_reg); 945 - 946 - /* Initialize a new card structure if need be */ 947 - if (card_hostid == SLIC_HOSTID_DEFAULT) { 948 - card = kzalloc(sizeof(struct sliccard), GFP_KERNEL); 949 - if (card == NULL) 950 - return -ENOMEM; 951 - 952 - card->next = slic_global.slic_card; 953 - slic_global.slic_card = card; 954 - card->busnumber = adapter->busnumber; 955 - card->slotnumber = adapter->slotnumber; 956 - 957 - /* Find an available cardnum */ 958 - for (i = 0; i < SLIC_MAX_CARDS; i++) { 959 - if (slic_global.cardnuminuse[i] == 0) { 960 - slic_global.cardnuminuse[i] = 1; 961 - card->cardnum = i; 962 - break; 963 - } 964 - } 965 - slic_global.num_slic_cards++; 966 - 967 - slic_debug_card_create(card); 968 - } else { 969 - /* Card exists, find the card this adapter belongs to */ 970 - while (card) { 971 - if (card->cardnum == card_hostid) 972 - break; 973 - card = card->next; 974 - } 975 - } 976 - 977 - ASSERT(card); 978 - if (!card) 979 - return -ENXIO; 980 - /* Put the adapter in the card's adapter list */ 981 - ASSERT(card->adapter[adapter->port] == NULL); 982 - if (!card->adapter[adapter->port]) { 983 - card->adapter[adapter->port] = adapter; 984 - adapter->card = card; 985 - } 986 - 987 - card->card_size = 1; /* one port per *logical* card */ 988 - 989 - while (physcard) { 990 - for (i = 0; i < SLIC_MAX_PORTS; i++) { 991 - if (!physcard->adapter[i]) 992 - continue; 993 - else 994 - break; 995 - } 996 - ASSERT(i != SLIC_MAX_PORTS); 997 - if (physcard->adapter[i]->slotnumber == adapter->slotnumber) 998 - break; 999 - physcard = physcard->next; 1000 - } 1001 - if (!physcard) { 1002 - /* no structure allocated for this physical card yet */ 1003 - physcard = kzalloc(sizeof(struct physcard), GFP_ATOMIC); 1004 - ASSERT(physcard); 1005 - 1006 - physcard->next = slic_global.phys_card; 1007 - slic_global.phys_card = physcard; 1008 - physcard->adapters_allocd = 1; 1009 - } else { 1010 - physcard->adapters_allocd++; 1011 - } 1012 - /* Note - this is ZERO relative */ 1013 - adapter->physport = physcard->adapters_allocd - 1; 1014 - 1015 - ASSERT(physcard->adapter[adapter->physport] == NULL); 1016 - physcard->adapter[adapter->physport] = adapter; 1017 - adapter->physcard = physcard; 1018 - 1019 - return 0; 1020 - } 1021 - 1022 2004 static void slic_soft_reset(struct adapter *adapter) 1023 2005 { 1024 2006 if (adapter->card->state == CARD_UP) { ··· 718 2322 slic_reg32_write(&adapter->slic_regs->slic_reset, SLIC_RESET_MAGIC, 719 2323 FLUSH); 720 2324 mdelay(1); 2325 + } 2326 + 2327 + static void slic_mac_address_config(struct adapter *adapter) 2328 + { 2329 + u32 value; 2330 + u32 value2; 2331 + __iomem struct slic_regs *slic_regs = adapter->slic_regs; 2332 + 2333 + value = *(u32 *) &adapter->currmacaddr[2]; 2334 + value = ntohl(value); 2335 + slic_reg32_write(&slic_regs->slic_wraddral, value, FLUSH); 2336 + slic_reg32_write(&slic_regs->slic_wraddrbl, value, FLUSH); 2337 + 2338 + value2 = (u32) ((adapter->currmacaddr[0] << 8 | 2339 + adapter->currmacaddr[1]) & 0xFFFF); 2340 + 2341 + slic_reg32_write(&slic_regs->slic_wraddrah, value2, FLUSH); 2342 + slic_reg32_write(&slic_regs->slic_wraddrbh, value2, FLUSH); 2343 + 2344 + /* Write our multicast mask out to the card. This is done */ 2345 + /* here in addition to the slic_mcast_addr_set routine */ 2346 + /* because ALL_MCAST may have been enabled or disabled */ 2347 + slic_mcast_set_mask(adapter); 2348 + } 2349 + 2350 + static void slic_mac_config(struct adapter *adapter) 2351 + { 2352 + u32 value; 2353 + __iomem struct slic_regs *slic_regs = adapter->slic_regs; 2354 + 2355 + /* Setup GMAC gaps */ 2356 + if (adapter->linkspeed == LINK_1000MB) { 2357 + value = ((GMCR_GAPBB_1000 << GMCR_GAPBB_SHIFT) | 2358 + (GMCR_GAPR1_1000 << GMCR_GAPR1_SHIFT) | 2359 + (GMCR_GAPR2_1000 << GMCR_GAPR2_SHIFT)); 2360 + } else { 2361 + value = ((GMCR_GAPBB_100 << GMCR_GAPBB_SHIFT) | 2362 + (GMCR_GAPR1_100 << GMCR_GAPR1_SHIFT) | 2363 + (GMCR_GAPR2_100 << GMCR_GAPR2_SHIFT)); 2364 + } 2365 + 2366 + /* enable GMII */ 2367 + if (adapter->linkspeed == LINK_1000MB) 2368 + value |= GMCR_GBIT; 2369 + 2370 + /* enable fullduplex */ 2371 + if ((adapter->linkduplex == LINK_FULLD) 2372 + || (adapter->macopts & MAC_LOOPBACK)) { 2373 + value |= GMCR_FULLD; 2374 + } 2375 + 2376 + /* write mac config */ 2377 + slic_reg32_write(&slic_regs->slic_wmcfg, value, FLUSH); 2378 + 2379 + /* setup mac addresses */ 2380 + slic_mac_address_config(adapter); 721 2381 } 722 2382 723 2383 static void slic_config_set(struct adapter *adapter, bool linkchange) ··· 855 2403 /* power down phy */ 856 2404 phy_config = (MIICR_REG_PCR | (PCR_POWERDOWN)); 857 2405 slic_reg32_write(&slic_regs->slic_wphy, phy_config, FLUSH); 858 - } 859 - 860 - static void slic_config_get(struct adapter *adapter, u32 config, 861 - u32 config_h) 862 - { 863 - int status; 864 - 865 - status = slic_upr_request(adapter, 866 - SLIC_UPR_RCONFIG, 867 - (u32) config, (u32) config_h, 0, 0); 868 - ASSERT(status == 0); 869 - } 870 - 871 - static void slic_mac_address_config(struct adapter *adapter) 872 - { 873 - u32 value; 874 - u32 value2; 875 - __iomem struct slic_regs *slic_regs = adapter->slic_regs; 876 - 877 - value = *(u32 *) &adapter->currmacaddr[2]; 878 - value = ntohl(value); 879 - slic_reg32_write(&slic_regs->slic_wraddral, value, FLUSH); 880 - slic_reg32_write(&slic_regs->slic_wraddrbl, value, FLUSH); 881 - 882 - value2 = (u32) ((adapter->currmacaddr[0] << 8 | 883 - adapter->currmacaddr[1]) & 0xFFFF); 884 - 885 - slic_reg32_write(&slic_regs->slic_wraddrah, value2, FLUSH); 886 - slic_reg32_write(&slic_regs->slic_wraddrbh, value2, FLUSH); 887 - 888 - /* Write our multicast mask out to the card. This is done */ 889 - /* here in addition to the slic_mcast_addr_set routine */ 890 - /* because ALL_MCAST may have been enabled or disabled */ 891 - slic_mcast_set_mask(adapter); 892 - } 893 - 894 - static void slic_mac_config(struct adapter *adapter) 895 - { 896 - u32 value; 897 - __iomem struct slic_regs *slic_regs = adapter->slic_regs; 898 - 899 - /* Setup GMAC gaps */ 900 - if (adapter->linkspeed == LINK_1000MB) { 901 - value = ((GMCR_GAPBB_1000 << GMCR_GAPBB_SHIFT) | 902 - (GMCR_GAPR1_1000 << GMCR_GAPR1_SHIFT) | 903 - (GMCR_GAPR2_1000 << GMCR_GAPR2_SHIFT)); 904 - } else { 905 - value = ((GMCR_GAPBB_100 << GMCR_GAPBB_SHIFT) | 906 - (GMCR_GAPR1_100 << GMCR_GAPR1_SHIFT) | 907 - (GMCR_GAPR2_100 << GMCR_GAPR2_SHIFT)); 908 - } 909 - 910 - /* enable GMII */ 911 - if (adapter->linkspeed == LINK_1000MB) 912 - value |= GMCR_GBIT; 913 - 914 - /* enable fullduplex */ 915 - if ((adapter->linkduplex == LINK_FULLD) 916 - || (adapter->macopts & MAC_LOOPBACK)) { 917 - value |= GMCR_FULLD; 918 - } 919 - 920 - /* write mac config */ 921 - slic_reg32_write(&slic_regs->slic_wmcfg, value, FLUSH); 922 - 923 - /* setup mac addresses */ 924 - slic_mac_address_config(adapter); 925 2406 } 926 2407 927 2408 static bool slic_mac_filter(struct adapter *adapter, ··· 984 2599 add_timer(&card->loadtimer); 985 2600 } 986 2601 987 - static void slic_assert_fail(void) 988 - { 989 - u32 cpuid; 990 - u32 curr_pid; 991 - cpuid = smp_processor_id(); 992 - curr_pid = current->pid; 993 - 994 - printk(KERN_ERR "%s CPU # %d ---- PID # %d\n", 995 - __func__, cpuid, curr_pid); 996 - } 997 - 998 2602 static int slic_upr_queue_request(struct adapter *adapter, 999 2603 u32 upr_request, 1000 2604 u32 upr_data, ··· 1016 2642 return 0; 1017 2643 } 1018 2644 2645 + static void slic_upr_start(struct adapter *adapter) 2646 + { 2647 + struct slic_upr *upr; 2648 + __iomem struct slic_regs *slic_regs = adapter->slic_regs; 2649 + /* 2650 + char * ptr1; 2651 + char * ptr2; 2652 + uint cmdoffset; 2653 + */ 2654 + upr = adapter->upr_list; 2655 + if (!upr) 2656 + return; 2657 + if (adapter->upr_busy) 2658 + return; 2659 + adapter->upr_busy = 1; 2660 + 2661 + switch (upr->upr_request) { 2662 + case SLIC_UPR_STATS: 2663 + if (upr->upr_data_h == 0) { 2664 + slic_reg32_write(&slic_regs->slic_stats, upr->upr_data, 2665 + FLUSH); 2666 + } else { 2667 + slic_reg64_write(adapter, &slic_regs->slic_stats64, 2668 + upr->upr_data, 2669 + &slic_regs->slic_addr_upper, 2670 + upr->upr_data_h, FLUSH); 2671 + } 2672 + break; 2673 + 2674 + case SLIC_UPR_RLSR: 2675 + slic_reg64_write(adapter, &slic_regs->slic_rlsr, upr->upr_data, 2676 + &slic_regs->slic_addr_upper, upr->upr_data_h, 2677 + FLUSH); 2678 + break; 2679 + 2680 + case SLIC_UPR_RCONFIG: 2681 + slic_reg64_write(adapter, &slic_regs->slic_rconfig, 2682 + upr->upr_data, &slic_regs->slic_addr_upper, 2683 + upr->upr_data_h, FLUSH); 2684 + break; 2685 + case SLIC_UPR_PING: 2686 + slic_reg32_write(&slic_regs->slic_ping, 1, FLUSH); 2687 + break; 2688 + default: 2689 + ASSERT(0); 2690 + } 2691 + } 2692 + 1019 2693 static int slic_upr_request(struct adapter *adapter, 1020 2694 u32 upr_request, 1021 2695 u32 upr_data, ··· 1085 2663 spin_unlock_irqrestore(&adapter->upr_lock.lock, 1086 2664 adapter->upr_lock.flags); 1087 2665 return rc; 2666 + } 2667 + 2668 + static void slic_link_upr_complete(struct adapter *adapter, u32 isr) 2669 + { 2670 + u32 linkstatus = adapter->pshmem->linkstatus; 2671 + uint linkup; 2672 + unsigned char linkspeed; 2673 + unsigned char linkduplex; 2674 + 2675 + if ((isr & ISR_UPCERR) || (isr & ISR_UPCBSY)) { 2676 + struct slic_shmem *pshmem; 2677 + 2678 + pshmem = (struct slic_shmem *)adapter->phys_shmem; 2679 + #if defined(CONFIG_X86_64) 2680 + slic_upr_queue_request(adapter, 2681 + SLIC_UPR_RLSR, 2682 + SLIC_GET_ADDR_LOW(&pshmem->linkstatus), 2683 + SLIC_GET_ADDR_HIGH(&pshmem->linkstatus), 2684 + 0, 0); 2685 + #elif defined(CONFIG_X86) 2686 + slic_upr_queue_request(adapter, 2687 + SLIC_UPR_RLSR, 2688 + (u32) &pshmem->linkstatus, 2689 + SLIC_GET_ADDR_HIGH(pshmem), 0, 0); 2690 + #else 2691 + Stop Compilation; 2692 + #endif 2693 + return; 2694 + } 2695 + if (adapter->state != ADAPT_UP) 2696 + return; 2697 + 2698 + ASSERT((adapter->devid == SLIC_1GB_DEVICE_ID) 2699 + || (adapter->devid == SLIC_2GB_DEVICE_ID)); 2700 + 2701 + linkup = linkstatus & GIG_LINKUP ? LINK_UP : LINK_DOWN; 2702 + if (linkstatus & GIG_SPEED_1000) 2703 + linkspeed = LINK_1000MB; 2704 + else if (linkstatus & GIG_SPEED_100) 2705 + linkspeed = LINK_100MB; 2706 + else 2707 + linkspeed = LINK_10MB; 2708 + 2709 + if (linkstatus & GIG_FULLDUPLEX) 2710 + linkduplex = LINK_FULLD; 2711 + else 2712 + linkduplex = LINK_HALFD; 2713 + 2714 + if ((adapter->linkstate == LINK_DOWN) && (linkup == LINK_DOWN)) 2715 + return; 2716 + 2717 + /* link up event, but nothing has changed */ 2718 + if ((adapter->linkstate == LINK_UP) && 2719 + (linkup == LINK_UP) && 2720 + (adapter->linkspeed == linkspeed) && 2721 + (adapter->linkduplex == linkduplex)) 2722 + return; 2723 + 2724 + /* link has changed at this point */ 2725 + 2726 + /* link has gone from up to down */ 2727 + if (linkup == LINK_DOWN) { 2728 + adapter->linkstate = LINK_DOWN; 2729 + return; 2730 + } 2731 + 2732 + /* link has gone from down to up */ 2733 + adapter->linkspeed = linkspeed; 2734 + adapter->linkduplex = linkduplex; 2735 + 2736 + if (adapter->linkstate != LINK_UP) { 2737 + /* setup the mac */ 2738 + slic_config_set(adapter, true); 2739 + adapter->linkstate = LINK_UP; 2740 + netif_start_queue(adapter->netdev); 2741 + } 1088 2742 } 1089 2743 1090 2744 static void slic_upr_request_complete(struct adapter *adapter, u32 isr) ··· 1285 2787 adapter->upr_lock.flags); 1286 2788 } 1287 2789 1288 - static void slic_upr_start(struct adapter *adapter) 2790 + static void slic_config_get(struct adapter *adapter, u32 config, 2791 + u32 config_h) 1289 2792 { 1290 - struct slic_upr *upr; 1291 - __iomem struct slic_regs *slic_regs = adapter->slic_regs; 1292 - /* 1293 - char * ptr1; 1294 - char * ptr2; 1295 - uint cmdoffset; 1296 - */ 1297 - upr = adapter->upr_list; 1298 - if (!upr) 1299 - return; 1300 - if (adapter->upr_busy) 1301 - return; 1302 - adapter->upr_busy = 1; 2793 + int status; 1303 2794 1304 - switch (upr->upr_request) { 1305 - case SLIC_UPR_STATS: 1306 - if (upr->upr_data_h == 0) { 1307 - slic_reg32_write(&slic_regs->slic_stats, upr->upr_data, 1308 - FLUSH); 1309 - } else { 1310 - slic_reg64_write(adapter, &slic_regs->slic_stats64, 1311 - upr->upr_data, 1312 - &slic_regs->slic_addr_upper, 1313 - upr->upr_data_h, FLUSH); 1314 - } 1315 - break; 1316 - 1317 - case SLIC_UPR_RLSR: 1318 - slic_reg64_write(adapter, &slic_regs->slic_rlsr, upr->upr_data, 1319 - &slic_regs->slic_addr_upper, upr->upr_data_h, 1320 - FLUSH); 1321 - break; 1322 - 1323 - case SLIC_UPR_RCONFIG: 1324 - slic_reg64_write(adapter, &slic_regs->slic_rconfig, 1325 - upr->upr_data, &slic_regs->slic_addr_upper, 1326 - upr->upr_data_h, FLUSH); 1327 - break; 1328 - case SLIC_UPR_PING: 1329 - slic_reg32_write(&slic_regs->slic_ping, 1, FLUSH); 1330 - break; 1331 - default: 1332 - ASSERT(0); 1333 - } 1334 - } 1335 - 1336 - static void slic_link_upr_complete(struct adapter *adapter, u32 isr) 1337 - { 1338 - u32 linkstatus = adapter->pshmem->linkstatus; 1339 - uint linkup; 1340 - unsigned char linkspeed; 1341 - unsigned char linkduplex; 1342 - 1343 - if ((isr & ISR_UPCERR) || (isr & ISR_UPCBSY)) { 1344 - struct slic_shmem *pshmem; 1345 - 1346 - pshmem = (struct slic_shmem *)adapter->phys_shmem; 1347 - #if defined(CONFIG_X86_64) 1348 - slic_upr_queue_request(adapter, 1349 - SLIC_UPR_RLSR, 1350 - SLIC_GET_ADDR_LOW(&pshmem->linkstatus), 1351 - SLIC_GET_ADDR_HIGH(&pshmem->linkstatus), 1352 - 0, 0); 1353 - #elif defined(CONFIG_X86) 1354 - slic_upr_queue_request(adapter, 1355 - SLIC_UPR_RLSR, 1356 - (u32) &pshmem->linkstatus, 1357 - SLIC_GET_ADDR_HIGH(pshmem), 0, 0); 1358 - #else 1359 - Stop Compilation; 1360 - #endif 1361 - return; 1362 - } 1363 - if (adapter->state != ADAPT_UP) 1364 - return; 1365 - 1366 - ASSERT((adapter->devid == SLIC_1GB_DEVICE_ID) 1367 - || (adapter->devid == SLIC_2GB_DEVICE_ID)); 1368 - 1369 - linkup = linkstatus & GIG_LINKUP ? LINK_UP : LINK_DOWN; 1370 - if (linkstatus & GIG_SPEED_1000) 1371 - linkspeed = LINK_1000MB; 1372 - else if (linkstatus & GIG_SPEED_100) 1373 - linkspeed = LINK_100MB; 1374 - else 1375 - linkspeed = LINK_10MB; 1376 - 1377 - if (linkstatus & GIG_FULLDUPLEX) 1378 - linkduplex = LINK_FULLD; 1379 - else 1380 - linkduplex = LINK_HALFD; 1381 - 1382 - if ((adapter->linkstate == LINK_DOWN) && (linkup == LINK_DOWN)) 1383 - return; 1384 - 1385 - /* link up event, but nothing has changed */ 1386 - if ((adapter->linkstate == LINK_UP) && 1387 - (linkup == LINK_UP) && 1388 - (adapter->linkspeed == linkspeed) && 1389 - (adapter->linkduplex == linkduplex)) 1390 - return; 1391 - 1392 - /* link has changed at this point */ 1393 - 1394 - /* link has gone from up to down */ 1395 - if (linkup == LINK_DOWN) { 1396 - adapter->linkstate = LINK_DOWN; 1397 - return; 1398 - } 1399 - 1400 - /* link has gone from down to up */ 1401 - adapter->linkspeed = linkspeed; 1402 - adapter->linkduplex = linkduplex; 1403 - 1404 - if (adapter->linkstate != LINK_UP) { 1405 - /* setup the mac */ 1406 - slic_config_set(adapter, true); 1407 - adapter->linkstate = LINK_UP; 1408 - netif_start_queue(adapter->netdev); 1409 - } 2795 + status = slic_upr_request(adapter, 2796 + SLIC_UPR_RCONFIG, 2797 + (u32) config, (u32) config_h, 0, 0); 2798 + ASSERT(status == 0); 1410 2799 } 1411 2800 1412 2801 /* ··· 1398 3013 return (ushort) sum; 1399 3014 } 1400 3015 3016 + static void slic_rspqueue_free(struct adapter *adapter) 3017 + { 3018 + int i; 3019 + struct slic_rspqueue *rspq = &adapter->rspqueue; 3020 + 3021 + for (i = 0; i < rspq->num_pages; i++) { 3022 + if (rspq->vaddr[i]) { 3023 + pci_free_consistent(adapter->pcidev, PAGE_SIZE, 3024 + rspq->vaddr[i], rspq->paddr[i]); 3025 + } 3026 + rspq->vaddr[i] = NULL; 3027 + rspq->paddr[i] = 0; 3028 + } 3029 + rspq->offset = 0; 3030 + rspq->pageindex = 0; 3031 + rspq->rspbuf = NULL; 3032 + } 3033 + 1401 3034 static int slic_rspqueue_init(struct adapter *adapter) 1402 3035 { 1403 3036 int i; ··· 1461 3058 rspq->pageindex = 0; 1462 3059 rspq->rspbuf = (struct slic_rspbuf *)rspq->vaddr[0]; 1463 3060 return 0; 1464 - } 1465 - 1466 - static void slic_rspqueue_free(struct adapter *adapter) 1467 - { 1468 - int i; 1469 - struct slic_rspqueue *rspq = &adapter->rspqueue; 1470 - 1471 - for (i = 0; i < rspq->num_pages; i++) { 1472 - if (rspq->vaddr[i]) { 1473 - pci_free_consistent(adapter->pcidev, PAGE_SIZE, 1474 - rspq->vaddr[i], rspq->paddr[i]); 1475 - } 1476 - rspq->vaddr[i] = NULL; 1477 - rspq->paddr[i] = 0; 1478 - } 1479 - rspq->offset = 0; 1480 - rspq->pageindex = 0; 1481 - rspq->rspbuf = NULL; 1482 3061 } 1483 3062 1484 3063 static struct slic_rspbuf *slic_rspqueue_getnext(struct adapter *adapter) ··· 1545 3160 return pageaddr; 1546 3161 } 1547 3162 1548 - static int slic_cmdq_init(struct adapter *adapter) 1549 - { 1550 - int i; 1551 - u32 *pageaddr; 1552 - 1553 - ASSERT(adapter->state == ADAPT_DOWN); 1554 - memset(&adapter->cmdq_all, 0, sizeof(struct slic_cmdqueue)); 1555 - memset(&adapter->cmdq_free, 0, sizeof(struct slic_cmdqueue)); 1556 - memset(&adapter->cmdq_done, 0, sizeof(struct slic_cmdqueue)); 1557 - spin_lock_init(&adapter->cmdq_all.lock.lock); 1558 - spin_lock_init(&adapter->cmdq_free.lock.lock); 1559 - spin_lock_init(&adapter->cmdq_done.lock.lock); 1560 - slic_cmdqmem_init(adapter); 1561 - adapter->slic_handle_ix = 1; 1562 - for (i = 0; i < SLIC_CMDQ_INITPAGES; i++) { 1563 - pageaddr = slic_cmdqmem_addpage(adapter); 1564 - #ifndef CONFIG_X86_64 1565 - ASSERT(((u32) pageaddr & 0xFFFFF000) == (u32) pageaddr); 1566 - #endif 1567 - if (!pageaddr) { 1568 - slic_cmdq_free(adapter); 1569 - return -ENOMEM; 1570 - } 1571 - slic_cmdq_addcmdpage(adapter, pageaddr); 1572 - } 1573 - adapter->slic_handle_ix = 1; 1574 - 1575 - return 0; 1576 - } 1577 - 1578 3163 static void slic_cmdq_free(struct adapter *adapter) 1579 3164 { 1580 3165 struct slic_hostcmd *cmd; ··· 1566 3211 memset(&adapter->cmdq_free, 0, sizeof(struct slic_cmdqueue)); 1567 3212 memset(&adapter->cmdq_done, 0, sizeof(struct slic_cmdqueue)); 1568 3213 slic_cmdqmem_free(adapter); 1569 - } 1570 - 1571 - static void slic_cmdq_reset(struct adapter *adapter) 1572 - { 1573 - struct slic_hostcmd *hcmd; 1574 - struct sk_buff *skb; 1575 - u32 outstanding; 1576 - 1577 - spin_lock_irqsave(&adapter->cmdq_free.lock.lock, 1578 - adapter->cmdq_free.lock.flags); 1579 - spin_lock_irqsave(&adapter->cmdq_done.lock.lock, 1580 - adapter->cmdq_done.lock.flags); 1581 - outstanding = adapter->cmdq_all.count - adapter->cmdq_done.count; 1582 - outstanding -= adapter->cmdq_free.count; 1583 - hcmd = adapter->cmdq_all.head; 1584 - while (hcmd) { 1585 - if (hcmd->busy) { 1586 - skb = hcmd->skb; 1587 - ASSERT(skb); 1588 - hcmd->busy = 0; 1589 - hcmd->skb = NULL; 1590 - dev_kfree_skb_irq(skb); 1591 - } 1592 - hcmd = hcmd->next_all; 1593 - } 1594 - adapter->cmdq_free.count = 0; 1595 - adapter->cmdq_free.head = NULL; 1596 - adapter->cmdq_free.tail = NULL; 1597 - adapter->cmdq_done.count = 0; 1598 - adapter->cmdq_done.head = NULL; 1599 - adapter->cmdq_done.tail = NULL; 1600 - adapter->cmdq_free.head = adapter->cmdq_all.head; 1601 - hcmd = adapter->cmdq_all.head; 1602 - while (hcmd) { 1603 - adapter->cmdq_free.count++; 1604 - hcmd->next = hcmd->next_all; 1605 - hcmd = hcmd->next_all; 1606 - } 1607 - if (adapter->cmdq_free.count != adapter->cmdq_all.count) { 1608 - dev_err(&adapter->netdev->dev, 1609 - "free_count %d != all count %d\n", 1610 - adapter->cmdq_free.count, adapter->cmdq_all.count); 1611 - } 1612 - spin_unlock_irqrestore(&adapter->cmdq_done.lock.lock, 1613 - adapter->cmdq_done.lock.flags); 1614 - spin_unlock_irqrestore(&adapter->cmdq_free.lock.lock, 1615 - adapter->cmdq_free.lock.flags); 1616 3214 } 1617 3215 1618 3216 static void slic_cmdq_addcmdpage(struct adapter *adapter, u32 *page) ··· 1633 3325 spin_unlock_irqrestore(&cmdq->lock.lock, cmdq->lock.flags); 1634 3326 } 1635 3327 3328 + static int slic_cmdq_init(struct adapter *adapter) 3329 + { 3330 + int i; 3331 + u32 *pageaddr; 3332 + 3333 + ASSERT(adapter->state == ADAPT_DOWN); 3334 + memset(&adapter->cmdq_all, 0, sizeof(struct slic_cmdqueue)); 3335 + memset(&adapter->cmdq_free, 0, sizeof(struct slic_cmdqueue)); 3336 + memset(&adapter->cmdq_done, 0, sizeof(struct slic_cmdqueue)); 3337 + spin_lock_init(&adapter->cmdq_all.lock.lock); 3338 + spin_lock_init(&adapter->cmdq_free.lock.lock); 3339 + spin_lock_init(&adapter->cmdq_done.lock.lock); 3340 + slic_cmdqmem_init(adapter); 3341 + adapter->slic_handle_ix = 1; 3342 + for (i = 0; i < SLIC_CMDQ_INITPAGES; i++) { 3343 + pageaddr = slic_cmdqmem_addpage(adapter); 3344 + #ifndef CONFIG_X86_64 3345 + ASSERT(((u32) pageaddr & 0xFFFFF000) == (u32) pageaddr); 3346 + #endif 3347 + if (!pageaddr) { 3348 + slic_cmdq_free(adapter); 3349 + return -ENOMEM; 3350 + } 3351 + slic_cmdq_addcmdpage(adapter, pageaddr); 3352 + } 3353 + adapter->slic_handle_ix = 1; 3354 + 3355 + return 0; 3356 + } 3357 + 3358 + static void slic_cmdq_reset(struct adapter *adapter) 3359 + { 3360 + struct slic_hostcmd *hcmd; 3361 + struct sk_buff *skb; 3362 + u32 outstanding; 3363 + 3364 + spin_lock_irqsave(&adapter->cmdq_free.lock.lock, 3365 + adapter->cmdq_free.lock.flags); 3366 + spin_lock_irqsave(&adapter->cmdq_done.lock.lock, 3367 + adapter->cmdq_done.lock.flags); 3368 + outstanding = adapter->cmdq_all.count - adapter->cmdq_done.count; 3369 + outstanding -= adapter->cmdq_free.count; 3370 + hcmd = adapter->cmdq_all.head; 3371 + while (hcmd) { 3372 + if (hcmd->busy) { 3373 + skb = hcmd->skb; 3374 + ASSERT(skb); 3375 + hcmd->busy = 0; 3376 + hcmd->skb = NULL; 3377 + dev_kfree_skb_irq(skb); 3378 + } 3379 + hcmd = hcmd->next_all; 3380 + } 3381 + adapter->cmdq_free.count = 0; 3382 + adapter->cmdq_free.head = NULL; 3383 + adapter->cmdq_free.tail = NULL; 3384 + adapter->cmdq_done.count = 0; 3385 + adapter->cmdq_done.head = NULL; 3386 + adapter->cmdq_done.tail = NULL; 3387 + adapter->cmdq_free.head = adapter->cmdq_all.head; 3388 + hcmd = adapter->cmdq_all.head; 3389 + while (hcmd) { 3390 + adapter->cmdq_free.count++; 3391 + hcmd->next = hcmd->next_all; 3392 + hcmd = hcmd->next_all; 3393 + } 3394 + if (adapter->cmdq_free.count != adapter->cmdq_all.count) { 3395 + dev_err(&adapter->netdev->dev, 3396 + "free_count %d != all count %d\n", 3397 + adapter->cmdq_free.count, adapter->cmdq_all.count); 3398 + } 3399 + spin_unlock_irqrestore(&adapter->cmdq_done.lock.lock, 3400 + adapter->cmdq_done.lock.flags); 3401 + spin_unlock_irqrestore(&adapter->cmdq_free.lock.lock, 3402 + adapter->cmdq_free.lock.flags); 3403 + } 3404 + 3405 + static void slic_cmdq_getdone(struct adapter *adapter) 3406 + { 3407 + struct slic_cmdqueue *done_cmdq = &adapter->cmdq_done; 3408 + struct slic_cmdqueue *free_cmdq = &adapter->cmdq_free; 3409 + 3410 + ASSERT(free_cmdq->head == NULL); 3411 + spin_lock_irqsave(&done_cmdq->lock.lock, done_cmdq->lock.flags); 3412 + 3413 + free_cmdq->head = done_cmdq->head; 3414 + free_cmdq->count = done_cmdq->count; 3415 + done_cmdq->head = NULL; 3416 + done_cmdq->tail = NULL; 3417 + done_cmdq->count = 0; 3418 + spin_unlock_irqrestore(&done_cmdq->lock.lock, done_cmdq->lock.flags); 3419 + } 3420 + 1636 3421 static struct slic_hostcmd *slic_cmdq_getfree(struct adapter *adapter) 1637 3422 { 1638 3423 struct slic_cmdqueue *cmdq = &adapter->cmdq_free; ··· 1759 3358 return cmd; 1760 3359 } 1761 3360 1762 - static void slic_cmdq_getdone(struct adapter *adapter) 1763 - { 1764 - struct slic_cmdqueue *done_cmdq = &adapter->cmdq_done; 1765 - struct slic_cmdqueue *free_cmdq = &adapter->cmdq_free; 1766 - 1767 - ASSERT(free_cmdq->head == NULL); 1768 - spin_lock_irqsave(&done_cmdq->lock.lock, done_cmdq->lock.flags); 1769 - 1770 - free_cmdq->head = done_cmdq->head; 1771 - free_cmdq->count = done_cmdq->count; 1772 - done_cmdq->head = NULL; 1773 - done_cmdq->tail = NULL; 1774 - done_cmdq->count = 0; 1775 - spin_unlock_irqrestore(&done_cmdq->lock.lock, done_cmdq->lock.flags); 1776 - } 1777 - 1778 3361 static void slic_cmdq_putdone_irq(struct adapter *adapter, 1779 3362 struct slic_hostcmd *cmd) 1780 3363 { ··· 1772 3387 if ((adapter->xmitq_full) && (cmdq->count > 10)) 1773 3388 netif_wake_queue(adapter->netdev); 1774 3389 spin_unlock(&cmdq->lock.lock); 1775 - } 1776 - 1777 - static int slic_rcvqueue_init(struct adapter *adapter) 1778 - { 1779 - int i, count; 1780 - struct slic_rcvqueue *rcvq = &adapter->rcvqueue; 1781 - 1782 - ASSERT(adapter->state == ADAPT_DOWN); 1783 - rcvq->tail = NULL; 1784 - rcvq->head = NULL; 1785 - rcvq->size = SLIC_RCVQ_ENTRIES; 1786 - rcvq->errors = 0; 1787 - rcvq->count = 0; 1788 - i = (SLIC_RCVQ_ENTRIES / SLIC_RCVQ_FILLENTRIES); 1789 - count = 0; 1790 - while (i) { 1791 - count += slic_rcvqueue_fill(adapter); 1792 - i--; 1793 - } 1794 - if (rcvq->count < SLIC_RCVQ_MINENTRIES) { 1795 - slic_rcvqueue_free(adapter); 1796 - return -ENOMEM; 1797 - } 1798 - return 0; 1799 - } 1800 - 1801 - static void slic_rcvqueue_free(struct adapter *adapter) 1802 - { 1803 - struct slic_rcvqueue *rcvq = &adapter->rcvqueue; 1804 - struct sk_buff *skb; 1805 - 1806 - while (rcvq->head) { 1807 - skb = rcvq->head; 1808 - rcvq->head = rcvq->head->next; 1809 - dev_kfree_skb(skb); 1810 - } 1811 - rcvq->tail = NULL; 1812 - rcvq->head = NULL; 1813 - rcvq->count = 0; 1814 - } 1815 - 1816 - static struct sk_buff *slic_rcvqueue_getnext(struct adapter *adapter) 1817 - { 1818 - struct slic_rcvqueue *rcvq = &adapter->rcvqueue; 1819 - struct sk_buff *skb; 1820 - struct slic_rcvbuf *rcvbuf; 1821 - int count; 1822 - 1823 - if (rcvq->count) { 1824 - skb = rcvq->head; 1825 - rcvbuf = (struct slic_rcvbuf *)skb->head; 1826 - ASSERT(rcvbuf); 1827 - 1828 - if (rcvbuf->status & IRHDDR_SVALID) { 1829 - rcvq->head = rcvq->head->next; 1830 - skb->next = NULL; 1831 - rcvq->count--; 1832 - } else { 1833 - skb = NULL; 1834 - } 1835 - } else { 1836 - dev_err(&adapter->netdev->dev, 1837 - "RcvQ Empty!! rcvq[%p] count[%x]\n", rcvq, rcvq->count); 1838 - skb = NULL; 1839 - } 1840 - while (rcvq->count < SLIC_RCVQ_FILLTHRESH) { 1841 - count = slic_rcvqueue_fill(adapter); 1842 - if (!count) 1843 - break; 1844 - } 1845 - if (skb) 1846 - rcvq->errors = 0; 1847 - return skb; 1848 3390 } 1849 3391 1850 3392 static int slic_rcvqueue_fill(struct adapter *adapter) ··· 1859 3547 } 1860 3548 } 1861 3549 return i; 3550 + } 3551 + 3552 + static void slic_rcvqueue_free(struct adapter *adapter) 3553 + { 3554 + struct slic_rcvqueue *rcvq = &adapter->rcvqueue; 3555 + struct sk_buff *skb; 3556 + 3557 + while (rcvq->head) { 3558 + skb = rcvq->head; 3559 + rcvq->head = rcvq->head->next; 3560 + dev_kfree_skb(skb); 3561 + } 3562 + rcvq->tail = NULL; 3563 + rcvq->head = NULL; 3564 + rcvq->count = 0; 3565 + } 3566 + 3567 + static int slic_rcvqueue_init(struct adapter *adapter) 3568 + { 3569 + int i, count; 3570 + struct slic_rcvqueue *rcvq = &adapter->rcvqueue; 3571 + 3572 + ASSERT(adapter->state == ADAPT_DOWN); 3573 + rcvq->tail = NULL; 3574 + rcvq->head = NULL; 3575 + rcvq->size = SLIC_RCVQ_ENTRIES; 3576 + rcvq->errors = 0; 3577 + rcvq->count = 0; 3578 + i = (SLIC_RCVQ_ENTRIES / SLIC_RCVQ_FILLENTRIES); 3579 + count = 0; 3580 + while (i) { 3581 + count += slic_rcvqueue_fill(adapter); 3582 + i--; 3583 + } 3584 + if (rcvq->count < SLIC_RCVQ_MINENTRIES) { 3585 + slic_rcvqueue_free(adapter); 3586 + return -ENOMEM; 3587 + } 3588 + return 0; 3589 + } 3590 + 3591 + static struct sk_buff *slic_rcvqueue_getnext(struct adapter *adapter) 3592 + { 3593 + struct slic_rcvqueue *rcvq = &adapter->rcvqueue; 3594 + struct sk_buff *skb; 3595 + struct slic_rcvbuf *rcvbuf; 3596 + int count; 3597 + 3598 + if (rcvq->count) { 3599 + skb = rcvq->head; 3600 + rcvbuf = (struct slic_rcvbuf *)skb->head; 3601 + ASSERT(rcvbuf); 3602 + 3603 + if (rcvbuf->status & IRHDDR_SVALID) { 3604 + rcvq->head = rcvq->head->next; 3605 + skb->next = NULL; 3606 + rcvq->count--; 3607 + } else { 3608 + skb = NULL; 3609 + } 3610 + } else { 3611 + dev_err(&adapter->netdev->dev, 3612 + "RcvQ Empty!! rcvq[%p] count[%x]\n", rcvq, rcvq->count); 3613 + skb = NULL; 3614 + } 3615 + while (rcvq->count < SLIC_RCVQ_FILLTHRESH) { 3616 + count = slic_rcvqueue_fill(adapter); 3617 + if (!count) 3618 + break; 3619 + } 3620 + if (skb) 3621 + rcvq->errors = 0; 3622 + return skb; 1862 3623 } 1863 3624 1864 3625 static u32 slic_rcvqueue_reinsert(struct adapter *adapter, struct sk_buff *skb) ··· 2425 4040 } 2426 4041 } 2427 4042 2428 - /******************************************************************************/ 2429 - /**************** MODULE INITIATION / TERMINATION FUNCTIONS ***************/ 2430 - /******************************************************************************/ 4043 + /* 4044 + * slic_link_event_handler - 4045 + * 4046 + * Initiate a link configuration sequence. The link configuration begins 4047 + * by issuing a READ_LINK_STATUS command to the Utility Processor on the 4048 + * SLIC. Since the command finishes asynchronously, the slic_upr_comlete 4049 + * routine will follow it up witha UP configuration write command, which 4050 + * will also complete asynchronously. 4051 + * 4052 + */ 4053 + static void slic_link_event_handler(struct adapter *adapter) 4054 + { 4055 + int status; 4056 + struct slic_shmem *pshmem; 4057 + 4058 + if (adapter->state != ADAPT_UP) { 4059 + /* Adapter is not operational. Ignore. */ 4060 + return; 4061 + } 4062 + 4063 + pshmem = (struct slic_shmem *)adapter->phys_shmem; 4064 + 4065 + #if defined(CONFIG_X86_64) 4066 + status = slic_upr_request(adapter, 4067 + SLIC_UPR_RLSR, 4068 + SLIC_GET_ADDR_LOW(&pshmem->linkstatus), 4069 + SLIC_GET_ADDR_HIGH(&pshmem->linkstatus), 4070 + 0, 0); 4071 + #elif defined(CONFIG_X86) 4072 + status = slic_upr_request(adapter, SLIC_UPR_RLSR, 4073 + (u32) &pshmem->linkstatus, /* no 4GB wrap guaranteed */ 4074 + 0, 0, 0); 4075 + #else 4076 + Stop compilation; 4077 + #endif 4078 + ASSERT(status == 0); 4079 + } 4080 + 4081 + static void slic_init_cleanup(struct adapter *adapter) 4082 + { 4083 + if (adapter->intrregistered) { 4084 + adapter->intrregistered = 0; 4085 + free_irq(adapter->netdev->irq, adapter->netdev); 4086 + 4087 + } 4088 + if (adapter->pshmem) { 4089 + pci_free_consistent(adapter->pcidev, 4090 + sizeof(struct slic_shmem), 4091 + adapter->pshmem, adapter->phys_shmem); 4092 + adapter->pshmem = NULL; 4093 + adapter->phys_shmem = (dma_addr_t) NULL; 4094 + } 4095 + 4096 + if (adapter->pingtimerset) { 4097 + adapter->pingtimerset = 0; 4098 + del_timer(&adapter->pingtimer); 4099 + } 4100 + 4101 + slic_rspqueue_free(adapter); 4102 + slic_cmdq_free(adapter); 4103 + slic_rcvqueue_free(adapter); 4104 + } 4105 + 4106 + /* 4107 + * Allocate a mcast_address structure to hold the multicast address. 4108 + * Link it in. 4109 + */ 4110 + static int slic_mcast_add_list(struct adapter *adapter, char *address) 4111 + { 4112 + struct mcast_address *mcaddr, *mlist; 4113 + 4114 + /* Check to see if it already exists */ 4115 + mlist = adapter->mcastaddrs; 4116 + while (mlist) { 4117 + if (!compare_ether_addr(mlist->address, address)) 4118 + return 0; 4119 + mlist = mlist->next; 4120 + } 4121 + 4122 + /* Doesn't already exist. Allocate a structure to hold it */ 4123 + mcaddr = kmalloc(sizeof(struct mcast_address), GFP_ATOMIC); 4124 + if (mcaddr == NULL) 4125 + return 1; 4126 + 4127 + memcpy(mcaddr->address, address, 6); 4128 + 4129 + mcaddr->next = adapter->mcastaddrs; 4130 + adapter->mcastaddrs = mcaddr; 4131 + 4132 + return 0; 4133 + } 4134 + 4135 + static void slic_mcast_set_list(struct net_device *dev) 4136 + { 4137 + struct adapter *adapter = netdev_priv(dev); 4138 + int status = 0; 4139 + char *addresses; 4140 + struct netdev_hw_addr *ha; 4141 + 4142 + ASSERT(adapter); 4143 + 4144 + netdev_for_each_mc_addr(ha, dev) { 4145 + addresses = (char *) &ha->addr; 4146 + status = slic_mcast_add_list(adapter, addresses); 4147 + if (status != 0) 4148 + break; 4149 + slic_mcast_set_bit(adapter, addresses); 4150 + } 4151 + 4152 + if (adapter->devflags_prev != dev->flags) { 4153 + adapter->macopts = MAC_DIRECTED; 4154 + if (dev->flags) { 4155 + if (dev->flags & IFF_BROADCAST) 4156 + adapter->macopts |= MAC_BCAST; 4157 + if (dev->flags & IFF_PROMISC) 4158 + adapter->macopts |= MAC_PROMISC; 4159 + if (dev->flags & IFF_ALLMULTI) 4160 + adapter->macopts |= MAC_ALLMCAST; 4161 + if (dev->flags & IFF_MULTICAST) 4162 + adapter->macopts |= MAC_MCAST; 4163 + } 4164 + adapter->devflags_prev = dev->flags; 4165 + slic_config_set(adapter, true); 4166 + } else { 4167 + if (status == 0) 4168 + slic_mcast_set_mask(adapter); 4169 + } 4170 + return; 4171 + } 4172 + 4173 + #define XMIT_FAIL_LINK_STATE 1 4174 + #define XMIT_FAIL_ZERO_LENGTH 2 4175 + #define XMIT_FAIL_HOSTCMD_FAIL 3 4176 + 4177 + static void slic_xmit_build_request(struct adapter *adapter, 4178 + struct slic_hostcmd *hcmd, struct sk_buff *skb) 4179 + { 4180 + struct slic_host64_cmd *ihcmd; 4181 + ulong phys_addr; 4182 + 4183 + ihcmd = &hcmd->cmd64; 4184 + 4185 + ihcmd->flags = (adapter->port << IHFLG_IFSHFT); 4186 + ihcmd->command = IHCMD_XMT_REQ; 4187 + ihcmd->u.slic_buffers.totlen = skb->len; 4188 + phys_addr = pci_map_single(adapter->pcidev, skb->data, skb->len, 4189 + PCI_DMA_TODEVICE); 4190 + ihcmd->u.slic_buffers.bufs[0].paddrl = SLIC_GET_ADDR_LOW(phys_addr); 4191 + ihcmd->u.slic_buffers.bufs[0].paddrh = SLIC_GET_ADDR_HIGH(phys_addr); 4192 + ihcmd->u.slic_buffers.bufs[0].length = skb->len; 4193 + #if defined(CONFIG_X86_64) 4194 + hcmd->cmdsize = (u32) ((((u64)&ihcmd->u.slic_buffers.bufs[1] - 4195 + (u64) hcmd) + 31) >> 5); 4196 + #elif defined(CONFIG_X86) 4197 + hcmd->cmdsize = ((((u32) &ihcmd->u.slic_buffers.bufs[1] - 4198 + (u32) hcmd) + 31) >> 5); 4199 + #else 4200 + Stop Compilation; 4201 + #endif 4202 + } 4203 + 4204 + static void slic_xmit_fail(struct adapter *adapter, 4205 + struct sk_buff *skb, 4206 + void *cmd, u32 skbtype, u32 status) 4207 + { 4208 + if (adapter->xmitq_full) 4209 + netif_stop_queue(adapter->netdev); 4210 + if ((cmd == NULL) && (status <= XMIT_FAIL_HOSTCMD_FAIL)) { 4211 + switch (status) { 4212 + case XMIT_FAIL_LINK_STATE: 4213 + dev_err(&adapter->netdev->dev, 4214 + "reject xmit skb[%p: %x] linkstate[%s] " 4215 + "adapter[%s:%d] card[%s:%d]\n", 4216 + skb, skb->pkt_type, 4217 + SLIC_LINKSTATE(adapter->linkstate), 4218 + SLIC_ADAPTER_STATE(adapter->state), 4219 + adapter->state, 4220 + SLIC_CARD_STATE(adapter->card->state), 4221 + adapter->card->state); 4222 + break; 4223 + case XMIT_FAIL_ZERO_LENGTH: 4224 + dev_err(&adapter->netdev->dev, 4225 + "xmit_start skb->len == 0 skb[%p] type[%x]\n", 4226 + skb, skb->pkt_type); 4227 + break; 4228 + case XMIT_FAIL_HOSTCMD_FAIL: 4229 + dev_err(&adapter->netdev->dev, 4230 + "xmit_start skb[%p] type[%x] No host commands " 4231 + "available\n", skb, skb->pkt_type); 4232 + break; 4233 + default: 4234 + ASSERT(0); 4235 + } 4236 + } 4237 + dev_kfree_skb(skb); 4238 + adapter->stats.tx_dropped++; 4239 + } 4240 + 4241 + static void slic_rcv_handle_error(struct adapter *adapter, 4242 + struct slic_rcvbuf *rcvbuf) 4243 + { 4244 + struct slic_hddr_wds *hdr = (struct slic_hddr_wds *)rcvbuf->data; 4245 + 4246 + if (adapter->devid != SLIC_1GB_DEVICE_ID) { 4247 + if (hdr->frame_status14 & VRHSTAT_802OE) 4248 + adapter->if_events.oflow802++; 4249 + if (hdr->frame_status14 & VRHSTAT_TPOFLO) 4250 + adapter->if_events.Tprtoflow++; 4251 + if (hdr->frame_status_b14 & VRHSTATB_802UE) 4252 + adapter->if_events.uflow802++; 4253 + if (hdr->frame_status_b14 & VRHSTATB_RCVE) { 4254 + adapter->if_events.rcvearly++; 4255 + adapter->stats.rx_fifo_errors++; 4256 + } 4257 + if (hdr->frame_status_b14 & VRHSTATB_BUFF) { 4258 + adapter->if_events.Bufov++; 4259 + adapter->stats.rx_over_errors++; 4260 + } 4261 + if (hdr->frame_status_b14 & VRHSTATB_CARRE) { 4262 + adapter->if_events.Carre++; 4263 + adapter->stats.tx_carrier_errors++; 4264 + } 4265 + if (hdr->frame_status_b14 & VRHSTATB_LONGE) 4266 + adapter->if_events.Longe++; 4267 + if (hdr->frame_status_b14 & VRHSTATB_PREA) 4268 + adapter->if_events.Invp++; 4269 + if (hdr->frame_status_b14 & VRHSTATB_CRC) { 4270 + adapter->if_events.Crc++; 4271 + adapter->stats.rx_crc_errors++; 4272 + } 4273 + if (hdr->frame_status_b14 & VRHSTATB_DRBL) 4274 + adapter->if_events.Drbl++; 4275 + if (hdr->frame_status_b14 & VRHSTATB_CODE) 4276 + adapter->if_events.Code++; 4277 + if (hdr->frame_status_b14 & VRHSTATB_TPCSUM) 4278 + adapter->if_events.TpCsum++; 4279 + if (hdr->frame_status_b14 & VRHSTATB_TPHLEN) 4280 + adapter->if_events.TpHlen++; 4281 + if (hdr->frame_status_b14 & VRHSTATB_IPCSUM) 4282 + adapter->if_events.IpCsum++; 4283 + if (hdr->frame_status_b14 & VRHSTATB_IPLERR) 4284 + adapter->if_events.IpLen++; 4285 + if (hdr->frame_status_b14 & VRHSTATB_IPHERR) 4286 + adapter->if_events.IpHlen++; 4287 + } else { 4288 + if (hdr->frame_statusGB & VGBSTAT_XPERR) { 4289 + u32 xerr = hdr->frame_statusGB >> VGBSTAT_XERRSHFT; 4290 + 4291 + if (xerr == VGBSTAT_XCSERR) 4292 + adapter->if_events.TpCsum++; 4293 + if (xerr == VGBSTAT_XUFLOW) 4294 + adapter->if_events.Tprtoflow++; 4295 + if (xerr == VGBSTAT_XHLEN) 4296 + adapter->if_events.TpHlen++; 4297 + } 4298 + if (hdr->frame_statusGB & VGBSTAT_NETERR) { 4299 + u32 nerr = 4300 + (hdr-> 4301 + frame_statusGB >> VGBSTAT_NERRSHFT) & 4302 + VGBSTAT_NERRMSK; 4303 + if (nerr == VGBSTAT_NCSERR) 4304 + adapter->if_events.IpCsum++; 4305 + if (nerr == VGBSTAT_NUFLOW) 4306 + adapter->if_events.IpLen++; 4307 + if (nerr == VGBSTAT_NHLEN) 4308 + adapter->if_events.IpHlen++; 4309 + } 4310 + if (hdr->frame_statusGB & VGBSTAT_LNKERR) { 4311 + u32 lerr = hdr->frame_statusGB & VGBSTAT_LERRMSK; 4312 + 4313 + if (lerr == VGBSTAT_LDEARLY) 4314 + adapter->if_events.rcvearly++; 4315 + if (lerr == VGBSTAT_LBOFLO) 4316 + adapter->if_events.Bufov++; 4317 + if (lerr == VGBSTAT_LCODERR) 4318 + adapter->if_events.Code++; 4319 + if (lerr == VGBSTAT_LDBLNBL) 4320 + adapter->if_events.Drbl++; 4321 + if (lerr == VGBSTAT_LCRCERR) 4322 + adapter->if_events.Crc++; 4323 + if (lerr == VGBSTAT_LOFLO) 4324 + adapter->if_events.oflow802++; 4325 + if (lerr == VGBSTAT_LUFLO) 4326 + adapter->if_events.uflow802++; 4327 + } 4328 + } 4329 + return; 4330 + } 4331 + 4332 + #define TCP_OFFLOAD_FRAME_PUSHFLAG 0x10000000 4333 + #define M_FAST_PATH 0x0040 4334 + 4335 + static void slic_rcv_handler(struct adapter *adapter) 4336 + { 4337 + struct sk_buff *skb; 4338 + struct slic_rcvbuf *rcvbuf; 4339 + u32 frames = 0; 4340 + 4341 + while ((skb = slic_rcvqueue_getnext(adapter))) { 4342 + u32 rx_bytes; 4343 + 4344 + ASSERT(skb->head); 4345 + rcvbuf = (struct slic_rcvbuf *)skb->head; 4346 + adapter->card->events++; 4347 + if (rcvbuf->status & IRHDDR_ERR) { 4348 + adapter->rx_errors++; 4349 + slic_rcv_handle_error(adapter, rcvbuf); 4350 + slic_rcvqueue_reinsert(adapter, skb); 4351 + continue; 4352 + } 4353 + 4354 + if (!slic_mac_filter(adapter, (struct ether_header *) 4355 + rcvbuf->data)) { 4356 + slic_rcvqueue_reinsert(adapter, skb); 4357 + continue; 4358 + } 4359 + skb_pull(skb, SLIC_RCVBUF_HEADSIZE); 4360 + rx_bytes = (rcvbuf->length & IRHDDR_FLEN_MSK); 4361 + skb_put(skb, rx_bytes); 4362 + adapter->stats.rx_packets++; 4363 + adapter->stats.rx_bytes += rx_bytes; 4364 + #if SLIC_OFFLOAD_IP_CHECKSUM 4365 + skb->ip_summed = CHECKSUM_UNNECESSARY; 4366 + #endif 4367 + 4368 + skb->dev = adapter->netdev; 4369 + skb->protocol = eth_type_trans(skb, skb->dev); 4370 + netif_rx(skb); 4371 + 4372 + ++frames; 4373 + #if SLIC_INTERRUPT_PROCESS_LIMIT 4374 + if (frames >= SLIC_RCVQ_MAX_PROCESS_ISR) { 4375 + adapter->rcv_interrupt_yields++; 4376 + break; 4377 + } 4378 + #endif 4379 + } 4380 + adapter->max_isr_rcvs = max(adapter->max_isr_rcvs, frames); 4381 + } 4382 + 4383 + static void slic_xmit_complete(struct adapter *adapter) 4384 + { 4385 + struct slic_hostcmd *hcmd; 4386 + struct slic_rspbuf *rspbuf; 4387 + u32 frames = 0; 4388 + struct slic_handle_word slic_handle_word; 4389 + 4390 + do { 4391 + rspbuf = slic_rspqueue_getnext(adapter); 4392 + if (!rspbuf) 4393 + break; 4394 + adapter->xmit_completes++; 4395 + adapter->card->events++; 4396 + /* 4397 + Get the complete host command buffer 4398 + */ 4399 + slic_handle_word.handle_token = rspbuf->hosthandle; 4400 + ASSERT(slic_handle_word.handle_index); 4401 + ASSERT(slic_handle_word.handle_index <= SLIC_CMDQ_MAXCMDS); 4402 + hcmd = 4403 + (struct slic_hostcmd *) 4404 + adapter->slic_handles[slic_handle_word.handle_index]. 4405 + address; 4406 + /* hcmd = (struct slic_hostcmd *) rspbuf->hosthandle; */ 4407 + ASSERT(hcmd); 4408 + ASSERT(hcmd->pslic_handle == 4409 + &adapter->slic_handles[slic_handle_word.handle_index]); 4410 + if (hcmd->type == SLIC_CMD_DUMB) { 4411 + if (hcmd->skb) 4412 + dev_kfree_skb_irq(hcmd->skb); 4413 + slic_cmdq_putdone_irq(adapter, hcmd); 4414 + } 4415 + rspbuf->status = 0; 4416 + rspbuf->hosthandle = 0; 4417 + frames++; 4418 + } while (1); 4419 + adapter->max_isr_xmits = max(adapter->max_isr_xmits, frames); 4420 + } 4421 + 4422 + static irqreturn_t slic_interrupt(int irq, void *dev_id) 4423 + { 4424 + struct net_device *dev = (struct net_device *)dev_id; 4425 + struct adapter *adapter = netdev_priv(dev); 4426 + u32 isr; 4427 + 4428 + if ((adapter->pshmem) && (adapter->pshmem->isr)) { 4429 + slic_reg32_write(&adapter->slic_regs->slic_icr, 4430 + ICR_INT_MASK, FLUSH); 4431 + isr = adapter->isrcopy = adapter->pshmem->isr; 4432 + adapter->pshmem->isr = 0; 4433 + adapter->num_isrs++; 4434 + switch (adapter->card->state) { 4435 + case CARD_UP: 4436 + if (isr & ~ISR_IO) { 4437 + if (isr & ISR_ERR) { 4438 + adapter->error_interrupts++; 4439 + if (isr & ISR_RMISS) { 4440 + int count; 4441 + int pre_count; 4442 + int errors; 4443 + 4444 + struct slic_rcvqueue *rcvq = 4445 + &adapter->rcvqueue; 4446 + 4447 + adapter-> 4448 + error_rmiss_interrupts++; 4449 + if (!rcvq->errors) 4450 + rcv_count = rcvq->count; 4451 + pre_count = rcvq->count; 4452 + errors = rcvq->errors; 4453 + 4454 + while (rcvq->count < 4455 + SLIC_RCVQ_FILLTHRESH) { 4456 + count = 4457 + slic_rcvqueue_fill 4458 + (adapter); 4459 + if (!count) 4460 + break; 4461 + } 4462 + } else if (isr & ISR_XDROP) { 4463 + dev_err(&dev->dev, 4464 + "isr & ISR_ERR [%x] " 4465 + "ISR_XDROP \n", isr); 4466 + } else { 4467 + dev_err(&dev->dev, 4468 + "isr & ISR_ERR [%x]\n", 4469 + isr); 4470 + } 4471 + } 4472 + 4473 + if (isr & ISR_LEVENT) { 4474 + adapter->linkevent_interrupts++; 4475 + slic_link_event_handler(adapter); 4476 + } 4477 + 4478 + if ((isr & ISR_UPC) || 4479 + (isr & ISR_UPCERR) || (isr & ISR_UPCBSY)) { 4480 + adapter->upr_interrupts++; 4481 + slic_upr_request_complete(adapter, isr); 4482 + } 4483 + } 4484 + 4485 + if (isr & ISR_RCV) { 4486 + adapter->rcv_interrupts++; 4487 + slic_rcv_handler(adapter); 4488 + } 4489 + 4490 + if (isr & ISR_CMD) { 4491 + adapter->xmit_interrupts++; 4492 + slic_xmit_complete(adapter); 4493 + } 4494 + break; 4495 + 4496 + case CARD_DOWN: 4497 + if ((isr & ISR_UPC) || 4498 + (isr & ISR_UPCERR) || (isr & ISR_UPCBSY)) { 4499 + adapter->upr_interrupts++; 4500 + slic_upr_request_complete(adapter, isr); 4501 + } 4502 + break; 4503 + 4504 + default: 4505 + break; 4506 + } 4507 + 4508 + adapter->isrcopy = 0; 4509 + adapter->all_reg_writes += 2; 4510 + adapter->isr_reg_writes++; 4511 + slic_reg32_write(&adapter->slic_regs->slic_isr, 0, FLUSH); 4512 + } else { 4513 + adapter->false_interrupts++; 4514 + } 4515 + return IRQ_HANDLED; 4516 + } 4517 + 4518 + #define NORMAL_ETHFRAME 0 4519 + 4520 + static netdev_tx_t slic_xmit_start(struct sk_buff *skb, struct net_device *dev) 4521 + { 4522 + struct sliccard *card; 4523 + struct adapter *adapter = netdev_priv(dev); 4524 + struct slic_hostcmd *hcmd = NULL; 4525 + u32 status = 0; 4526 + u32 skbtype = NORMAL_ETHFRAME; 4527 + void *offloadcmd = NULL; 4528 + 4529 + card = adapter->card; 4530 + ASSERT(card); 4531 + if ((adapter->linkstate != LINK_UP) || 4532 + (adapter->state != ADAPT_UP) || (card->state != CARD_UP)) { 4533 + status = XMIT_FAIL_LINK_STATE; 4534 + goto xmit_fail; 4535 + 4536 + } else if (skb->len == 0) { 4537 + status = XMIT_FAIL_ZERO_LENGTH; 4538 + goto xmit_fail; 4539 + } 4540 + 4541 + if (skbtype == NORMAL_ETHFRAME) { 4542 + hcmd = slic_cmdq_getfree(adapter); 4543 + if (!hcmd) { 4544 + adapter->xmitq_full = 1; 4545 + status = XMIT_FAIL_HOSTCMD_FAIL; 4546 + goto xmit_fail; 4547 + } 4548 + ASSERT(hcmd->pslic_handle); 4549 + ASSERT(hcmd->cmd64.hosthandle == 4550 + hcmd->pslic_handle->token.handle_token); 4551 + hcmd->skb = skb; 4552 + hcmd->busy = 1; 4553 + hcmd->type = SLIC_CMD_DUMB; 4554 + if (skbtype == NORMAL_ETHFRAME) 4555 + slic_xmit_build_request(adapter, hcmd, skb); 4556 + } 4557 + adapter->stats.tx_packets++; 4558 + adapter->stats.tx_bytes += skb->len; 4559 + 4560 + #ifdef DEBUG_DUMP 4561 + if (adapter->kill_card) { 4562 + struct slic_host64_cmd ihcmd; 4563 + 4564 + ihcmd = &hcmd->cmd64; 4565 + 4566 + ihcmd->flags |= 0x40; 4567 + adapter->kill_card = 0; /* only do this once */ 4568 + } 4569 + #endif 4570 + if (hcmd->paddrh == 0) { 4571 + slic_reg32_write(&adapter->slic_regs->slic_cbar, 4572 + (hcmd->paddrl | hcmd->cmdsize), DONT_FLUSH); 4573 + } else { 4574 + slic_reg64_write(adapter, &adapter->slic_regs->slic_cbar64, 4575 + (hcmd->paddrl | hcmd->cmdsize), 4576 + &adapter->slic_regs->slic_addr_upper, 4577 + hcmd->paddrh, DONT_FLUSH); 4578 + } 4579 + xmit_done: 4580 + return NETDEV_TX_OK; 4581 + xmit_fail: 4582 + slic_xmit_fail(adapter, skb, offloadcmd, skbtype, status); 4583 + goto xmit_done; 4584 + } 4585 + 4586 + 4587 + static void slic_adapter_freeresources(struct adapter *adapter) 4588 + { 4589 + slic_init_cleanup(adapter); 4590 + memset(&adapter->stats, 0, sizeof(struct net_device_stats)); 4591 + adapter->error_interrupts = 0; 4592 + adapter->rcv_interrupts = 0; 4593 + adapter->xmit_interrupts = 0; 4594 + adapter->linkevent_interrupts = 0; 4595 + adapter->upr_interrupts = 0; 4596 + adapter->num_isrs = 0; 4597 + adapter->xmit_completes = 0; 4598 + adapter->rcv_broadcasts = 0; 4599 + adapter->rcv_multicasts = 0; 4600 + adapter->rcv_unicasts = 0; 4601 + } 4602 + 4603 + static int slic_adapter_allocresources(struct adapter *adapter) 4604 + { 4605 + if (!adapter->intrregistered) { 4606 + int retval; 4607 + 4608 + spin_unlock_irqrestore(&slic_global.driver_lock.lock, 4609 + slic_global.driver_lock.flags); 4610 + 4611 + retval = request_irq(adapter->netdev->irq, 4612 + &slic_interrupt, 4613 + IRQF_SHARED, 4614 + adapter->netdev->name, adapter->netdev); 4615 + 4616 + spin_lock_irqsave(&slic_global.driver_lock.lock, 4617 + slic_global.driver_lock.flags); 4618 + 4619 + if (retval) { 4620 + dev_err(&adapter->netdev->dev, 4621 + "request_irq (%s) FAILED [%x]\n", 4622 + adapter->netdev->name, retval); 4623 + return retval; 4624 + } 4625 + adapter->intrregistered = 1; 4626 + } 4627 + return 0; 4628 + } 4629 + 4630 + /* 4631 + * slic_if_init 4632 + * 4633 + * Perform initialization of our slic interface. 4634 + * 4635 + */ 4636 + static int slic_if_init(struct adapter *adapter) 4637 + { 4638 + struct sliccard *card = adapter->card; 4639 + struct net_device *dev = adapter->netdev; 4640 + __iomem struct slic_regs *slic_regs = adapter->slic_regs; 4641 + struct slic_shmem *pshmem; 4642 + int rc; 4643 + 4644 + ASSERT(card); 4645 + 4646 + /* adapter should be down at this point */ 4647 + if (adapter->state != ADAPT_DOWN) { 4648 + dev_err(&dev->dev, "%s: adapter->state != ADAPT_DOWN\n", 4649 + __func__); 4650 + rc = -EIO; 4651 + goto err; 4652 + } 4653 + ASSERT(adapter->linkstate == LINK_DOWN); 4654 + 4655 + adapter->devflags_prev = dev->flags; 4656 + adapter->macopts = MAC_DIRECTED; 4657 + if (dev->flags) { 4658 + if (dev->flags & IFF_BROADCAST) 4659 + adapter->macopts |= MAC_BCAST; 4660 + if (dev->flags & IFF_PROMISC) 4661 + adapter->macopts |= MAC_PROMISC; 4662 + if (dev->flags & IFF_ALLMULTI) 4663 + adapter->macopts |= MAC_ALLMCAST; 4664 + if (dev->flags & IFF_MULTICAST) 4665 + adapter->macopts |= MAC_MCAST; 4666 + } 4667 + rc = slic_adapter_allocresources(adapter); 4668 + if (rc) { 4669 + dev_err(&dev->dev, 4670 + "%s: slic_adapter_allocresources FAILED %x\n", 4671 + __func__, rc); 4672 + slic_adapter_freeresources(adapter); 4673 + goto err; 4674 + } 4675 + 4676 + if (!adapter->queues_initialized) { 4677 + if ((rc = slic_rspqueue_init(adapter))) 4678 + goto err; 4679 + if ((rc = slic_cmdq_init(adapter))) 4680 + goto err; 4681 + if ((rc = slic_rcvqueue_init(adapter))) 4682 + goto err; 4683 + adapter->queues_initialized = 1; 4684 + } 4685 + 4686 + slic_reg32_write(&slic_regs->slic_icr, ICR_INT_OFF, FLUSH); 4687 + mdelay(1); 4688 + 4689 + if (!adapter->isp_initialized) { 4690 + pshmem = (struct slic_shmem *)adapter->phys_shmem; 4691 + 4692 + spin_lock_irqsave(&adapter->bit64reglock.lock, 4693 + adapter->bit64reglock.flags); 4694 + 4695 + #if defined(CONFIG_X86_64) 4696 + slic_reg32_write(&slic_regs->slic_addr_upper, 4697 + SLIC_GET_ADDR_HIGH(&pshmem->isr), DONT_FLUSH); 4698 + slic_reg32_write(&slic_regs->slic_isp, 4699 + SLIC_GET_ADDR_LOW(&pshmem->isr), FLUSH); 4700 + #elif defined(CONFIG_X86) 4701 + slic_reg32_write(&slic_regs->slic_addr_upper, 0, DONT_FLUSH); 4702 + slic_reg32_write(&slic_regs->slic_isp, (u32)&pshmem->isr, FLUSH); 4703 + #else 4704 + Stop Compilations 4705 + #endif 4706 + spin_unlock_irqrestore(&adapter->bit64reglock.lock, 4707 + adapter->bit64reglock.flags); 4708 + adapter->isp_initialized = 1; 4709 + } 4710 + 4711 + adapter->state = ADAPT_UP; 4712 + if (!card->loadtimerset) { 4713 + init_timer(&card->loadtimer); 4714 + card->loadtimer.expires = 4715 + jiffies + (SLIC_LOADTIMER_PERIOD * HZ); 4716 + card->loadtimer.data = (ulong) card; 4717 + card->loadtimer.function = &slic_timer_load_check; 4718 + add_timer(&card->loadtimer); 4719 + 4720 + card->loadtimerset = 1; 4721 + } 4722 + 4723 + if (!adapter->pingtimerset) { 4724 + init_timer(&adapter->pingtimer); 4725 + adapter->pingtimer.expires = 4726 + jiffies + (PING_TIMER_INTERVAL * HZ); 4727 + adapter->pingtimer.data = (ulong) dev; 4728 + adapter->pingtimer.function = &slic_timer_ping; 4729 + add_timer(&adapter->pingtimer); 4730 + adapter->pingtimerset = 1; 4731 + adapter->card->pingstatus = ISR_PINGMASK; 4732 + } 4733 + 4734 + /* 4735 + * clear any pending events, then enable interrupts 4736 + */ 4737 + adapter->isrcopy = 0; 4738 + adapter->pshmem->isr = 0; 4739 + slic_reg32_write(&slic_regs->slic_isr, 0, FLUSH); 4740 + slic_reg32_write(&slic_regs->slic_icr, ICR_INT_ON, FLUSH); 4741 + 4742 + slic_link_config(adapter, LINK_AUTOSPEED, LINK_AUTOD); 4743 + slic_link_event_handler(adapter); 4744 + 4745 + err: 4746 + return rc; 4747 + } 4748 + 4749 + static int slic_entry_open(struct net_device *dev) 4750 + { 4751 + struct adapter *adapter = netdev_priv(dev); 4752 + struct sliccard *card = adapter->card; 4753 + u32 locked = 0; 4754 + int status; 4755 + 4756 + ASSERT(adapter); 4757 + ASSERT(card); 4758 + 4759 + netif_stop_queue(adapter->netdev); 4760 + 4761 + spin_lock_irqsave(&slic_global.driver_lock.lock, 4762 + slic_global.driver_lock.flags); 4763 + locked = 1; 4764 + if (!adapter->activated) { 4765 + card->adapters_activated++; 4766 + slic_global.num_slic_ports_active++; 4767 + adapter->activated = 1; 4768 + } 4769 + status = slic_if_init(adapter); 4770 + 4771 + if (status != 0) { 4772 + if (adapter->activated) { 4773 + card->adapters_activated--; 4774 + slic_global.num_slic_ports_active--; 4775 + adapter->activated = 0; 4776 + } 4777 + if (locked) { 4778 + spin_unlock_irqrestore(&slic_global.driver_lock.lock, 4779 + slic_global.driver_lock.flags); 4780 + locked = 0; 4781 + } 4782 + return status; 4783 + } 4784 + if (!card->master) 4785 + card->master = adapter; 4786 + 4787 + if (locked) { 4788 + spin_unlock_irqrestore(&slic_global.driver_lock.lock, 4789 + slic_global.driver_lock.flags); 4790 + locked = 0; 4791 + } 4792 + 4793 + return 0; 4794 + } 4795 + 4796 + static void slic_card_cleanup(struct sliccard *card) 4797 + { 4798 + if (card->loadtimerset) { 4799 + card->loadtimerset = 0; 4800 + del_timer(&card->loadtimer); 4801 + } 4802 + 4803 + slic_debug_card_destroy(card); 4804 + 4805 + kfree(card); 4806 + } 4807 + 4808 + static void __devexit slic_entry_remove(struct pci_dev *pcidev) 4809 + { 4810 + struct net_device *dev = pci_get_drvdata(pcidev); 4811 + u32 mmio_start = 0; 4812 + uint mmio_len = 0; 4813 + struct adapter *adapter = netdev_priv(dev); 4814 + struct sliccard *card; 4815 + struct mcast_address *mcaddr, *mlist; 4816 + 4817 + ASSERT(adapter); 4818 + slic_adapter_freeresources(adapter); 4819 + slic_unmap_mmio_space(adapter); 4820 + unregister_netdev(dev); 4821 + 4822 + mmio_start = pci_resource_start(pcidev, 0); 4823 + mmio_len = pci_resource_len(pcidev, 0); 4824 + 4825 + release_mem_region(mmio_start, mmio_len); 4826 + 4827 + iounmap((void __iomem *)dev->base_addr); 4828 + /* free multicast addresses */ 4829 + mlist = adapter->mcastaddrs; 4830 + while (mlist) { 4831 + mcaddr = mlist; 4832 + mlist = mlist->next; 4833 + kfree(mcaddr); 4834 + } 4835 + ASSERT(adapter->card); 4836 + card = adapter->card; 4837 + ASSERT(card->adapters_allocated); 4838 + card->adapters_allocated--; 4839 + adapter->allocated = 0; 4840 + if (!card->adapters_allocated) { 4841 + struct sliccard *curr_card = slic_global.slic_card; 4842 + if (curr_card == card) { 4843 + slic_global.slic_card = card->next; 4844 + } else { 4845 + while (curr_card->next != card) 4846 + curr_card = curr_card->next; 4847 + ASSERT(curr_card); 4848 + curr_card->next = card->next; 4849 + } 4850 + ASSERT(slic_global.num_slic_cards); 4851 + slic_global.num_slic_cards--; 4852 + slic_card_cleanup(card); 4853 + } 4854 + kfree(dev); 4855 + pci_release_regions(pcidev); 4856 + } 4857 + 4858 + static int slic_entry_halt(struct net_device *dev) 4859 + { 4860 + struct adapter *adapter = netdev_priv(dev); 4861 + struct sliccard *card = adapter->card; 4862 + __iomem struct slic_regs *slic_regs = adapter->slic_regs; 4863 + 4864 + spin_lock_irqsave(&slic_global.driver_lock.lock, 4865 + slic_global.driver_lock.flags); 4866 + ASSERT(card); 4867 + netif_stop_queue(adapter->netdev); 4868 + adapter->state = ADAPT_DOWN; 4869 + adapter->linkstate = LINK_DOWN; 4870 + adapter->upr_list = NULL; 4871 + adapter->upr_busy = 0; 4872 + adapter->devflags_prev = 0; 4873 + ASSERT(card->adapter[adapter->cardindex] == adapter); 4874 + slic_reg32_write(&slic_regs->slic_icr, ICR_INT_OFF, FLUSH); 4875 + adapter->all_reg_writes++; 4876 + adapter->icr_reg_writes++; 4877 + slic_config_clear(adapter); 4878 + if (adapter->activated) { 4879 + card->adapters_activated--; 4880 + slic_global.num_slic_ports_active--; 4881 + adapter->activated = 0; 4882 + } 4883 + #ifdef AUTOMATIC_RESET 4884 + slic_reg32_write(&slic_regs->slic_reset_iface, 0, FLUSH); 4885 + #endif 4886 + /* 4887 + * Reset the adapter's cmd queues 4888 + */ 4889 + slic_cmdq_reset(adapter); 4890 + 4891 + #ifdef AUTOMATIC_RESET 4892 + if (!card->adapters_activated) 4893 + slic_card_init(card, adapter); 4894 + #endif 4895 + 4896 + spin_unlock_irqrestore(&slic_global.driver_lock.lock, 4897 + slic_global.driver_lock.flags); 4898 + return 0; 4899 + } 4900 + 4901 + static struct net_device_stats *slic_get_stats(struct net_device *dev) 4902 + { 4903 + struct adapter *adapter = netdev_priv(dev); 4904 + 4905 + ASSERT(adapter); 4906 + dev->stats.collisions = adapter->slic_stats.iface.xmit_collisions; 4907 + dev->stats.rx_errors = adapter->slic_stats.iface.rcv_errors; 4908 + dev->stats.tx_errors = adapter->slic_stats.iface.xmt_errors; 4909 + dev->stats.rx_missed_errors = adapter->slic_stats.iface.rcv_discards; 4910 + dev->stats.tx_heartbeat_errors = 0; 4911 + dev->stats.tx_aborted_errors = 0; 4912 + dev->stats.tx_window_errors = 0; 4913 + dev->stats.tx_fifo_errors = 0; 4914 + dev->stats.rx_frame_errors = 0; 4915 + dev->stats.rx_length_errors = 0; 4916 + 4917 + return &dev->stats; 4918 + } 4919 + 4920 + static int slic_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) 4921 + { 4922 + struct adapter *adapter = netdev_priv(dev); 4923 + struct ethtool_cmd edata; 4924 + struct ethtool_cmd ecmd; 4925 + u32 data[7]; 4926 + u32 intagg; 4927 + 4928 + ASSERT(rq); 4929 + switch (cmd) { 4930 + case SIOCSLICSETINTAGG: 4931 + if (copy_from_user(data, rq->ifr_data, 28)) 4932 + return -EFAULT; 4933 + intagg = data[0]; 4934 + dev_err(&dev->dev, "%s: set interrupt aggregation to %d\n", 4935 + __func__, intagg); 4936 + slic_intagg_set(adapter, intagg); 4937 + return 0; 4938 + 4939 + #ifdef SLIC_TRACE_DUMP_ENABLED 4940 + case SIOCSLICTRACEDUMP: 4941 + { 4942 + u32 value; 4943 + DBG_IOCTL("slic_ioctl SIOCSLIC_TRACE_DUMP\n"); 4944 + 4945 + if (copy_from_user(data, rq->ifr_data, 28)) { 4946 + PRINT_ERROR 4947 + ("slic: copy_from_user FAILED getting initial simba param\n"); 4948 + return -EFAULT; 4949 + } 4950 + 4951 + value = data[0]; 4952 + if (tracemon_request == SLIC_DUMP_DONE) { 4953 + PRINT_ERROR 4954 + ("ATK Diagnostic Trace Dump Requested\n"); 4955 + tracemon_request = SLIC_DUMP_REQUESTED; 4956 + tracemon_request_type = value; 4957 + tracemon_timestamp = jiffies; 4958 + } else if ((tracemon_request == SLIC_DUMP_REQUESTED) || 4959 + (tracemon_request == 4960 + SLIC_DUMP_IN_PROGRESS)) { 4961 + PRINT_ERROR 4962 + ("ATK Diagnostic Trace Dump Requested but already in progress... ignore\n"); 4963 + } else { 4964 + PRINT_ERROR 4965 + ("ATK Diagnostic Trace Dump Requested\n"); 4966 + tracemon_request = SLIC_DUMP_REQUESTED; 4967 + tracemon_request_type = value; 4968 + tracemon_timestamp = jiffies; 4969 + } 4970 + return 0; 4971 + } 4972 + #endif 4973 + case SIOCETHTOOL: 4974 + ASSERT(adapter); 4975 + if (copy_from_user(&ecmd, rq->ifr_data, sizeof(ecmd))) 4976 + return -EFAULT; 4977 + 4978 + if (ecmd.cmd == ETHTOOL_GSET) { 4979 + edata.supported = (SUPPORTED_10baseT_Half | 4980 + SUPPORTED_10baseT_Full | 4981 + SUPPORTED_100baseT_Half | 4982 + SUPPORTED_100baseT_Full | 4983 + SUPPORTED_Autoneg | SUPPORTED_MII); 4984 + edata.port = PORT_MII; 4985 + edata.transceiver = XCVR_INTERNAL; 4986 + edata.phy_address = 0; 4987 + if (adapter->linkspeed == LINK_100MB) 4988 + edata.speed = SPEED_100; 4989 + else if (adapter->linkspeed == LINK_10MB) 4990 + edata.speed = SPEED_10; 4991 + else 4992 + edata.speed = 0; 4993 + 4994 + if (adapter->linkduplex == LINK_FULLD) 4995 + edata.duplex = DUPLEX_FULL; 4996 + else 4997 + edata.duplex = DUPLEX_HALF; 4998 + 4999 + edata.autoneg = AUTONEG_ENABLE; 5000 + edata.maxtxpkt = 1; 5001 + edata.maxrxpkt = 1; 5002 + if (copy_to_user(rq->ifr_data, &edata, sizeof(edata))) 5003 + return -EFAULT; 5004 + 5005 + } else if (ecmd.cmd == ETHTOOL_SSET) { 5006 + if (!capable(CAP_NET_ADMIN)) 5007 + return -EPERM; 5008 + 5009 + if (adapter->linkspeed == LINK_100MB) 5010 + edata.speed = SPEED_100; 5011 + else if (adapter->linkspeed == LINK_10MB) 5012 + edata.speed = SPEED_10; 5013 + else 5014 + edata.speed = 0; 5015 + 5016 + if (adapter->linkduplex == LINK_FULLD) 5017 + edata.duplex = DUPLEX_FULL; 5018 + else 5019 + edata.duplex = DUPLEX_HALF; 5020 + 5021 + edata.autoneg = AUTONEG_ENABLE; 5022 + edata.maxtxpkt = 1; 5023 + edata.maxrxpkt = 1; 5024 + if ((ecmd.speed != edata.speed) || 5025 + (ecmd.duplex != edata.duplex)) { 5026 + u32 speed; 5027 + u32 duplex; 5028 + 5029 + if (ecmd.speed == SPEED_10) 5030 + speed = 0; 5031 + else 5032 + speed = PCR_SPEED_100; 5033 + if (ecmd.duplex == DUPLEX_FULL) 5034 + duplex = PCR_DUPLEX_FULL; 5035 + else 5036 + duplex = 0; 5037 + slic_link_config(adapter, speed, duplex); 5038 + slic_link_event_handler(adapter); 5039 + } 5040 + } 5041 + return 0; 5042 + default: 5043 + return -EOPNOTSUPP; 5044 + } 5045 + } 5046 + 5047 + static void slic_config_pci(struct pci_dev *pcidev) 5048 + { 5049 + u16 pci_command; 5050 + u16 new_command; 5051 + 5052 + pci_read_config_word(pcidev, PCI_COMMAND, &pci_command); 5053 + 5054 + new_command = pci_command | PCI_COMMAND_MASTER 5055 + | PCI_COMMAND_MEMORY 5056 + | PCI_COMMAND_INVALIDATE 5057 + | PCI_COMMAND_PARITY | PCI_COMMAND_SERR | PCI_COMMAND_FAST_BACK; 5058 + if (pci_command != new_command) 5059 + pci_write_config_word(pcidev, PCI_COMMAND, new_command); 5060 + } 5061 + 5062 + static int slic_card_init(struct sliccard *card, struct adapter *adapter) 5063 + { 5064 + __iomem struct slic_regs *slic_regs = adapter->slic_regs; 5065 + struct slic_eeprom *peeprom; 5066 + struct oslic_eeprom *pOeeprom; 5067 + dma_addr_t phys_config; 5068 + u32 phys_configh; 5069 + u32 phys_configl; 5070 + u32 i = 0; 5071 + struct slic_shmem *pshmem; 5072 + int status; 5073 + uint macaddrs = card->card_size; 5074 + ushort eecodesize; 5075 + ushort dramsize; 5076 + ushort ee_chksum; 5077 + ushort calc_chksum; 5078 + struct slic_config_mac *pmac; 5079 + unsigned char fruformat; 5080 + unsigned char oemfruformat; 5081 + struct atk_fru *patkfru; 5082 + union oemfru *poemfru; 5083 + 5084 + /* Reset everything except PCI configuration space */ 5085 + slic_soft_reset(adapter); 5086 + 5087 + /* Download the microcode */ 5088 + status = slic_card_download(adapter); 5089 + 5090 + if (status != 0) { 5091 + dev_err(&adapter->pcidev->dev, 5092 + "download failed bus %d slot %d\n", 5093 + adapter->busnumber, adapter->slotnumber); 5094 + return status; 5095 + } 5096 + 5097 + if (!card->config_set) { 5098 + peeprom = pci_alloc_consistent(adapter->pcidev, 5099 + sizeof(struct slic_eeprom), 5100 + &phys_config); 5101 + 5102 + phys_configl = SLIC_GET_ADDR_LOW(phys_config); 5103 + phys_configh = SLIC_GET_ADDR_HIGH(phys_config); 5104 + 5105 + if (!peeprom) { 5106 + dev_err(&adapter->pcidev->dev, 5107 + "eeprom read failed to get memory " 5108 + "bus %d slot %d\n", adapter->busnumber, 5109 + adapter->slotnumber); 5110 + return -ENOMEM; 5111 + } else { 5112 + memset(peeprom, 0, sizeof(struct slic_eeprom)); 5113 + } 5114 + slic_reg32_write(&slic_regs->slic_icr, ICR_INT_OFF, FLUSH); 5115 + mdelay(1); 5116 + pshmem = (struct slic_shmem *)adapter->phys_shmem; 5117 + 5118 + spin_lock_irqsave(&adapter->bit64reglock.lock, 5119 + adapter->bit64reglock.flags); 5120 + slic_reg32_write(&slic_regs->slic_addr_upper, 0, DONT_FLUSH); 5121 + slic_reg32_write(&slic_regs->slic_isp, 5122 + SLIC_GET_ADDR_LOW(&pshmem->isr), FLUSH); 5123 + spin_unlock_irqrestore(&adapter->bit64reglock.lock, 5124 + adapter->bit64reglock.flags); 5125 + 5126 + slic_config_get(adapter, phys_configl, phys_configh); 5127 + 5128 + for (;;) { 5129 + if (adapter->pshmem->isr) { 5130 + if (adapter->pshmem->isr & ISR_UPC) { 5131 + adapter->pshmem->isr = 0; 5132 + slic_reg64_write(adapter, 5133 + &slic_regs->slic_isp, 0, 5134 + &slic_regs->slic_addr_upper, 5135 + 0, FLUSH); 5136 + slic_reg32_write(&slic_regs->slic_isr, 5137 + 0, FLUSH); 5138 + 5139 + slic_upr_request_complete(adapter, 0); 5140 + break; 5141 + } else { 5142 + adapter->pshmem->isr = 0; 5143 + slic_reg32_write(&slic_regs->slic_isr, 5144 + 0, FLUSH); 5145 + } 5146 + } else { 5147 + mdelay(1); 5148 + i++; 5149 + if (i > 5000) { 5150 + dev_err(&adapter->pcidev->dev, 5151 + "%d config data fetch timed out!\n", 5152 + adapter->port); 5153 + slic_reg64_write(adapter, 5154 + &slic_regs->slic_isp, 0, 5155 + &slic_regs->slic_addr_upper, 5156 + 0, FLUSH); 5157 + return -EINVAL; 5158 + } 5159 + } 5160 + } 5161 + 5162 + switch (adapter->devid) { 5163 + /* Oasis card */ 5164 + case SLIC_2GB_DEVICE_ID: 5165 + /* extract EEPROM data and pointers to EEPROM data */ 5166 + pOeeprom = (struct oslic_eeprom *) peeprom; 5167 + eecodesize = pOeeprom->EecodeSize; 5168 + dramsize = pOeeprom->DramSize; 5169 + pmac = pOeeprom->MacInfo; 5170 + fruformat = pOeeprom->FruFormat; 5171 + patkfru = &pOeeprom->AtkFru; 5172 + oemfruformat = pOeeprom->OemFruFormat; 5173 + poemfru = &pOeeprom->OemFru; 5174 + macaddrs = 2; 5175 + /* Minor kludge for Oasis card 5176 + get 2 MAC addresses from the 5177 + EEPROM to ensure that function 1 5178 + gets the Port 1 MAC address */ 5179 + break; 5180 + default: 5181 + /* extract EEPROM data and pointers to EEPROM data */ 5182 + eecodesize = peeprom->EecodeSize; 5183 + dramsize = peeprom->DramSize; 5184 + pmac = peeprom->u2.mac.MacInfo; 5185 + fruformat = peeprom->FruFormat; 5186 + patkfru = &peeprom->AtkFru; 5187 + oemfruformat = peeprom->OemFruFormat; 5188 + poemfru = &peeprom->OemFru; 5189 + break; 5190 + } 5191 + 5192 + card->config.EepromValid = false; 5193 + 5194 + /* see if the EEPROM is valid by checking it's checksum */ 5195 + if ((eecodesize <= MAX_EECODE_SIZE) && 5196 + (eecodesize >= MIN_EECODE_SIZE)) { 5197 + 5198 + ee_chksum = 5199 + *(u16 *) ((char *) peeprom + (eecodesize - 2)); 5200 + /* 5201 + calculate the EEPROM checksum 5202 + */ 5203 + calc_chksum = 5204 + ~slic_eeprom_cksum((char *) peeprom, 5205 + (eecodesize - 2)); 5206 + /* 5207 + if the ucdoe chksum flag bit worked, 5208 + we wouldn't need this shit 5209 + */ 5210 + if (ee_chksum == calc_chksum) 5211 + card->config.EepromValid = true; 5212 + } 5213 + /* copy in the DRAM size */ 5214 + card->config.DramSize = dramsize; 5215 + 5216 + /* copy in the MAC address(es) */ 5217 + for (i = 0; i < macaddrs; i++) { 5218 + memcpy(&card->config.MacInfo[i], 5219 + &pmac[i], sizeof(struct slic_config_mac)); 5220 + } 5221 + 5222 + /* copy the Alacritech FRU information */ 5223 + card->config.FruFormat = fruformat; 5224 + memcpy(&card->config.AtkFru, patkfru, 5225 + sizeof(struct atk_fru)); 5226 + 5227 + pci_free_consistent(adapter->pcidev, 5228 + sizeof(struct slic_eeprom), 5229 + peeprom, phys_config); 5230 + 5231 + if ((!card->config.EepromValid) && 5232 + (adapter->reg_params.fail_on_bad_eeprom)) { 5233 + slic_reg64_write(adapter, &slic_regs->slic_isp, 0, 5234 + &slic_regs->slic_addr_upper, 5235 + 0, FLUSH); 5236 + dev_err(&adapter->pcidev->dev, 5237 + "unsupported CONFIGURATION EEPROM invalid\n"); 5238 + return -EINVAL; 5239 + } 5240 + 5241 + card->config_set = 1; 5242 + } 5243 + 5244 + if (slic_card_download_gbrcv(adapter)) { 5245 + dev_err(&adapter->pcidev->dev, 5246 + "unable to download GB receive microcode\n"); 5247 + return -EINVAL; 5248 + } 5249 + 5250 + if (slic_global.dynamic_intagg) 5251 + slic_intagg_set(adapter, 0); 5252 + else 5253 + slic_intagg_set(adapter, intagg_delay); 5254 + 5255 + /* 5256 + * Initialize ping status to "ok" 5257 + */ 5258 + card->pingstatus = ISR_PINGMASK; 5259 + 5260 + /* 5261 + * Lastly, mark our card state as up and return success 5262 + */ 5263 + card->state = CARD_UP; 5264 + card->reset_in_progress = 0; 5265 + 5266 + return 0; 5267 + } 5268 + 5269 + static void slic_init_driver(void) 5270 + { 5271 + if (slic_first_init) { 5272 + slic_first_init = 0; 5273 + spin_lock_init(&slic_global.driver_lock.lock); 5274 + slic_debug_init(); 5275 + } 5276 + } 5277 + 5278 + static void slic_init_adapter(struct net_device *netdev, 5279 + struct pci_dev *pcidev, 5280 + const struct pci_device_id *pci_tbl_entry, 5281 + void __iomem *memaddr, int chip_idx) 5282 + { 5283 + ushort index; 5284 + struct slic_handle *pslic_handle; 5285 + struct adapter *adapter = netdev_priv(netdev); 5286 + 5287 + /* adapter->pcidev = pcidev;*/ 5288 + adapter->vendid = pci_tbl_entry->vendor; 5289 + adapter->devid = pci_tbl_entry->device; 5290 + adapter->subsysid = pci_tbl_entry->subdevice; 5291 + adapter->busnumber = pcidev->bus->number; 5292 + adapter->slotnumber = ((pcidev->devfn >> 3) & 0x1F); 5293 + adapter->functionnumber = (pcidev->devfn & 0x7); 5294 + adapter->memorylength = pci_resource_len(pcidev, 0); 5295 + adapter->slic_regs = (__iomem struct slic_regs *)memaddr; 5296 + adapter->irq = pcidev->irq; 5297 + /* adapter->netdev = netdev;*/ 5298 + adapter->next_netdevice = head_netdevice; 5299 + head_netdevice = netdev; 5300 + adapter->chipid = chip_idx; 5301 + adapter->port = 0; /*adapter->functionnumber;*/ 5302 + adapter->cardindex = adapter->port; 5303 + adapter->memorybase = memaddr; 5304 + spin_lock_init(&adapter->upr_lock.lock); 5305 + spin_lock_init(&adapter->bit64reglock.lock); 5306 + spin_lock_init(&adapter->adapter_lock.lock); 5307 + spin_lock_init(&adapter->reset_lock.lock); 5308 + spin_lock_init(&adapter->handle_lock.lock); 5309 + 5310 + adapter->card_size = 1; 5311 + /* 5312 + Initialize slic_handle array 5313 + */ 5314 + ASSERT(SLIC_CMDQ_MAXCMDS <= 0xFFFF); 5315 + /* 5316 + Start with 1. 0 is an invalid host handle. 5317 + */ 5318 + for (index = 1, pslic_handle = &adapter->slic_handles[1]; 5319 + index < SLIC_CMDQ_MAXCMDS; index++, pslic_handle++) { 5320 + 5321 + pslic_handle->token.handle_index = index; 5322 + pslic_handle->type = SLIC_HANDLE_FREE; 5323 + pslic_handle->next = adapter->pfree_slic_handles; 5324 + adapter->pfree_slic_handles = pslic_handle; 5325 + } 5326 + adapter->pshmem = (struct slic_shmem *) 5327 + pci_alloc_consistent(adapter->pcidev, 5328 + sizeof(struct slic_shmem), 5329 + &adapter-> 5330 + phys_shmem); 5331 + ASSERT(adapter->pshmem); 5332 + 5333 + memset(adapter->pshmem, 0, sizeof(struct slic_shmem)); 5334 + 5335 + return; 5336 + } 5337 + 5338 + static const struct net_device_ops slic_netdev_ops = { 5339 + .ndo_open = slic_entry_open, 5340 + .ndo_stop = slic_entry_halt, 5341 + .ndo_start_xmit = slic_xmit_start, 5342 + .ndo_do_ioctl = slic_ioctl, 5343 + .ndo_set_mac_address = slic_mac_set_address, 5344 + .ndo_get_stats = slic_get_stats, 5345 + .ndo_set_multicast_list = slic_mcast_set_list, 5346 + .ndo_validate_addr = eth_validate_addr, 5347 + .ndo_change_mtu = eth_change_mtu, 5348 + }; 5349 + 5350 + static u32 slic_card_locate(struct adapter *adapter) 5351 + { 5352 + struct sliccard *card = slic_global.slic_card; 5353 + struct physcard *physcard = slic_global.phys_card; 5354 + ushort card_hostid; 5355 + u16 __iomem *hostid_reg; 5356 + uint i; 5357 + uint rdhostid_offset = 0; 5358 + 5359 + switch (adapter->devid) { 5360 + case SLIC_2GB_DEVICE_ID: 5361 + rdhostid_offset = SLIC_RDHOSTID_2GB; 5362 + break; 5363 + case SLIC_1GB_DEVICE_ID: 5364 + rdhostid_offset = SLIC_RDHOSTID_1GB; 5365 + break; 5366 + default: 5367 + ASSERT(0); 5368 + break; 5369 + } 5370 + 5371 + hostid_reg = 5372 + (u16 __iomem *) (((u8 __iomem *) (adapter->slic_regs)) + 5373 + rdhostid_offset); 5374 + 5375 + /* read the 16 bit hostid from SRAM */ 5376 + card_hostid = (ushort) readw(hostid_reg); 5377 + 5378 + /* Initialize a new card structure if need be */ 5379 + if (card_hostid == SLIC_HOSTID_DEFAULT) { 5380 + card = kzalloc(sizeof(struct sliccard), GFP_KERNEL); 5381 + if (card == NULL) 5382 + return -ENOMEM; 5383 + 5384 + card->next = slic_global.slic_card; 5385 + slic_global.slic_card = card; 5386 + card->busnumber = adapter->busnumber; 5387 + card->slotnumber = adapter->slotnumber; 5388 + 5389 + /* Find an available cardnum */ 5390 + for (i = 0; i < SLIC_MAX_CARDS; i++) { 5391 + if (slic_global.cardnuminuse[i] == 0) { 5392 + slic_global.cardnuminuse[i] = 1; 5393 + card->cardnum = i; 5394 + break; 5395 + } 5396 + } 5397 + slic_global.num_slic_cards++; 5398 + 5399 + slic_debug_card_create(card); 5400 + } else { 5401 + /* Card exists, find the card this adapter belongs to */ 5402 + while (card) { 5403 + if (card->cardnum == card_hostid) 5404 + break; 5405 + card = card->next; 5406 + } 5407 + } 5408 + 5409 + ASSERT(card); 5410 + if (!card) 5411 + return -ENXIO; 5412 + /* Put the adapter in the card's adapter list */ 5413 + ASSERT(card->adapter[adapter->port] == NULL); 5414 + if (!card->adapter[adapter->port]) { 5415 + card->adapter[adapter->port] = adapter; 5416 + adapter->card = card; 5417 + } 5418 + 5419 + card->card_size = 1; /* one port per *logical* card */ 5420 + 5421 + while (physcard) { 5422 + for (i = 0; i < SLIC_MAX_PORTS; i++) { 5423 + if (!physcard->adapter[i]) 5424 + continue; 5425 + else 5426 + break; 5427 + } 5428 + ASSERT(i != SLIC_MAX_PORTS); 5429 + if (physcard->adapter[i]->slotnumber == adapter->slotnumber) 5430 + break; 5431 + physcard = physcard->next; 5432 + } 5433 + if (!physcard) { 5434 + /* no structure allocated for this physical card yet */ 5435 + physcard = kzalloc(sizeof(struct physcard), GFP_ATOMIC); 5436 + ASSERT(physcard); 5437 + 5438 + physcard->next = slic_global.phys_card; 5439 + slic_global.phys_card = physcard; 5440 + physcard->adapters_allocd = 1; 5441 + } else { 5442 + physcard->adapters_allocd++; 5443 + } 5444 + /* Note - this is ZERO relative */ 5445 + adapter->physport = physcard->adapters_allocd - 1; 5446 + 5447 + ASSERT(physcard->adapter[adapter->physport] == NULL); 5448 + physcard->adapter[adapter->physport] = adapter; 5449 + adapter->physcard = physcard; 5450 + 5451 + return 0; 5452 + } 5453 + 5454 + static int __devinit slic_entry_probe(struct pci_dev *pcidev, 5455 + const struct pci_device_id *pci_tbl_entry) 5456 + { 5457 + static int cards_found; 5458 + static int did_version; 5459 + int err = -ENODEV; 5460 + struct net_device *netdev; 5461 + struct adapter *adapter; 5462 + void __iomem *memmapped_ioaddr = NULL; 5463 + u32 status = 0; 5464 + ulong mmio_start = 0; 5465 + ulong mmio_len = 0; 5466 + struct sliccard *card = NULL; 5467 + int pci_using_dac = 0; 5468 + 5469 + slic_global.dynamic_intagg = dynamic_intagg; 5470 + 5471 + err = pci_enable_device(pcidev); 5472 + 5473 + if (err) 5474 + return err; 5475 + 5476 + if (slic_debug > 0 && did_version++ == 0) { 5477 + printk(KERN_DEBUG "%s\n", slic_banner); 5478 + printk(KERN_DEBUG "%s\n", slic_proc_version); 5479 + } 5480 + 5481 + if (!pci_set_dma_mask(pcidev, DMA_BIT_MASK(64))) { 5482 + pci_using_dac = 1; 5483 + if (pci_set_consistent_dma_mask(pcidev, DMA_BIT_MASK(64))) { 5484 + dev_err(&pcidev->dev, "unable to obtain 64-bit DMA for " 5485 + "consistent allocations\n"); 5486 + goto err_out_disable_pci; 5487 + } 5488 + } else if (pci_set_dma_mask(pcidev, DMA_BIT_MASK(32))) { 5489 + pci_using_dac = 0; 5490 + pci_set_consistent_dma_mask(pcidev, DMA_BIT_MASK(32)); 5491 + } else { 5492 + dev_err(&pcidev->dev, "no usable DMA configuration\n"); 5493 + goto err_out_disable_pci; 5494 + } 5495 + 5496 + err = pci_request_regions(pcidev, DRV_NAME); 5497 + if (err) { 5498 + dev_err(&pcidev->dev, "can't obtain PCI resources\n"); 5499 + goto err_out_disable_pci; 5500 + } 5501 + 5502 + pci_set_master(pcidev); 5503 + 5504 + netdev = alloc_etherdev(sizeof(struct adapter)); 5505 + if (!netdev) { 5506 + err = -ENOMEM; 5507 + goto err_out_exit_slic_probe; 5508 + } 5509 + 5510 + SET_NETDEV_DEV(netdev, &pcidev->dev); 5511 + 5512 + pci_set_drvdata(pcidev, netdev); 5513 + adapter = netdev_priv(netdev); 5514 + adapter->netdev = netdev; 5515 + adapter->pcidev = pcidev; 5516 + if (pci_using_dac) 5517 + netdev->features |= NETIF_F_HIGHDMA; 5518 + 5519 + mmio_start = pci_resource_start(pcidev, 0); 5520 + mmio_len = pci_resource_len(pcidev, 0); 5521 + 5522 + 5523 + /* memmapped_ioaddr = (u32)ioremap_nocache(mmio_start, mmio_len);*/ 5524 + memmapped_ioaddr = ioremap(mmio_start, mmio_len); 5525 + if (!memmapped_ioaddr) { 5526 + dev_err(&pcidev->dev, "cannot remap MMIO region %lx @ %lx\n", 5527 + mmio_len, mmio_start); 5528 + goto err_out_free_netdev; 5529 + } 5530 + 5531 + slic_config_pci(pcidev); 5532 + 5533 + slic_init_driver(); 5534 + 5535 + slic_init_adapter(netdev, 5536 + pcidev, pci_tbl_entry, memmapped_ioaddr, cards_found); 5537 + 5538 + status = slic_card_locate(adapter); 5539 + if (status) { 5540 + dev_err(&pcidev->dev, "cannot locate card\n"); 5541 + goto err_out_free_mmio_region; 5542 + } 5543 + 5544 + card = adapter->card; 5545 + 5546 + if (!adapter->allocated) { 5547 + card->adapters_allocated++; 5548 + adapter->allocated = 1; 5549 + } 5550 + 5551 + status = slic_card_init(card, adapter); 5552 + 5553 + if (status != 0) { 5554 + card->state = CARD_FAIL; 5555 + adapter->state = ADAPT_FAIL; 5556 + adapter->linkstate = LINK_DOWN; 5557 + dev_err(&pcidev->dev, "FAILED status[%x]\n", status); 5558 + } else { 5559 + slic_adapter_set_hwaddr(adapter); 5560 + } 5561 + 5562 + netdev->base_addr = (unsigned long)adapter->memorybase; 5563 + netdev->irq = adapter->irq; 5564 + netdev->netdev_ops = &slic_netdev_ops; 5565 + 5566 + slic_debug_adapter_create(adapter); 5567 + 5568 + strcpy(netdev->name, "eth%d"); 5569 + err = register_netdev(netdev); 5570 + if (err) { 5571 + dev_err(&pcidev->dev, "Cannot register net device, aborting.\n"); 5572 + goto err_out_unmap; 5573 + } 5574 + 5575 + cards_found++; 5576 + 5577 + return status; 5578 + 5579 + err_out_unmap: 5580 + iounmap(memmapped_ioaddr); 5581 + err_out_free_mmio_region: 5582 + release_mem_region(mmio_start, mmio_len); 5583 + err_out_free_netdev: 5584 + free_netdev(netdev); 5585 + err_out_exit_slic_probe: 5586 + pci_release_regions(pcidev); 5587 + err_out_disable_pci: 5588 + pci_disable_device(pcidev); 5589 + return err; 5590 + } 2431 5591 2432 5592 static struct pci_driver slic_driver = { 2433 5593 .name = DRV_NAME,