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

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.34 4073 lines 112 kB view raw
1/************************************************************************** 2 * 3 * Copyright 2000-2006 Alacritech, Inc. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above 12 * copyright notice, this list of conditions and the following 13 * disclaimer in the documentation and/or other materials provided 14 * with the distribution. 15 * 16 * Alternatively, this software may be distributed under the terms of the 17 * GNU General Public License ("GPL") version 2 as published by the Free 18 * Software Foundation. 19 * 20 * THIS SOFTWARE IS PROVIDED BY ALACRITECH, INC. ``AS IS'' AND ANY 21 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ALACRITECH, INC. OR 24 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 27 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 28 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 29 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 30 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * 33 * The views and conclusions contained in the software and documentation 34 * are those of the authors and should not be interpreted as representing 35 * official policies, either expressed or implied, of Alacritech, Inc. 36 * 37 **************************************************************************/ 38 39/* 40 * FILENAME: slicoss.c 41 * 42 * The SLICOSS driver for Alacritech's IS-NIC products. 43 * 44 * This driver is supposed to support: 45 * 46 * Mojave cards (single port PCI Gigabit) both copper and fiber 47 * Oasis cards (single and dual port PCI-x Gigabit) copper and fiber 48 * Kalahari cards (dual and quad port PCI-e Gigabit) copper and fiber 49 * 50 * The driver was acutally tested on Oasis and Kalahari cards. 51 * 52 * 53 * NOTE: This is the standard, non-accelerated version of Alacritech's 54 * IS-NIC driver. 55 */ 56 57 58#define KLUDGE_FOR_4GB_BOUNDARY 1 59#define DEBUG_MICROCODE 1 60#define DBG 1 61#define SLIC_INTERRUPT_PROCESS_LIMIT 1 62#define SLIC_OFFLOAD_IP_CHECKSUM 1 63#define STATS_TIMER_INTERVAL 2 64#define PING_TIMER_INTERVAL 1 65 66#include <linux/kernel.h> 67#include <linux/string.h> 68#include <linux/errno.h> 69#include <linux/ioport.h> 70#include <linux/slab.h> 71#include <linux/interrupt.h> 72#include <linux/timer.h> 73#include <linux/pci.h> 74#include <linux/spinlock.h> 75#include <linux/init.h> 76#include <linux/bitops.h> 77#include <linux/io.h> 78#include <linux/netdevice.h> 79#include <linux/etherdevice.h> 80#include <linux/skbuff.h> 81#include <linux/delay.h> 82#include <linux/debugfs.h> 83#include <linux/seq_file.h> 84#include <linux/kthread.h> 85#include <linux/module.h> 86#include <linux/moduleparam.h> 87 88#include <linux/firmware.h> 89#include <linux/types.h> 90#include <linux/dma-mapping.h> 91#include <linux/mii.h> 92#include <linux/if_vlan.h> 93#include <asm/unaligned.h> 94 95#include <linux/ethtool.h> 96#include <linux/uaccess.h> 97#include "slichw.h" 98#include "slic.h" 99 100static struct net_device_stats *slic_get_stats(struct net_device *dev); 101static int slic_entry_open(struct net_device *dev); 102static int slic_entry_halt(struct net_device *dev); 103static int slic_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); 104static netdev_tx_t slic_xmit_start(struct sk_buff *skb, struct net_device *dev); 105static void slic_xmit_fail(struct adapter *adapter, struct sk_buff *skb, 106 void *cmd, u32 skbtype, u32 status); 107static void slic_config_pci(struct pci_dev *pcidev); 108static struct sk_buff *slic_rcvqueue_getnext(struct adapter *adapter); 109static int slic_mac_set_address(struct net_device *dev, void *ptr); 110static void slic_link_event_handler(struct adapter *adapter); 111static void slic_upr_request_complete(struct adapter *adapter, u32 isr); 112static int slic_rspqueue_init(struct adapter *adapter); 113static void slic_rspqueue_free(struct adapter *adapter); 114static struct slic_rspbuf *slic_rspqueue_getnext(struct adapter *adapter); 115static int slic_cmdq_init(struct adapter *adapter); 116static void slic_cmdq_free(struct adapter *adapter); 117static void slic_cmdq_reset(struct adapter *adapter); 118static void slic_cmdq_addcmdpage(struct adapter *adapter, u32 *page); 119static void slic_cmdq_getdone(struct adapter *adapter); 120static void slic_cmdq_putdone_irq(struct adapter *adapter, 121 struct slic_hostcmd *cmd); 122static struct slic_hostcmd *slic_cmdq_getfree(struct adapter *adapter); 123static int slic_rcvqueue_init(struct adapter *adapter); 124static int slic_rcvqueue_fill(struct adapter *adapter); 125static u32 slic_rcvqueue_reinsert(struct adapter *adapter, struct sk_buff *skb); 126static void slic_rcvqueue_free(struct adapter *adapter); 127static void slic_adapter_set_hwaddr(struct adapter *adapter); 128static int slic_card_init(struct sliccard *card, struct adapter *adapter); 129static void slic_intagg_set(struct adapter *adapter, u32 value); 130static int slic_card_download(struct adapter *adapter); 131static u32 slic_card_locate(struct adapter *adapter); 132static int slic_if_init(struct adapter *adapter); 133static int slic_adapter_allocresources(struct adapter *adapter); 134static void slic_adapter_freeresources(struct adapter *adapter); 135static void slic_link_config(struct adapter *adapter, u32 linkspeed, 136 u32 linkduplex); 137static void slic_unmap_mmio_space(struct adapter *adapter); 138static void slic_card_cleanup(struct sliccard *card); 139static void slic_soft_reset(struct adapter *adapter); 140static bool slic_mac_filter(struct adapter *adapter, 141 struct ether_header *ether_frame); 142static void slic_mac_address_config(struct adapter *adapter); 143static void slic_mac_config(struct adapter *adapter); 144static void slic_mcast_set_mask(struct adapter *adapter); 145static void slic_config_set(struct adapter *adapter, bool linkchange); 146static void slic_config_clear(struct adapter *adapter); 147static void slic_config_get(struct adapter *adapter, u32 config, 148 u32 configh); 149static void slic_timer_load_check(ulong context); 150static void slic_assert_fail(void); 151static ushort slic_eeprom_cksum(char *m, int len); 152static void slic_upr_start(struct adapter *adapter); 153static void slic_link_upr_complete(struct adapter *adapter, u32 Isr); 154static 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); 157static void slic_mcast_set_list(struct net_device *dev); 158 159 160static uint slic_first_init = 1; 161static char *slic_banner = "Alacritech SLIC Technology(tm) Server "\ 162 "and Storage Accelerator (Non-Accelerated)"; 163 164static char *slic_proc_version = "2.0.351 2006/07/14 12:26:00"; 165static char *slic_product_name = "SLIC Technology(tm) Server "\ 166 "and Storage Accelerator (Non-Accelerated)"; 167static char *slic_vendor = "Alacritech, Inc."; 168 169static int slic_debug = 1; 170static int debug = -1; 171static struct net_device *head_netdevice; 172 173static struct base_driver slic_global = { {}, 0, 0, 0, 1, NULL, NULL }; 174static int intagg_delay = 100; 175static u32 dynamic_intagg; 176static unsigned int rcv_count; 177static struct dentry *slic_debugfs; 178 179#define DRV_NAME "slicoss" 180#define DRV_VERSION "2.0.1" 181#define DRV_AUTHOR "Alacritech, Inc. Engineering" 182#define DRV_DESCRIPTION "Alacritech SLIC Techonology(tm) "\ 183 "Non-Accelerated Driver" 184#define DRV_COPYRIGHT "Copyright 2000-2006 Alacritech, Inc. "\ 185 "All rights reserved." 186#define PFX DRV_NAME " " 187 188MODULE_AUTHOR(DRV_AUTHOR); 189MODULE_DESCRIPTION(DRV_DESCRIPTION); 190MODULE_LICENSE("Dual BSD/GPL"); 191 192module_param(dynamic_intagg, int, 0); 193MODULE_PARM_DESC(dynamic_intagg, "Dynamic Interrupt Aggregation Setting"); 194module_param(intagg_delay, int, 0); 195MODULE_PARM_DESC(intagg_delay, "uSec Interrupt Aggregation Delay"); 196 197static DEFINE_PCI_DEVICE_TABLE(slic_pci_tbl) = { 198 { PCI_DEVICE(PCI_VENDOR_ID_ALACRITECH, SLIC_1GB_DEVICE_ID) }, 199 { PCI_DEVICE(PCI_VENDOR_ID_ALACRITECH, SLIC_2GB_DEVICE_ID) }, 200 { 0 } 201}; 202 203MODULE_DEVICE_TABLE(pci, slic_pci_tbl); 204 205#ifdef ASSERT 206#undef ASSERT 207#endif 208 209#ifndef ASSERT 210#define ASSERT(a) do { \ 211 if (!(a)) { \ 212 printk(KERN_ERR "slicoss ASSERT() Failure: function %s" \ 213 "line %d\n", __func__, __LINE__); \ 214 slic_assert_fail(); \ 215 } \ 216} while (0) 217#endif 218 219 220#define SLIC_GET_SLIC_HANDLE(_adapter, _pslic_handle) \ 221{ \ 222 spin_lock_irqsave(&_adapter->handle_lock.lock, \ 223 _adapter->handle_lock.flags); \ 224 _pslic_handle = _adapter->pfree_slic_handles; \ 225 if (_pslic_handle) { \ 226 ASSERT(_pslic_handle->type == SLIC_HANDLE_FREE); \ 227 _adapter->pfree_slic_handles = _pslic_handle->next; \ 228 } \ 229 spin_unlock_irqrestore(&_adapter->handle_lock.lock, \ 230 _adapter->handle_lock.flags); \ 231} 232 233#define SLIC_FREE_SLIC_HANDLE(_adapter, _pslic_handle) \ 234{ \ 235 _pslic_handle->type = SLIC_HANDLE_FREE; \ 236 spin_lock_irqsave(&_adapter->handle_lock.lock, \ 237 _adapter->handle_lock.flags); \ 238 _pslic_handle->next = _adapter->pfree_slic_handles; \ 239 _adapter->pfree_slic_handles = _pslic_handle; \ 240 spin_unlock_irqrestore(&_adapter->handle_lock.lock, \ 241 _adapter->handle_lock.flags); \ 242} 243 244static void slic_debug_init(void); 245static void slic_debug_cleanup(void); 246static void slic_debug_adapter_create(struct adapter *adapter); 247static void slic_debug_adapter_destroy(struct adapter *adapter); 248static void slic_debug_card_create(struct sliccard *card); 249static void slic_debug_card_destroy(struct sliccard *card); 250 251static inline void slic_reg32_write(void __iomem *reg, u32 value, bool flush) 252{ 253 writel(value, reg); 254 if (flush) 255 mb(); 256} 257 258static inline void slic_reg64_write(struct adapter *adapter, void __iomem *reg, 259 u32 value, void __iomem *regh, u32 paddrh, 260 bool flush) 261{ 262 spin_lock_irqsave(&adapter->bit64reglock.lock, 263 adapter->bit64reglock.flags); 264 if (paddrh != adapter->curaddrupper) { 265 adapter->curaddrupper = paddrh; 266 writel(paddrh, regh); 267 } 268 writel(value, reg); 269 if (flush) 270 mb(); 271 spin_unlock_irqrestore(&adapter->bit64reglock.lock, 272 adapter->bit64reglock.flags); 273} 274 275static void slic_init_driver(void) 276{ 277 if (slic_first_init) { 278 slic_first_init = 0; 279 spin_lock_init(&slic_global.driver_lock.lock); 280 slic_debug_init(); 281 } 282} 283 284static void slic_init_adapter(struct net_device *netdev, 285 struct pci_dev *pcidev, 286 const struct pci_device_id *pci_tbl_entry, 287 void __iomem *memaddr, int chip_idx) 288{ 289 ushort index; 290 struct slic_handle *pslic_handle; 291 struct adapter *adapter = netdev_priv(netdev); 292 293/* adapter->pcidev = pcidev;*/ 294 adapter->vendid = pci_tbl_entry->vendor; 295 adapter->devid = pci_tbl_entry->device; 296 adapter->subsysid = pci_tbl_entry->subdevice; 297 adapter->busnumber = pcidev->bus->number; 298 adapter->slotnumber = ((pcidev->devfn >> 3) & 0x1F); 299 adapter->functionnumber = (pcidev->devfn & 0x7); 300 adapter->memorylength = pci_resource_len(pcidev, 0); 301 adapter->slic_regs = (__iomem struct slic_regs *)memaddr; 302 adapter->irq = pcidev->irq; 303/* adapter->netdev = netdev;*/ 304 adapter->next_netdevice = head_netdevice; 305 head_netdevice = netdev; 306 adapter->chipid = chip_idx; 307 adapter->port = 0; /*adapter->functionnumber;*/ 308 adapter->cardindex = adapter->port; 309 adapter->memorybase = memaddr; 310 spin_lock_init(&adapter->upr_lock.lock); 311 spin_lock_init(&adapter->bit64reglock.lock); 312 spin_lock_init(&adapter->adapter_lock.lock); 313 spin_lock_init(&adapter->reset_lock.lock); 314 spin_lock_init(&adapter->handle_lock.lock); 315 316 adapter->card_size = 1; 317 /* 318 Initialize slic_handle array 319 */ 320 ASSERT(SLIC_CMDQ_MAXCMDS <= 0xFFFF); 321 /* 322 Start with 1. 0 is an invalid host handle. 323 */ 324 for (index = 1, pslic_handle = &adapter->slic_handles[1]; 325 index < SLIC_CMDQ_MAXCMDS; index++, pslic_handle++) { 326 327 pslic_handle->token.handle_index = index; 328 pslic_handle->type = SLIC_HANDLE_FREE; 329 pslic_handle->next = adapter->pfree_slic_handles; 330 adapter->pfree_slic_handles = pslic_handle; 331 } 332 adapter->pshmem = (struct slic_shmem *) 333 pci_alloc_consistent(adapter->pcidev, 334 sizeof(struct slic_shmem), 335 &adapter-> 336 phys_shmem); 337 ASSERT(adapter->pshmem); 338 339 memset(adapter->pshmem, 0, sizeof(struct slic_shmem)); 340 341 return; 342} 343 344static const struct net_device_ops slic_netdev_ops = { 345 .ndo_open = slic_entry_open, 346 .ndo_stop = slic_entry_halt, 347 .ndo_start_xmit = slic_xmit_start, 348 .ndo_do_ioctl = slic_ioctl, 349 .ndo_set_mac_address = slic_mac_set_address, 350 .ndo_get_stats = slic_get_stats, 351 .ndo_set_multicast_list = slic_mcast_set_list, 352 .ndo_validate_addr = eth_validate_addr, 353 .ndo_change_mtu = eth_change_mtu, 354}; 355 356static int __devinit slic_entry_probe(struct pci_dev *pcidev, 357 const struct pci_device_id *pci_tbl_entry) 358{ 359 static int cards_found; 360 static int did_version; 361 int err = -ENODEV; 362 struct net_device *netdev; 363 struct adapter *adapter; 364 void __iomem *memmapped_ioaddr = NULL; 365 u32 status = 0; 366 ulong mmio_start = 0; 367 ulong mmio_len = 0; 368 struct sliccard *card = NULL; 369 int pci_using_dac = 0; 370 371 slic_global.dynamic_intagg = dynamic_intagg; 372 373 err = pci_enable_device(pcidev); 374 375 if (err) 376 return err; 377 378 if (slic_debug > 0 && did_version++ == 0) { 379 printk(KERN_DEBUG "%s\n", slic_banner); 380 printk(KERN_DEBUG "%s\n", slic_proc_version); 381 } 382 383 if (!pci_set_dma_mask(pcidev, DMA_BIT_MASK(64))) { 384 pci_using_dac = 1; 385 if (pci_set_consistent_dma_mask(pcidev, DMA_BIT_MASK(64))) { 386 dev_err(&pcidev->dev, "unable to obtain 64-bit DMA for " 387 "consistent allocations\n"); 388 goto err_out_disable_pci; 389 } 390 } else if (pci_set_dma_mask(pcidev, DMA_BIT_MASK(32))) { 391 pci_using_dac = 0; 392 pci_set_consistent_dma_mask(pcidev, DMA_BIT_MASK(32)); 393 } else { 394 dev_err(&pcidev->dev, "no usable DMA configuration\n"); 395 goto err_out_disable_pci; 396 } 397 398 err = pci_request_regions(pcidev, DRV_NAME); 399 if (err) { 400 dev_err(&pcidev->dev, "can't obtain PCI resources\n"); 401 goto err_out_disable_pci; 402 } 403 404 pci_set_master(pcidev); 405 406 netdev = alloc_etherdev(sizeof(struct adapter)); 407 if (!netdev) { 408 err = -ENOMEM; 409 goto err_out_exit_slic_probe; 410 } 411 412 SET_NETDEV_DEV(netdev, &pcidev->dev); 413 414 pci_set_drvdata(pcidev, netdev); 415 adapter = netdev_priv(netdev); 416 adapter->netdev = netdev; 417 adapter->pcidev = pcidev; 418 if (pci_using_dac) 419 netdev->features |= NETIF_F_HIGHDMA; 420 421 mmio_start = pci_resource_start(pcidev, 0); 422 mmio_len = pci_resource_len(pcidev, 0); 423 424 425/* memmapped_ioaddr = (u32)ioremap_nocache(mmio_start, mmio_len);*/ 426 memmapped_ioaddr = ioremap(mmio_start, mmio_len); 427 if (!memmapped_ioaddr) { 428 dev_err(&pcidev->dev, "cannot remap MMIO region %lx @ %lx\n", 429 mmio_len, mmio_start); 430 goto err_out_free_netdev; 431 } 432 433 slic_config_pci(pcidev); 434 435 slic_init_driver(); 436 437 slic_init_adapter(netdev, 438 pcidev, pci_tbl_entry, memmapped_ioaddr, cards_found); 439 440 status = slic_card_locate(adapter); 441 if (status) { 442 dev_err(&pcidev->dev, "cannot locate card\n"); 443 goto err_out_free_mmio_region; 444 } 445 446 card = adapter->card; 447 448 if (!adapter->allocated) { 449 card->adapters_allocated++; 450 adapter->allocated = 1; 451 } 452 453 status = slic_card_init(card, adapter); 454 455 if (status != STATUS_SUCCESS) { 456 card->state = CARD_FAIL; 457 adapter->state = ADAPT_FAIL; 458 adapter->linkstate = LINK_DOWN; 459 dev_err(&pcidev->dev, "FAILED status[%x]\n", status); 460 } else { 461 slic_adapter_set_hwaddr(adapter); 462 } 463 464 netdev->base_addr = (unsigned long)adapter->memorybase; 465 netdev->irq = adapter->irq; 466 netdev->netdev_ops = &slic_netdev_ops; 467 468 slic_debug_adapter_create(adapter); 469 470 strcpy(netdev->name, "eth%d"); 471 err = register_netdev(netdev); 472 if (err) { 473 dev_err(&pcidev->dev, "Cannot register net device, aborting.\n"); 474 goto err_out_unmap; 475 } 476 477 cards_found++; 478 479 return status; 480 481err_out_unmap: 482 iounmap(memmapped_ioaddr); 483err_out_free_mmio_region: 484 release_mem_region(mmio_start, mmio_len); 485err_out_free_netdev: 486 free_netdev(netdev); 487err_out_exit_slic_probe: 488 pci_release_regions(pcidev); 489err_out_disable_pci: 490 pci_disable_device(pcidev); 491 return err; 492} 493 494static int slic_entry_open(struct net_device *dev) 495{ 496 struct adapter *adapter = netdev_priv(dev); 497 struct sliccard *card = adapter->card; 498 u32 locked = 0; 499 int status; 500 501 ASSERT(adapter); 502 ASSERT(card); 503 504 netif_stop_queue(adapter->netdev); 505 506 spin_lock_irqsave(&slic_global.driver_lock.lock, 507 slic_global.driver_lock.flags); 508 locked = 1; 509 if (!adapter->activated) { 510 card->adapters_activated++; 511 slic_global.num_slic_ports_active++; 512 adapter->activated = 1; 513 } 514 status = slic_if_init(adapter); 515 516 if (status != STATUS_SUCCESS) { 517 if (adapter->activated) { 518 card->adapters_activated--; 519 slic_global.num_slic_ports_active--; 520 adapter->activated = 0; 521 } 522 if (locked) { 523 spin_unlock_irqrestore(&slic_global.driver_lock.lock, 524 slic_global.driver_lock.flags); 525 locked = 0; 526 } 527 return status; 528 } 529 if (!card->master) 530 card->master = adapter; 531 532 if (locked) { 533 spin_unlock_irqrestore(&slic_global.driver_lock.lock, 534 slic_global.driver_lock.flags); 535 locked = 0; 536 } 537 538 return STATUS_SUCCESS; 539} 540 541static void __devexit slic_entry_remove(struct pci_dev *pcidev) 542{ 543 struct net_device *dev = pci_get_drvdata(pcidev); 544 u32 mmio_start = 0; 545 uint mmio_len = 0; 546 struct adapter *adapter = netdev_priv(dev); 547 struct sliccard *card; 548 struct mcast_address *mcaddr, *mlist; 549 550 ASSERT(adapter); 551 slic_adapter_freeresources(adapter); 552 slic_unmap_mmio_space(adapter); 553 unregister_netdev(dev); 554 555 mmio_start = pci_resource_start(pcidev, 0); 556 mmio_len = pci_resource_len(pcidev, 0); 557 558 release_mem_region(mmio_start, mmio_len); 559 560 iounmap((void __iomem *)dev->base_addr); 561 /* free multicast addresses */ 562 mlist = adapter->mcastaddrs; 563 while (mlist) { 564 mcaddr = mlist; 565 mlist = mlist->next; 566 kfree(mcaddr); 567 } 568 ASSERT(adapter->card); 569 card = adapter->card; 570 ASSERT(card->adapters_allocated); 571 card->adapters_allocated--; 572 adapter->allocated = 0; 573 if (!card->adapters_allocated) { 574 struct sliccard *curr_card = slic_global.slic_card; 575 if (curr_card == card) { 576 slic_global.slic_card = card->next; 577 } else { 578 while (curr_card->next != card) 579 curr_card = curr_card->next; 580 ASSERT(curr_card); 581 curr_card->next = card->next; 582 } 583 ASSERT(slic_global.num_slic_cards); 584 slic_global.num_slic_cards--; 585 slic_card_cleanup(card); 586 } 587 kfree(dev); 588 pci_release_regions(pcidev); 589} 590 591static int slic_entry_halt(struct net_device *dev) 592{ 593 struct adapter *adapter = netdev_priv(dev); 594 struct sliccard *card = adapter->card; 595 __iomem struct slic_regs *slic_regs = adapter->slic_regs; 596 597 spin_lock_irqsave(&slic_global.driver_lock.lock, 598 slic_global.driver_lock.flags); 599 ASSERT(card); 600 netif_stop_queue(adapter->netdev); 601 adapter->state = ADAPT_DOWN; 602 adapter->linkstate = LINK_DOWN; 603 adapter->upr_list = NULL; 604 adapter->upr_busy = 0; 605 adapter->devflags_prev = 0; 606 ASSERT(card->adapter[adapter->cardindex] == adapter); 607 slic_reg32_write(&slic_regs->slic_icr, ICR_INT_OFF, FLUSH); 608 adapter->all_reg_writes++; 609 adapter->icr_reg_writes++; 610 slic_config_clear(adapter); 611 if (adapter->activated) { 612 card->adapters_activated--; 613 slic_global.num_slic_ports_active--; 614 adapter->activated = 0; 615 } 616#ifdef AUTOMATIC_RESET 617 slic_reg32_write(&slic_regs->slic_reset_iface, 0, FLUSH); 618#endif 619 /* 620 * Reset the adapter's cmd queues 621 */ 622 slic_cmdq_reset(adapter); 623 624#ifdef AUTOMATIC_RESET 625 if (!card->adapters_activated) 626 slic_card_init(card, adapter); 627#endif 628 629 spin_unlock_irqrestore(&slic_global.driver_lock.lock, 630 slic_global.driver_lock.flags); 631 return STATUS_SUCCESS; 632} 633 634static int slic_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) 635{ 636 struct adapter *adapter = netdev_priv(dev); 637 struct ethtool_cmd edata; 638 struct ethtool_cmd ecmd; 639 u32 data[7]; 640 u32 intagg; 641 642 ASSERT(rq); 643 switch (cmd) { 644 case SIOCSLICSETINTAGG: 645 if (copy_from_user(data, rq->ifr_data, 28)) 646 return -EFAULT; 647 intagg = data[0]; 648 dev_err(&dev->dev, "%s: set interrupt aggregation to %d\n", 649 __func__, intagg); 650 slic_intagg_set(adapter, intagg); 651 return 0; 652 653#ifdef SLIC_TRACE_DUMP_ENABLED 654 case SIOCSLICTRACEDUMP: 655 { 656 u32 value; 657 DBG_IOCTL("slic_ioctl SIOCSLIC_TRACE_DUMP\n"); 658 659 if (copy_from_user(data, rq->ifr_data, 28)) { 660 PRINT_ERROR 661 ("slic: copy_from_user FAILED getting initial simba param\n"); 662 return -EFAULT; 663 } 664 665 value = data[0]; 666 if (tracemon_request == SLIC_DUMP_DONE) { 667 PRINT_ERROR 668 ("ATK Diagnostic Trace Dump Requested\n"); 669 tracemon_request = SLIC_DUMP_REQUESTED; 670 tracemon_request_type = value; 671 tracemon_timestamp = jiffies; 672 } else if ((tracemon_request == SLIC_DUMP_REQUESTED) || 673 (tracemon_request == 674 SLIC_DUMP_IN_PROGRESS)) { 675 PRINT_ERROR 676 ("ATK Diagnostic Trace Dump Requested but already in progress... ignore\n"); 677 } else { 678 PRINT_ERROR 679 ("ATK Diagnostic Trace Dump Requested\n"); 680 tracemon_request = SLIC_DUMP_REQUESTED; 681 tracemon_request_type = value; 682 tracemon_timestamp = jiffies; 683 } 684 return 0; 685 } 686#endif 687 case SIOCETHTOOL: 688 ASSERT(adapter); 689 if (copy_from_user(&ecmd, rq->ifr_data, sizeof(ecmd))) 690 return -EFAULT; 691 692 if (ecmd.cmd == ETHTOOL_GSET) { 693 edata.supported = (SUPPORTED_10baseT_Half | 694 SUPPORTED_10baseT_Full | 695 SUPPORTED_100baseT_Half | 696 SUPPORTED_100baseT_Full | 697 SUPPORTED_Autoneg | SUPPORTED_MII); 698 edata.port = PORT_MII; 699 edata.transceiver = XCVR_INTERNAL; 700 edata.phy_address = 0; 701 if (adapter->linkspeed == LINK_100MB) 702 edata.speed = SPEED_100; 703 else if (adapter->linkspeed == LINK_10MB) 704 edata.speed = SPEED_10; 705 else 706 edata.speed = 0; 707 708 if (adapter->linkduplex == LINK_FULLD) 709 edata.duplex = DUPLEX_FULL; 710 else 711 edata.duplex = DUPLEX_HALF; 712 713 edata.autoneg = AUTONEG_ENABLE; 714 edata.maxtxpkt = 1; 715 edata.maxrxpkt = 1; 716 if (copy_to_user(rq->ifr_data, &edata, sizeof(edata))) 717 return -EFAULT; 718 719 } else if (ecmd.cmd == ETHTOOL_SSET) { 720 if (!capable(CAP_NET_ADMIN)) 721 return -EPERM; 722 723 if (adapter->linkspeed == LINK_100MB) 724 edata.speed = SPEED_100; 725 else if (adapter->linkspeed == LINK_10MB) 726 edata.speed = SPEED_10; 727 else 728 edata.speed = 0; 729 730 if (adapter->linkduplex == LINK_FULLD) 731 edata.duplex = DUPLEX_FULL; 732 else 733 edata.duplex = DUPLEX_HALF; 734 735 edata.autoneg = AUTONEG_ENABLE; 736 edata.maxtxpkt = 1; 737 edata.maxrxpkt = 1; 738 if ((ecmd.speed != edata.speed) || 739 (ecmd.duplex != edata.duplex)) { 740 u32 speed; 741 u32 duplex; 742 743 if (ecmd.speed == SPEED_10) 744 speed = 0; 745 else 746 speed = PCR_SPEED_100; 747 if (ecmd.duplex == DUPLEX_FULL) 748 duplex = PCR_DUPLEX_FULL; 749 else 750 duplex = 0; 751 slic_link_config(adapter, speed, duplex); 752 slic_link_event_handler(adapter); 753 } 754 } 755 return 0; 756 default: 757 return -EOPNOTSUPP; 758 } 759} 760 761#define XMIT_FAIL_LINK_STATE 1 762#define XMIT_FAIL_ZERO_LENGTH 2 763#define XMIT_FAIL_HOSTCMD_FAIL 3 764 765static void slic_xmit_build_request(struct adapter *adapter, 766 struct slic_hostcmd *hcmd, struct sk_buff *skb) 767{ 768 struct slic_host64_cmd *ihcmd; 769 ulong phys_addr; 770 771 ihcmd = &hcmd->cmd64; 772 773 ihcmd->flags = (adapter->port << IHFLG_IFSHFT); 774 ihcmd->command = IHCMD_XMT_REQ; 775 ihcmd->u.slic_buffers.totlen = skb->len; 776 phys_addr = pci_map_single(adapter->pcidev, skb->data, skb->len, 777 PCI_DMA_TODEVICE); 778 ihcmd->u.slic_buffers.bufs[0].paddrl = SLIC_GET_ADDR_LOW(phys_addr); 779 ihcmd->u.slic_buffers.bufs[0].paddrh = SLIC_GET_ADDR_HIGH(phys_addr); 780 ihcmd->u.slic_buffers.bufs[0].length = skb->len; 781#if defined(CONFIG_X86_64) 782 hcmd->cmdsize = (u32) ((((u64)&ihcmd->u.slic_buffers.bufs[1] - 783 (u64) hcmd) + 31) >> 5); 784#elif defined(CONFIG_X86) 785 hcmd->cmdsize = ((((u32) &ihcmd->u.slic_buffers.bufs[1] - 786 (u32) hcmd) + 31) >> 5); 787#else 788 Stop Compilation; 789#endif 790} 791 792#define NORMAL_ETHFRAME 0 793 794static netdev_tx_t slic_xmit_start(struct sk_buff *skb, struct net_device *dev) 795{ 796 struct sliccard *card; 797 struct adapter *adapter = netdev_priv(dev); 798 struct slic_hostcmd *hcmd = NULL; 799 u32 status = 0; 800 u32 skbtype = NORMAL_ETHFRAME; 801 void *offloadcmd = NULL; 802 803 card = adapter->card; 804 ASSERT(card); 805 if ((adapter->linkstate != LINK_UP) || 806 (adapter->state != ADAPT_UP) || (card->state != CARD_UP)) { 807 status = XMIT_FAIL_LINK_STATE; 808 goto xmit_fail; 809 810 } else if (skb->len == 0) { 811 status = XMIT_FAIL_ZERO_LENGTH; 812 goto xmit_fail; 813 } 814 815 if (skbtype == NORMAL_ETHFRAME) { 816 hcmd = slic_cmdq_getfree(adapter); 817 if (!hcmd) { 818 adapter->xmitq_full = 1; 819 status = XMIT_FAIL_HOSTCMD_FAIL; 820 goto xmit_fail; 821 } 822 ASSERT(hcmd->pslic_handle); 823 ASSERT(hcmd->cmd64.hosthandle == 824 hcmd->pslic_handle->token.handle_token); 825 hcmd->skb = skb; 826 hcmd->busy = 1; 827 hcmd->type = SLIC_CMD_DUMB; 828 if (skbtype == NORMAL_ETHFRAME) 829 slic_xmit_build_request(adapter, hcmd, skb); 830 } 831 adapter->stats.tx_packets++; 832 adapter->stats.tx_bytes += skb->len; 833 834#ifdef DEBUG_DUMP 835 if (adapter->kill_card) { 836 struct slic_host64_cmd ihcmd; 837 838 ihcmd = &hcmd->cmd64; 839 840 ihcmd->flags |= 0x40; 841 adapter->kill_card = 0; /* only do this once */ 842 } 843#endif 844 if (hcmd->paddrh == 0) { 845 slic_reg32_write(&adapter->slic_regs->slic_cbar, 846 (hcmd->paddrl | hcmd->cmdsize), DONT_FLUSH); 847 } else { 848 slic_reg64_write(adapter, &adapter->slic_regs->slic_cbar64, 849 (hcmd->paddrl | hcmd->cmdsize), 850 &adapter->slic_regs->slic_addr_upper, 851 hcmd->paddrh, DONT_FLUSH); 852 } 853xmit_done: 854 return NETDEV_TX_OK; 855xmit_fail: 856 slic_xmit_fail(adapter, skb, offloadcmd, skbtype, status); 857 goto xmit_done; 858} 859 860static void slic_xmit_fail(struct adapter *adapter, 861 struct sk_buff *skb, 862 void *cmd, u32 skbtype, u32 status) 863{ 864 if (adapter->xmitq_full) 865 netif_stop_queue(adapter->netdev); 866 if ((cmd == NULL) && (status <= XMIT_FAIL_HOSTCMD_FAIL)) { 867 switch (status) { 868 case XMIT_FAIL_LINK_STATE: 869 dev_err(&adapter->netdev->dev, 870 "reject xmit skb[%p: %x] linkstate[%s] " 871 "adapter[%s:%d] card[%s:%d]\n", 872 skb, skb->pkt_type, 873 SLIC_LINKSTATE(adapter->linkstate), 874 SLIC_ADAPTER_STATE(adapter->state), 875 adapter->state, 876 SLIC_CARD_STATE(adapter->card->state), 877 adapter->card->state); 878 break; 879 case XMIT_FAIL_ZERO_LENGTH: 880 dev_err(&adapter->netdev->dev, 881 "xmit_start skb->len == 0 skb[%p] type[%x]\n", 882 skb, skb->pkt_type); 883 break; 884 case XMIT_FAIL_HOSTCMD_FAIL: 885 dev_err(&adapter->netdev->dev, 886 "xmit_start skb[%p] type[%x] No host commands " 887 "available\n", skb, skb->pkt_type); 888 break; 889 default: 890 ASSERT(0); 891 } 892 } 893 dev_kfree_skb(skb); 894 adapter->stats.tx_dropped++; 895} 896 897static void slic_rcv_handle_error(struct adapter *adapter, 898 struct slic_rcvbuf *rcvbuf) 899{ 900 struct slic_hddr_wds *hdr = (struct slic_hddr_wds *)rcvbuf->data; 901 902 if (adapter->devid != SLIC_1GB_DEVICE_ID) { 903 if (hdr->frame_status14 & VRHSTAT_802OE) 904 adapter->if_events.oflow802++; 905 if (hdr->frame_status14 & VRHSTAT_TPOFLO) 906 adapter->if_events.Tprtoflow++; 907 if (hdr->frame_status_b14 & VRHSTATB_802UE) 908 adapter->if_events.uflow802++; 909 if (hdr->frame_status_b14 & VRHSTATB_RCVE) { 910 adapter->if_events.rcvearly++; 911 adapter->stats.rx_fifo_errors++; 912 } 913 if (hdr->frame_status_b14 & VRHSTATB_BUFF) { 914 adapter->if_events.Bufov++; 915 adapter->stats.rx_over_errors++; 916 } 917 if (hdr->frame_status_b14 & VRHSTATB_CARRE) { 918 adapter->if_events.Carre++; 919 adapter->stats.tx_carrier_errors++; 920 } 921 if (hdr->frame_status_b14 & VRHSTATB_LONGE) 922 adapter->if_events.Longe++; 923 if (hdr->frame_status_b14 & VRHSTATB_PREA) 924 adapter->if_events.Invp++; 925 if (hdr->frame_status_b14 & VRHSTATB_CRC) { 926 adapter->if_events.Crc++; 927 adapter->stats.rx_crc_errors++; 928 } 929 if (hdr->frame_status_b14 & VRHSTATB_DRBL) 930 adapter->if_events.Drbl++; 931 if (hdr->frame_status_b14 & VRHSTATB_CODE) 932 adapter->if_events.Code++; 933 if (hdr->frame_status_b14 & VRHSTATB_TPCSUM) 934 adapter->if_events.TpCsum++; 935 if (hdr->frame_status_b14 & VRHSTATB_TPHLEN) 936 adapter->if_events.TpHlen++; 937 if (hdr->frame_status_b14 & VRHSTATB_IPCSUM) 938 adapter->if_events.IpCsum++; 939 if (hdr->frame_status_b14 & VRHSTATB_IPLERR) 940 adapter->if_events.IpLen++; 941 if (hdr->frame_status_b14 & VRHSTATB_IPHERR) 942 adapter->if_events.IpHlen++; 943 } else { 944 if (hdr->frame_statusGB & VGBSTAT_XPERR) { 945 u32 xerr = hdr->frame_statusGB >> VGBSTAT_XERRSHFT; 946 947 if (xerr == VGBSTAT_XCSERR) 948 adapter->if_events.TpCsum++; 949 if (xerr == VGBSTAT_XUFLOW) 950 adapter->if_events.Tprtoflow++; 951 if (xerr == VGBSTAT_XHLEN) 952 adapter->if_events.TpHlen++; 953 } 954 if (hdr->frame_statusGB & VGBSTAT_NETERR) { 955 u32 nerr = 956 (hdr-> 957 frame_statusGB >> VGBSTAT_NERRSHFT) & 958 VGBSTAT_NERRMSK; 959 if (nerr == VGBSTAT_NCSERR) 960 adapter->if_events.IpCsum++; 961 if (nerr == VGBSTAT_NUFLOW) 962 adapter->if_events.IpLen++; 963 if (nerr == VGBSTAT_NHLEN) 964 adapter->if_events.IpHlen++; 965 } 966 if (hdr->frame_statusGB & VGBSTAT_LNKERR) { 967 u32 lerr = hdr->frame_statusGB & VGBSTAT_LERRMSK; 968 969 if (lerr == VGBSTAT_LDEARLY) 970 adapter->if_events.rcvearly++; 971 if (lerr == VGBSTAT_LBOFLO) 972 adapter->if_events.Bufov++; 973 if (lerr == VGBSTAT_LCODERR) 974 adapter->if_events.Code++; 975 if (lerr == VGBSTAT_LDBLNBL) 976 adapter->if_events.Drbl++; 977 if (lerr == VGBSTAT_LCRCERR) 978 adapter->if_events.Crc++; 979 if (lerr == VGBSTAT_LOFLO) 980 adapter->if_events.oflow802++; 981 if (lerr == VGBSTAT_LUFLO) 982 adapter->if_events.uflow802++; 983 } 984 } 985 return; 986} 987 988#define TCP_OFFLOAD_FRAME_PUSHFLAG 0x10000000 989#define M_FAST_PATH 0x0040 990 991static void slic_rcv_handler(struct adapter *adapter) 992{ 993 struct sk_buff *skb; 994 struct slic_rcvbuf *rcvbuf; 995 u32 frames = 0; 996 997 while ((skb = slic_rcvqueue_getnext(adapter))) { 998 u32 rx_bytes; 999 1000 ASSERT(skb->head); 1001 rcvbuf = (struct slic_rcvbuf *)skb->head; 1002 adapter->card->events++; 1003 if (rcvbuf->status & IRHDDR_ERR) { 1004 adapter->rx_errors++; 1005 slic_rcv_handle_error(adapter, rcvbuf); 1006 slic_rcvqueue_reinsert(adapter, skb); 1007 continue; 1008 } 1009 1010 if (!slic_mac_filter(adapter, (struct ether_header *) 1011 rcvbuf->data)) { 1012 slic_rcvqueue_reinsert(adapter, skb); 1013 continue; 1014 } 1015 skb_pull(skb, SLIC_RCVBUF_HEADSIZE); 1016 rx_bytes = (rcvbuf->length & IRHDDR_FLEN_MSK); 1017 skb_put(skb, rx_bytes); 1018 adapter->stats.rx_packets++; 1019 adapter->stats.rx_bytes += rx_bytes; 1020#if SLIC_OFFLOAD_IP_CHECKSUM 1021 skb->ip_summed = CHECKSUM_UNNECESSARY; 1022#endif 1023 1024 skb->dev = adapter->netdev; 1025 skb->protocol = eth_type_trans(skb, skb->dev); 1026 netif_rx(skb); 1027 1028 ++frames; 1029#if SLIC_INTERRUPT_PROCESS_LIMIT 1030 if (frames >= SLIC_RCVQ_MAX_PROCESS_ISR) { 1031 adapter->rcv_interrupt_yields++; 1032 break; 1033 } 1034#endif 1035 } 1036 adapter->max_isr_rcvs = max(adapter->max_isr_rcvs, frames); 1037} 1038 1039static void slic_xmit_complete(struct adapter *adapter) 1040{ 1041 struct slic_hostcmd *hcmd; 1042 struct slic_rspbuf *rspbuf; 1043 u32 frames = 0; 1044 struct slic_handle_word slic_handle_word; 1045 1046 do { 1047 rspbuf = slic_rspqueue_getnext(adapter); 1048 if (!rspbuf) 1049 break; 1050 adapter->xmit_completes++; 1051 adapter->card->events++; 1052 /* 1053 Get the complete host command buffer 1054 */ 1055 slic_handle_word.handle_token = rspbuf->hosthandle; 1056 ASSERT(slic_handle_word.handle_index); 1057 ASSERT(slic_handle_word.handle_index <= SLIC_CMDQ_MAXCMDS); 1058 hcmd = 1059 (struct slic_hostcmd *) 1060 adapter->slic_handles[slic_handle_word.handle_index]. 1061 address; 1062/* hcmd = (struct slic_hostcmd *) rspbuf->hosthandle; */ 1063 ASSERT(hcmd); 1064 ASSERT(hcmd->pslic_handle == 1065 &adapter->slic_handles[slic_handle_word.handle_index]); 1066 if (hcmd->type == SLIC_CMD_DUMB) { 1067 if (hcmd->skb) 1068 dev_kfree_skb_irq(hcmd->skb); 1069 slic_cmdq_putdone_irq(adapter, hcmd); 1070 } 1071 rspbuf->status = 0; 1072 rspbuf->hosthandle = 0; 1073 frames++; 1074 } while (1); 1075 adapter->max_isr_xmits = max(adapter->max_isr_xmits, frames); 1076} 1077 1078static irqreturn_t slic_interrupt(int irq, void *dev_id) 1079{ 1080 struct net_device *dev = (struct net_device *)dev_id; 1081 struct adapter *adapter = netdev_priv(dev); 1082 u32 isr; 1083 1084 if ((adapter->pshmem) && (adapter->pshmem->isr)) { 1085 slic_reg32_write(&adapter->slic_regs->slic_icr, 1086 ICR_INT_MASK, FLUSH); 1087 isr = adapter->isrcopy = adapter->pshmem->isr; 1088 adapter->pshmem->isr = 0; 1089 adapter->num_isrs++; 1090 switch (adapter->card->state) { 1091 case CARD_UP: 1092 if (isr & ~ISR_IO) { 1093 if (isr & ISR_ERR) { 1094 adapter->error_interrupts++; 1095 if (isr & ISR_RMISS) { 1096 int count; 1097 int pre_count; 1098 int errors; 1099 1100 struct slic_rcvqueue *rcvq = 1101 &adapter->rcvqueue; 1102 1103 adapter-> 1104 error_rmiss_interrupts++; 1105 if (!rcvq->errors) 1106 rcv_count = rcvq->count; 1107 pre_count = rcvq->count; 1108 errors = rcvq->errors; 1109 1110 while (rcvq->count < 1111 SLIC_RCVQ_FILLTHRESH) { 1112 count = 1113 slic_rcvqueue_fill 1114 (adapter); 1115 if (!count) 1116 break; 1117 } 1118 } else if (isr & ISR_XDROP) { 1119 dev_err(&dev->dev, 1120 "isr & ISR_ERR [%x] " 1121 "ISR_XDROP \n", isr); 1122 } else { 1123 dev_err(&dev->dev, 1124 "isr & ISR_ERR [%x]\n", 1125 isr); 1126 } 1127 } 1128 1129 if (isr & ISR_LEVENT) { 1130 adapter->linkevent_interrupts++; 1131 slic_link_event_handler(adapter); 1132 } 1133 1134 if ((isr & ISR_UPC) || 1135 (isr & ISR_UPCERR) || (isr & ISR_UPCBSY)) { 1136 adapter->upr_interrupts++; 1137 slic_upr_request_complete(adapter, isr); 1138 } 1139 } 1140 1141 if (isr & ISR_RCV) { 1142 adapter->rcv_interrupts++; 1143 slic_rcv_handler(adapter); 1144 } 1145 1146 if (isr & ISR_CMD) { 1147 adapter->xmit_interrupts++; 1148 slic_xmit_complete(adapter); 1149 } 1150 break; 1151 1152 case CARD_DOWN: 1153 if ((isr & ISR_UPC) || 1154 (isr & ISR_UPCERR) || (isr & ISR_UPCBSY)) { 1155 adapter->upr_interrupts++; 1156 slic_upr_request_complete(adapter, isr); 1157 } 1158 break; 1159 1160 default: 1161 break; 1162 } 1163 1164 adapter->isrcopy = 0; 1165 adapter->all_reg_writes += 2; 1166 adapter->isr_reg_writes++; 1167 slic_reg32_write(&adapter->slic_regs->slic_isr, 0, FLUSH); 1168 } else { 1169 adapter->false_interrupts++; 1170 } 1171 return IRQ_HANDLED; 1172} 1173 1174/* 1175 * slic_link_event_handler - 1176 * 1177 * Initiate a link configuration sequence. The link configuration begins 1178 * by issuing a READ_LINK_STATUS command to the Utility Processor on the 1179 * SLIC. Since the command finishes asynchronously, the slic_upr_comlete 1180 * routine will follow it up witha UP configuration write command, which 1181 * will also complete asynchronously. 1182 * 1183 */ 1184static void slic_link_event_handler(struct adapter *adapter) 1185{ 1186 int status; 1187 struct slic_shmem *pshmem; 1188 1189 if (adapter->state != ADAPT_UP) { 1190 /* Adapter is not operational. Ignore. */ 1191 return; 1192 } 1193 1194 pshmem = (struct slic_shmem *)adapter->phys_shmem; 1195 1196#if defined(CONFIG_X86_64) 1197 status = slic_upr_request(adapter, 1198 SLIC_UPR_RLSR, 1199 SLIC_GET_ADDR_LOW(&pshmem->linkstatus), 1200 SLIC_GET_ADDR_HIGH(&pshmem->linkstatus), 1201 0, 0); 1202#elif defined(CONFIG_X86) 1203 status = slic_upr_request(adapter, SLIC_UPR_RLSR, 1204 (u32) &pshmem->linkstatus, /* no 4GB wrap guaranteed */ 1205 0, 0, 0); 1206#else 1207 Stop compilation; 1208#endif 1209 ASSERT((status == STATUS_SUCCESS) || (status == STATUS_PENDING)); 1210} 1211 1212static void slic_init_cleanup(struct adapter *adapter) 1213{ 1214 if (adapter->intrregistered) { 1215 adapter->intrregistered = 0; 1216 free_irq(adapter->netdev->irq, adapter->netdev); 1217 1218 } 1219 if (adapter->pshmem) { 1220 pci_free_consistent(adapter->pcidev, 1221 sizeof(struct slic_shmem), 1222 adapter->pshmem, adapter->phys_shmem); 1223 adapter->pshmem = NULL; 1224 adapter->phys_shmem = (dma_addr_t) NULL; 1225 } 1226 1227 if (adapter->pingtimerset) { 1228 adapter->pingtimerset = 0; 1229 del_timer(&adapter->pingtimer); 1230 } 1231 1232 slic_rspqueue_free(adapter); 1233 slic_cmdq_free(adapter); 1234 slic_rcvqueue_free(adapter); 1235} 1236 1237static struct net_device_stats *slic_get_stats(struct net_device *dev) 1238{ 1239 struct adapter *adapter = netdev_priv(dev); 1240 1241 ASSERT(adapter); 1242 dev->stats.collisions = adapter->slic_stats.iface.xmit_collisions; 1243 dev->stats.rx_errors = adapter->slic_stats.iface.rcv_errors; 1244 dev->stats.tx_errors = adapter->slic_stats.iface.xmt_errors; 1245 dev->stats.rx_missed_errors = adapter->slic_stats.iface.rcv_discards; 1246 dev->stats.tx_heartbeat_errors = 0; 1247 dev->stats.tx_aborted_errors = 0; 1248 dev->stats.tx_window_errors = 0; 1249 dev->stats.tx_fifo_errors = 0; 1250 dev->stats.rx_frame_errors = 0; 1251 dev->stats.rx_length_errors = 0; 1252 1253 return &dev->stats; 1254} 1255 1256/* 1257 * Allocate a mcast_address structure to hold the multicast address. 1258 * Link it in. 1259 */ 1260static int slic_mcast_add_list(struct adapter *adapter, char *address) 1261{ 1262 struct mcast_address *mcaddr, *mlist; 1263 1264 /* Check to see if it already exists */ 1265 mlist = adapter->mcastaddrs; 1266 while (mlist) { 1267 if (!compare_ether_addr(mlist->address, address)) 1268 return STATUS_SUCCESS; 1269 mlist = mlist->next; 1270 } 1271 1272 /* Doesn't already exist. Allocate a structure to hold it */ 1273 mcaddr = kmalloc(sizeof(struct mcast_address), GFP_ATOMIC); 1274 if (mcaddr == NULL) 1275 return 1; 1276 1277 memcpy(mcaddr->address, address, 6); 1278 1279 mcaddr->next = adapter->mcastaddrs; 1280 adapter->mcastaddrs = mcaddr; 1281 1282 return STATUS_SUCCESS; 1283} 1284 1285/* 1286 * Functions to obtain the CRC corresponding to the destination mac address. 1287 * This is a standard ethernet CRC in that it is a 32-bit, reflected CRC using 1288 * the polynomial: 1289 * x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + 1290 * x^4 + x^2 + x^1. 1291 * 1292 * After the CRC for the 6 bytes is generated (but before the value is 1293 * complemented), 1294 * we must then transpose the value and return bits 30-23. 1295 * 1296 */ 1297static u32 slic_crc_table[256]; /* Table of CRCs for all possible byte values */ 1298static u32 slic_crc_init; /* Is table initialized */ 1299 1300/* 1301 * Contruct the CRC32 table 1302 */ 1303static void slic_mcast_init_crc32(void) 1304{ 1305 u32 c; /* CRC shit reg */ 1306 u32 e = 0; /* Poly X-or pattern */ 1307 int i; /* counter */ 1308 int k; /* byte being shifted into crc */ 1309 1310 static int p[] = { 0, 1, 2, 4, 5, 7, 8, 10, 11, 12, 16, 22, 23, 26 }; 1311 1312 for (i = 0; i < ARRAY_SIZE(p); i++) 1313 e |= 1L << (31 - p[i]); 1314 1315 for (i = 1; i < 256; i++) { 1316 c = i; 1317 for (k = 8; k; k--) 1318 c = c & 1 ? (c >> 1) ^ e : c >> 1; 1319 slic_crc_table[i] = c; 1320 } 1321} 1322 1323/* 1324 * Return the MAC hast as described above. 1325 */ 1326static unsigned char slic_mcast_get_mac_hash(char *macaddr) 1327{ 1328 u32 crc; 1329 char *p; 1330 int i; 1331 unsigned char machash = 0; 1332 1333 if (!slic_crc_init) { 1334 slic_mcast_init_crc32(); 1335 slic_crc_init = 1; 1336 } 1337 1338 crc = 0xFFFFFFFF; /* Preload shift register, per crc-32 spec */ 1339 for (i = 0, p = macaddr; i < 6; ++p, ++i) 1340 crc = (crc >> 8) ^ slic_crc_table[(crc ^ *p) & 0xFF]; 1341 1342 /* Return bits 1-8, transposed */ 1343 for (i = 1; i < 9; i++) 1344 machash |= (((crc >> i) & 1) << (8 - i)); 1345 1346 return machash; 1347} 1348 1349static void slic_mcast_set_bit(struct adapter *adapter, char *address) 1350{ 1351 unsigned char crcpoly; 1352 1353 /* Get the CRC polynomial for the mac address */ 1354 crcpoly = slic_mcast_get_mac_hash(address); 1355 1356 /* We only have space on the SLIC for 64 entries. Lop 1357 * off the top two bits. (2^6 = 64) 1358 */ 1359 crcpoly &= 0x3F; 1360 1361 /* OR in the new bit into our 64 bit mask. */ 1362 adapter->mcastmask |= (u64) 1 << crcpoly; 1363} 1364 1365static void slic_mcast_set_list(struct net_device *dev) 1366{ 1367 struct adapter *adapter = netdev_priv(dev); 1368 int status = STATUS_SUCCESS; 1369 char *addresses; 1370 struct dev_mc_list *mc_list; 1371 1372 ASSERT(adapter); 1373 1374 netdev_for_each_mc_addr(mc_list, dev) { 1375 addresses = (char *) &mc_list->dmi_addr; 1376 status = slic_mcast_add_list(adapter, addresses); 1377 if (status != STATUS_SUCCESS) 1378 break; 1379 slic_mcast_set_bit(adapter, addresses); 1380 } 1381 1382 if (adapter->devflags_prev != dev->flags) { 1383 adapter->macopts = MAC_DIRECTED; 1384 if (dev->flags) { 1385 if (dev->flags & IFF_BROADCAST) 1386 adapter->macopts |= MAC_BCAST; 1387 if (dev->flags & IFF_PROMISC) 1388 adapter->macopts |= MAC_PROMISC; 1389 if (dev->flags & IFF_ALLMULTI) 1390 adapter->macopts |= MAC_ALLMCAST; 1391 if (dev->flags & IFF_MULTICAST) 1392 adapter->macopts |= MAC_MCAST; 1393 } 1394 adapter->devflags_prev = dev->flags; 1395 slic_config_set(adapter, true); 1396 } else { 1397 if (status == STATUS_SUCCESS) 1398 slic_mcast_set_mask(adapter); 1399 } 1400 return; 1401} 1402 1403static void slic_mcast_set_mask(struct adapter *adapter) 1404{ 1405 __iomem struct slic_regs *slic_regs = adapter->slic_regs; 1406 1407 if (adapter->macopts & (MAC_ALLMCAST | MAC_PROMISC)) { 1408 /* Turn on all multicast addresses. We have to do this for 1409 * promiscuous mode as well as ALLMCAST mode. It saves the 1410 * Microcode from having to keep state about the MAC 1411 * configuration. 1412 */ 1413 slic_reg32_write(&slic_regs->slic_mcastlow, 0xFFFFFFFF, FLUSH); 1414 slic_reg32_write(&slic_regs->slic_mcasthigh, 0xFFFFFFFF, 1415 FLUSH); 1416 } else { 1417 /* Commit our multicast mast to the SLIC by writing to the 1418 * multicast address mask registers 1419 */ 1420 slic_reg32_write(&slic_regs->slic_mcastlow, 1421 (u32)(adapter->mcastmask & 0xFFFFFFFF), FLUSH); 1422 slic_reg32_write(&slic_regs->slic_mcasthigh, 1423 (u32)((adapter->mcastmask >> 32) & 0xFFFFFFFF), FLUSH); 1424 } 1425} 1426 1427static void slic_timer_ping(ulong dev) 1428{ 1429 struct adapter *adapter; 1430 struct sliccard *card; 1431 1432 ASSERT(dev); 1433 adapter = netdev_priv((struct net_device *)dev); 1434 ASSERT(adapter); 1435 card = adapter->card; 1436 ASSERT(card); 1437 1438 adapter->pingtimer.expires = jiffies + (PING_TIMER_INTERVAL * HZ); 1439 add_timer(&adapter->pingtimer); 1440} 1441 1442/* 1443 * slic_if_init 1444 * 1445 * Perform initialization of our slic interface. 1446 * 1447 */ 1448static int slic_if_init(struct adapter *adapter) 1449{ 1450 struct sliccard *card = adapter->card; 1451 struct net_device *dev = adapter->netdev; 1452 __iomem struct slic_regs *slic_regs = adapter->slic_regs; 1453 struct slic_shmem *pshmem; 1454 int status = 0; 1455 1456 ASSERT(card); 1457 1458 /* adapter should be down at this point */ 1459 if (adapter->state != ADAPT_DOWN) { 1460 dev_err(&dev->dev, "%s: adapter->state != ADAPT_DOWN\n", 1461 __func__); 1462 return -EIO; 1463 } 1464 ASSERT(adapter->linkstate == LINK_DOWN); 1465 1466 adapter->devflags_prev = dev->flags; 1467 adapter->macopts = MAC_DIRECTED; 1468 if (dev->flags) { 1469 if (dev->flags & IFF_BROADCAST) 1470 adapter->macopts |= MAC_BCAST; 1471 if (dev->flags & IFF_PROMISC) 1472 adapter->macopts |= MAC_PROMISC; 1473 if (dev->flags & IFF_ALLMULTI) 1474 adapter->macopts |= MAC_ALLMCAST; 1475 if (dev->flags & IFF_MULTICAST) 1476 adapter->macopts |= MAC_MCAST; 1477 } 1478 status = slic_adapter_allocresources(adapter); 1479 if (status != STATUS_SUCCESS) { 1480 dev_err(&dev->dev, 1481 "%s: slic_adapter_allocresources FAILED %x\n", 1482 __func__, status); 1483 slic_adapter_freeresources(adapter); 1484 return status; 1485 } 1486 1487 if (!adapter->queues_initialized) { 1488 if (slic_rspqueue_init(adapter)) 1489 return -ENOMEM; 1490 if (slic_cmdq_init(adapter)) 1491 return -ENOMEM; 1492 if (slic_rcvqueue_init(adapter)) 1493 return -ENOMEM; 1494 adapter->queues_initialized = 1; 1495 } 1496 1497 slic_reg32_write(&slic_regs->slic_icr, ICR_INT_OFF, FLUSH); 1498 mdelay(1); 1499 1500 if (!adapter->isp_initialized) { 1501 pshmem = (struct slic_shmem *)adapter->phys_shmem; 1502 1503 spin_lock_irqsave(&adapter->bit64reglock.lock, 1504 adapter->bit64reglock.flags); 1505 1506#if defined(CONFIG_X86_64) 1507 slic_reg32_write(&slic_regs->slic_addr_upper, 1508 SLIC_GET_ADDR_HIGH(&pshmem->isr), DONT_FLUSH); 1509 slic_reg32_write(&slic_regs->slic_isp, 1510 SLIC_GET_ADDR_LOW(&pshmem->isr), FLUSH); 1511#elif defined(CONFIG_X86) 1512 slic_reg32_write(&slic_regs->slic_addr_upper, 0, DONT_FLUSH); 1513 slic_reg32_write(&slic_regs->slic_isp, (u32)&pshmem->isr, FLUSH); 1514#else 1515 Stop Compilations 1516#endif 1517 spin_unlock_irqrestore(&adapter->bit64reglock.lock, 1518 adapter->bit64reglock.flags); 1519 adapter->isp_initialized = 1; 1520 } 1521 1522 adapter->state = ADAPT_UP; 1523 if (!card->loadtimerset) { 1524 init_timer(&card->loadtimer); 1525 card->loadtimer.expires = 1526 jiffies + (SLIC_LOADTIMER_PERIOD * HZ); 1527 card->loadtimer.data = (ulong) card; 1528 card->loadtimer.function = &slic_timer_load_check; 1529 add_timer(&card->loadtimer); 1530 1531 card->loadtimerset = 1; 1532 } 1533 1534 if (!adapter->pingtimerset) { 1535 init_timer(&adapter->pingtimer); 1536 adapter->pingtimer.expires = 1537 jiffies + (PING_TIMER_INTERVAL * HZ); 1538 adapter->pingtimer.data = (ulong) dev; 1539 adapter->pingtimer.function = &slic_timer_ping; 1540 add_timer(&adapter->pingtimer); 1541 adapter->pingtimerset = 1; 1542 adapter->card->pingstatus = ISR_PINGMASK; 1543 } 1544 1545 /* 1546 * clear any pending events, then enable interrupts 1547 */ 1548 adapter->isrcopy = 0; 1549 adapter->pshmem->isr = 0; 1550 slic_reg32_write(&slic_regs->slic_isr, 0, FLUSH); 1551 slic_reg32_write(&slic_regs->slic_icr, ICR_INT_ON, FLUSH); 1552 1553 slic_link_config(adapter, LINK_AUTOSPEED, LINK_AUTOD); 1554 slic_link_event_handler(adapter); 1555 1556 return STATUS_SUCCESS; 1557} 1558 1559static void slic_unmap_mmio_space(struct adapter *adapter) 1560{ 1561 if (adapter->slic_regs) 1562 iounmap(adapter->slic_regs); 1563 adapter->slic_regs = NULL; 1564} 1565 1566static int slic_adapter_allocresources(struct adapter *adapter) 1567{ 1568 if (!adapter->intrregistered) { 1569 int retval; 1570 1571 spin_unlock_irqrestore(&slic_global.driver_lock.lock, 1572 slic_global.driver_lock.flags); 1573 1574 retval = request_irq(adapter->netdev->irq, 1575 &slic_interrupt, 1576 IRQF_SHARED, 1577 adapter->netdev->name, adapter->netdev); 1578 1579 spin_lock_irqsave(&slic_global.driver_lock.lock, 1580 slic_global.driver_lock.flags); 1581 1582 if (retval) { 1583 dev_err(&adapter->netdev->dev, 1584 "request_irq (%s) FAILED [%x]\n", 1585 adapter->netdev->name, retval); 1586 return retval; 1587 } 1588 adapter->intrregistered = 1; 1589 } 1590 return STATUS_SUCCESS; 1591} 1592 1593static void slic_config_pci(struct pci_dev *pcidev) 1594{ 1595 u16 pci_command; 1596 u16 new_command; 1597 1598 pci_read_config_word(pcidev, PCI_COMMAND, &pci_command); 1599 1600 new_command = pci_command | PCI_COMMAND_MASTER 1601 | PCI_COMMAND_MEMORY 1602 | PCI_COMMAND_INVALIDATE 1603 | PCI_COMMAND_PARITY | PCI_COMMAND_SERR | PCI_COMMAND_FAST_BACK; 1604 if (pci_command != new_command) 1605 pci_write_config_word(pcidev, PCI_COMMAND, new_command); 1606} 1607 1608static void slic_adapter_freeresources(struct adapter *adapter) 1609{ 1610 slic_init_cleanup(adapter); 1611 memset(&adapter->stats, 0, sizeof(struct net_device_stats)); 1612 adapter->error_interrupts = 0; 1613 adapter->rcv_interrupts = 0; 1614 adapter->xmit_interrupts = 0; 1615 adapter->linkevent_interrupts = 0; 1616 adapter->upr_interrupts = 0; 1617 adapter->num_isrs = 0; 1618 adapter->xmit_completes = 0; 1619 adapter->rcv_broadcasts = 0; 1620 adapter->rcv_multicasts = 0; 1621 adapter->rcv_unicasts = 0; 1622} 1623 1624/* 1625 * slic_link_config 1626 * 1627 * Write phy control to configure link duplex/speed 1628 * 1629 */ 1630static void slic_link_config(struct adapter *adapter, 1631 u32 linkspeed, u32 linkduplex) 1632{ 1633 u32 __iomem *wphy; 1634 u32 speed; 1635 u32 duplex; 1636 u32 phy_config; 1637 u32 phy_advreg; 1638 u32 phy_gctlreg; 1639 1640 if (adapter->state != ADAPT_UP) 1641 return; 1642 1643 ASSERT((adapter->devid == SLIC_1GB_DEVICE_ID) 1644 || (adapter->devid == SLIC_2GB_DEVICE_ID)); 1645 1646 if (linkspeed > LINK_1000MB) 1647 linkspeed = LINK_AUTOSPEED; 1648 if (linkduplex > LINK_AUTOD) 1649 linkduplex = LINK_AUTOD; 1650 1651 wphy = &adapter->slic_regs->slic_wphy; 1652 1653 if ((linkspeed == LINK_AUTOSPEED) || (linkspeed == LINK_1000MB)) { 1654 if (adapter->flags & ADAPT_FLAGS_FIBERMEDIA) { 1655 /* We've got a fiber gigabit interface, and register 1656 * 4 is different in fiber mode than in copper mode 1657 */ 1658 1659 /* advertise FD only @1000 Mb */ 1660 phy_advreg = (MIICR_REG_4 | (PAR_ADV1000XFD)); 1661 /* enable PAUSE frames */ 1662 phy_advreg |= PAR_ASYMPAUSE_FIBER; 1663 slic_reg32_write(wphy, phy_advreg, FLUSH); 1664 1665 if (linkspeed == LINK_AUTOSPEED) { 1666 /* reset phy, enable auto-neg */ 1667 phy_config = 1668 (MIICR_REG_PCR | 1669 (PCR_RESET | PCR_AUTONEG | 1670 PCR_AUTONEG_RST)); 1671 slic_reg32_write(wphy, phy_config, FLUSH); 1672 } else { /* forced 1000 Mb FD*/ 1673 /* power down phy to break link 1674 this may not work) */ 1675 phy_config = (MIICR_REG_PCR | PCR_POWERDOWN); 1676 slic_reg32_write(wphy, phy_config, FLUSH); 1677 /* wait, Marvell says 1 sec, 1678 try to get away with 10 ms */ 1679 mdelay(10); 1680 1681 /* disable auto-neg, set speed/duplex, 1682 soft reset phy, powerup */ 1683 phy_config = 1684 (MIICR_REG_PCR | 1685 (PCR_RESET | PCR_SPEED_1000 | 1686 PCR_DUPLEX_FULL)); 1687 slic_reg32_write(wphy, phy_config, FLUSH); 1688 } 1689 } else { /* copper gigabit */ 1690 1691 /* Auto-Negotiate or 1000 Mb must be auto negotiated 1692 * We've got a copper gigabit interface, and 1693 * register 4 is different in copper mode than 1694 * in fiber mode 1695 */ 1696 if (linkspeed == LINK_AUTOSPEED) { 1697 /* advertise 10/100 Mb modes */ 1698 phy_advreg = 1699 (MIICR_REG_4 | 1700 (PAR_ADV100FD | PAR_ADV100HD | PAR_ADV10FD 1701 | PAR_ADV10HD)); 1702 } else { 1703 /* linkspeed == LINK_1000MB - 1704 don't advertise 10/100 Mb modes */ 1705 phy_advreg = MIICR_REG_4; 1706 } 1707 /* enable PAUSE frames */ 1708 phy_advreg |= PAR_ASYMPAUSE; 1709 /* required by the Cicada PHY */ 1710 phy_advreg |= PAR_802_3; 1711 slic_reg32_write(wphy, phy_advreg, FLUSH); 1712 /* advertise FD only @1000 Mb */ 1713 phy_gctlreg = (MIICR_REG_9 | (PGC_ADV1000FD)); 1714 slic_reg32_write(wphy, phy_gctlreg, FLUSH); 1715 1716 if (adapter->subsysid != SLIC_1GB_CICADA_SUBSYS_ID) { 1717 /* if a Marvell PHY 1718 enable auto crossover */ 1719 phy_config = 1720 (MIICR_REG_16 | (MRV_REG16_XOVERON)); 1721 slic_reg32_write(wphy, phy_config, FLUSH); 1722 1723 /* reset phy, enable auto-neg */ 1724 phy_config = 1725 (MIICR_REG_PCR | 1726 (PCR_RESET | PCR_AUTONEG | 1727 PCR_AUTONEG_RST)); 1728 slic_reg32_write(wphy, phy_config, FLUSH); 1729 } else { /* it's a Cicada PHY */ 1730 /* enable and restart auto-neg (don't reset) */ 1731 phy_config = 1732 (MIICR_REG_PCR | 1733 (PCR_AUTONEG | PCR_AUTONEG_RST)); 1734 slic_reg32_write(wphy, phy_config, FLUSH); 1735 } 1736 } 1737 } else { 1738 /* Forced 10/100 */ 1739 if (linkspeed == LINK_10MB) 1740 speed = 0; 1741 else 1742 speed = PCR_SPEED_100; 1743 if (linkduplex == LINK_HALFD) 1744 duplex = 0; 1745 else 1746 duplex = PCR_DUPLEX_FULL; 1747 1748 if (adapter->subsysid != SLIC_1GB_CICADA_SUBSYS_ID) { 1749 /* if a Marvell PHY 1750 disable auto crossover */ 1751 phy_config = (MIICR_REG_16 | (MRV_REG16_XOVEROFF)); 1752 slic_reg32_write(wphy, phy_config, FLUSH); 1753 } 1754 1755 /* power down phy to break link (this may not work) */ 1756 phy_config = (MIICR_REG_PCR | (PCR_POWERDOWN | speed | duplex)); 1757 slic_reg32_write(wphy, phy_config, FLUSH); 1758 1759 /* wait, Marvell says 1 sec, try to get away with 10 ms */ 1760 mdelay(10); 1761 1762 if (adapter->subsysid != SLIC_1GB_CICADA_SUBSYS_ID) { 1763 /* if a Marvell PHY 1764 disable auto-neg, set speed, 1765 soft reset phy, powerup */ 1766 phy_config = 1767 (MIICR_REG_PCR | (PCR_RESET | speed | duplex)); 1768 slic_reg32_write(wphy, phy_config, FLUSH); 1769 } else { /* it's a Cicada PHY */ 1770 /* disable auto-neg, set speed, powerup */ 1771 phy_config = (MIICR_REG_PCR | (speed | duplex)); 1772 slic_reg32_write(wphy, phy_config, FLUSH); 1773 } 1774 } 1775} 1776 1777static void slic_card_cleanup(struct sliccard *card) 1778{ 1779 if (card->loadtimerset) { 1780 card->loadtimerset = 0; 1781 del_timer(&card->loadtimer); 1782 } 1783 1784 slic_debug_card_destroy(card); 1785 1786 kfree(card); 1787} 1788 1789static int slic_card_download_gbrcv(struct adapter *adapter) 1790{ 1791 const struct firmware *fw; 1792 const char *file = ""; 1793 int ret; 1794 __iomem struct slic_regs *slic_regs = adapter->slic_regs; 1795 u32 codeaddr; 1796 u32 instruction; 1797 int index = 0; 1798 u32 rcvucodelen = 0; 1799 1800 switch (adapter->devid) { 1801 case SLIC_2GB_DEVICE_ID: 1802 file = "slicoss/oasisrcvucode.sys"; 1803 break; 1804 case SLIC_1GB_DEVICE_ID: 1805 file = "slicoss/gbrcvucode.sys"; 1806 break; 1807 default: 1808 ASSERT(0); 1809 break; 1810 } 1811 1812 ret = request_firmware(&fw, file, &adapter->pcidev->dev); 1813 if (ret) { 1814 dev_err(&adapter->pcidev->dev, 1815 "SLICOSS: Failed to load firmware %s\n", file); 1816 return ret; 1817 } 1818 1819 rcvucodelen = *(u32 *)(fw->data + index); 1820 index += 4; 1821 switch (adapter->devid) { 1822 case SLIC_2GB_DEVICE_ID: 1823 if (rcvucodelen != OasisRcvUCodeLen) 1824 return -EINVAL; 1825 break; 1826 case SLIC_1GB_DEVICE_ID: 1827 if (rcvucodelen != GBRcvUCodeLen) 1828 return -EINVAL; 1829 break; 1830 default: 1831 ASSERT(0); 1832 break; 1833 } 1834 /* start download */ 1835 slic_reg32_write(&slic_regs->slic_rcv_wcs, SLIC_RCVWCS_BEGIN, FLUSH); 1836 /* download the rcv sequencer ucode */ 1837 for (codeaddr = 0; codeaddr < rcvucodelen; codeaddr++) { 1838 /* write out instruction address */ 1839 slic_reg32_write(&slic_regs->slic_rcv_wcs, codeaddr, FLUSH); 1840 1841 instruction = *(u32 *)(fw->data + index); 1842 index += 4; 1843 /* write out the instruction data low addr */ 1844 slic_reg32_write(&slic_regs->slic_rcv_wcs, instruction, FLUSH); 1845 1846 instruction = *(u8 *)(fw->data + index); 1847 index++; 1848 /* write out the instruction data high addr */ 1849 slic_reg32_write(&slic_regs->slic_rcv_wcs, (u8)instruction, 1850 FLUSH); 1851 } 1852 1853 /* download finished */ 1854 release_firmware(fw); 1855 slic_reg32_write(&slic_regs->slic_rcv_wcs, SLIC_RCVWCS_FINISH, FLUSH); 1856 return 0; 1857} 1858 1859MODULE_FIRMWARE("slicoss/oasisrcvucode.sys"); 1860MODULE_FIRMWARE("slicoss/gbrcvucode.sys"); 1861 1862static int slic_card_download(struct adapter *adapter) 1863{ 1864 const struct firmware *fw; 1865 const char *file = ""; 1866 int ret; 1867 u32 section; 1868 int thissectionsize; 1869 int codeaddr; 1870 __iomem struct slic_regs *slic_regs = adapter->slic_regs; 1871 u32 instruction; 1872 u32 baseaddress; 1873 u32 i; 1874 u32 numsects = 0; 1875 u32 sectsize[3]; 1876 u32 sectstart[3]; 1877 int ucode_start, index = 0; 1878 1879 switch (adapter->devid) { 1880 case SLIC_2GB_DEVICE_ID: 1881 file = "slicoss/oasisdownload.sys"; 1882 break; 1883 case SLIC_1GB_DEVICE_ID: 1884 file = "slicoss/gbdownload.sys"; 1885 break; 1886 default: 1887 ASSERT(0); 1888 break; 1889 } 1890 ret = request_firmware(&fw, file, &adapter->pcidev->dev); 1891 if (ret) { 1892 dev_err(&adapter->pcidev->dev, 1893 "SLICOSS: Failed to load firmware %s\n", file); 1894 return ret; 1895 } 1896 numsects = *(u32 *)(fw->data + index); 1897 index += 4; 1898 ASSERT(numsects <= 3); 1899 for (i = 0; i < numsects; i++) { 1900 sectsize[i] = *(u32 *)(fw->data + index); 1901 index += 4; 1902 } 1903 for (i = 0; i < numsects; i++) { 1904 sectstart[i] = *(u32 *)(fw->data + index); 1905 index += 4; 1906 } 1907 ucode_start = index; 1908 instruction = *(u32 *)(fw->data + index); 1909 index += 4; 1910 for (section = 0; section < numsects; section++) { 1911 baseaddress = sectstart[section]; 1912 thissectionsize = sectsize[section] >> 3; 1913 1914 for (codeaddr = 0; codeaddr < thissectionsize; codeaddr++) { 1915 /* Write out instruction address */ 1916 slic_reg32_write(&slic_regs->slic_wcs, 1917 baseaddress + codeaddr, FLUSH); 1918 /* Write out instruction to low addr */ 1919 slic_reg32_write(&slic_regs->slic_wcs, instruction, FLUSH); 1920 instruction = *(u32 *)(fw->data + index); 1921 index += 4; 1922 1923 /* Write out instruction to high addr */ 1924 slic_reg32_write(&slic_regs->slic_wcs, instruction, FLUSH); 1925 instruction = *(u32 *)(fw->data + index); 1926 index += 4; 1927 } 1928 } 1929 index = ucode_start; 1930 for (section = 0; section < numsects; section++) { 1931 instruction = *(u32 *)(fw->data + index); 1932 baseaddress = sectstart[section]; 1933 if (baseaddress < 0x8000) 1934 continue; 1935 thissectionsize = sectsize[section] >> 3; 1936 1937 for (codeaddr = 0; codeaddr < thissectionsize; codeaddr++) { 1938 /* Write out instruction address */ 1939 slic_reg32_write(&slic_regs->slic_wcs, 1940 SLIC_WCS_COMPARE | (baseaddress + codeaddr), 1941 FLUSH); 1942 /* Write out instruction to low addr */ 1943 slic_reg32_write(&slic_regs->slic_wcs, instruction, 1944 FLUSH); 1945 instruction = *(u32 *)(fw->data + index); 1946 index += 4; 1947 /* Write out instruction to high addr */ 1948 slic_reg32_write(&slic_regs->slic_wcs, instruction, 1949 FLUSH); 1950 instruction = *(u32 *)(fw->data + index); 1951 index += 4; 1952 1953 /* Check SRAM location zero. If it is non-zero. Abort.*/ 1954/* failure = readl((u32 __iomem *)&slic_regs->slic_reset); 1955 if (failure) { 1956 release_firmware(fw); 1957 return -EIO; 1958 }*/ 1959 } 1960 } 1961 release_firmware(fw); 1962 /* Everything OK, kick off the card */ 1963 mdelay(10); 1964 slic_reg32_write(&slic_regs->slic_wcs, SLIC_WCS_START, FLUSH); 1965 1966 /* stall for 20 ms, long enough for ucode to init card 1967 and reach mainloop */ 1968 mdelay(20); 1969 1970 return STATUS_SUCCESS; 1971} 1972 1973MODULE_FIRMWARE("slicoss/oasisdownload.sys"); 1974MODULE_FIRMWARE("slicoss/gbdownload.sys"); 1975 1976static void slic_adapter_set_hwaddr(struct adapter *adapter) 1977{ 1978 struct sliccard *card = adapter->card; 1979 1980 if ((adapter->card) && (card->config_set)) { 1981 memcpy(adapter->macaddr, 1982 card->config.MacInfo[adapter->functionnumber].macaddrA, 1983 sizeof(struct slic_config_mac)); 1984 if (!(adapter->currmacaddr[0] || adapter->currmacaddr[1] || 1985 adapter->currmacaddr[2] || adapter->currmacaddr[3] || 1986 adapter->currmacaddr[4] || adapter->currmacaddr[5])) { 1987 memcpy(adapter->currmacaddr, adapter->macaddr, 6); 1988 } 1989 if (adapter->netdev) { 1990 memcpy(adapter->netdev->dev_addr, adapter->currmacaddr, 1991 6); 1992 } 1993 } 1994} 1995 1996static void slic_intagg_set(struct adapter *adapter, u32 value) 1997{ 1998 slic_reg32_write(&adapter->slic_regs->slic_intagg, value, FLUSH); 1999 adapter->card->loadlevel_current = value; 2000} 2001 2002static int slic_card_init(struct sliccard *card, struct adapter *adapter) 2003{ 2004 __iomem struct slic_regs *slic_regs = adapter->slic_regs; 2005 struct slic_eeprom *peeprom; 2006 struct oslic_eeprom *pOeeprom; 2007 dma_addr_t phys_config; 2008 u32 phys_configh; 2009 u32 phys_configl; 2010 u32 i = 0; 2011 struct slic_shmem *pshmem; 2012 int status; 2013 uint macaddrs = card->card_size; 2014 ushort eecodesize; 2015 ushort dramsize; 2016 ushort ee_chksum; 2017 ushort calc_chksum; 2018 struct slic_config_mac *pmac; 2019 unsigned char fruformat; 2020 unsigned char oemfruformat; 2021 struct atk_fru *patkfru; 2022 union oemfru *poemfru; 2023 2024 /* Reset everything except PCI configuration space */ 2025 slic_soft_reset(adapter); 2026 2027 /* Download the microcode */ 2028 status = slic_card_download(adapter); 2029 2030 if (status != STATUS_SUCCESS) { 2031 dev_err(&adapter->pcidev->dev, 2032 "download failed bus %d slot %d\n", 2033 adapter->busnumber, adapter->slotnumber); 2034 return status; 2035 } 2036 2037 if (!card->config_set) { 2038 peeprom = pci_alloc_consistent(adapter->pcidev, 2039 sizeof(struct slic_eeprom), 2040 &phys_config); 2041 2042 phys_configl = SLIC_GET_ADDR_LOW(phys_config); 2043 phys_configh = SLIC_GET_ADDR_HIGH(phys_config); 2044 2045 if (!peeprom) { 2046 dev_err(&adapter->pcidev->dev, 2047 "eeprom read failed to get memory " 2048 "bus %d slot %d\n", adapter->busnumber, 2049 adapter->slotnumber); 2050 return -ENOMEM; 2051 } else { 2052 memset(peeprom, 0, sizeof(struct slic_eeprom)); 2053 } 2054 slic_reg32_write(&slic_regs->slic_icr, ICR_INT_OFF, FLUSH); 2055 mdelay(1); 2056 pshmem = (struct slic_shmem *)adapter->phys_shmem; 2057 2058 spin_lock_irqsave(&adapter->bit64reglock.lock, 2059 adapter->bit64reglock.flags); 2060 slic_reg32_write(&slic_regs->slic_addr_upper, 0, DONT_FLUSH); 2061 slic_reg32_write(&slic_regs->slic_isp, 2062 SLIC_GET_ADDR_LOW(&pshmem->isr), FLUSH); 2063 spin_unlock_irqrestore(&adapter->bit64reglock.lock, 2064 adapter->bit64reglock.flags); 2065 2066 slic_config_get(adapter, phys_configl, phys_configh); 2067 2068 for (;;) { 2069 if (adapter->pshmem->isr) { 2070 if (adapter->pshmem->isr & ISR_UPC) { 2071 adapter->pshmem->isr = 0; 2072 slic_reg64_write(adapter, 2073 &slic_regs->slic_isp, 0, 2074 &slic_regs->slic_addr_upper, 2075 0, FLUSH); 2076 slic_reg32_write(&slic_regs->slic_isr, 2077 0, FLUSH); 2078 2079 slic_upr_request_complete(adapter, 0); 2080 break; 2081 } else { 2082 adapter->pshmem->isr = 0; 2083 slic_reg32_write(&slic_regs->slic_isr, 2084 0, FLUSH); 2085 } 2086 } else { 2087 mdelay(1); 2088 i++; 2089 if (i > 5000) { 2090 dev_err(&adapter->pcidev->dev, 2091 "%d config data fetch timed out!\n", 2092 adapter->port); 2093 slic_reg64_write(adapter, 2094 &slic_regs->slic_isp, 0, 2095 &slic_regs->slic_addr_upper, 2096 0, FLUSH); 2097 return -EINVAL; 2098 } 2099 } 2100 } 2101 2102 switch (adapter->devid) { 2103 /* Oasis card */ 2104 case SLIC_2GB_DEVICE_ID: 2105 /* extract EEPROM data and pointers to EEPROM data */ 2106 pOeeprom = (struct oslic_eeprom *) peeprom; 2107 eecodesize = pOeeprom->EecodeSize; 2108 dramsize = pOeeprom->DramSize; 2109 pmac = pOeeprom->MacInfo; 2110 fruformat = pOeeprom->FruFormat; 2111 patkfru = &pOeeprom->AtkFru; 2112 oemfruformat = pOeeprom->OemFruFormat; 2113 poemfru = &pOeeprom->OemFru; 2114 macaddrs = 2; 2115 /* Minor kludge for Oasis card 2116 get 2 MAC addresses from the 2117 EEPROM to ensure that function 1 2118 gets the Port 1 MAC address */ 2119 break; 2120 default: 2121 /* extract EEPROM data and pointers to EEPROM data */ 2122 eecodesize = peeprom->EecodeSize; 2123 dramsize = peeprom->DramSize; 2124 pmac = peeprom->u2.mac.MacInfo; 2125 fruformat = peeprom->FruFormat; 2126 patkfru = &peeprom->AtkFru; 2127 oemfruformat = peeprom->OemFruFormat; 2128 poemfru = &peeprom->OemFru; 2129 break; 2130 } 2131 2132 card->config.EepromValid = false; 2133 2134 /* see if the EEPROM is valid by checking it's checksum */ 2135 if ((eecodesize <= MAX_EECODE_SIZE) && 2136 (eecodesize >= MIN_EECODE_SIZE)) { 2137 2138 ee_chksum = 2139 *(u16 *) ((char *) peeprom + (eecodesize - 2)); 2140 /* 2141 calculate the EEPROM checksum 2142 */ 2143 calc_chksum = 2144 ~slic_eeprom_cksum((char *) peeprom, 2145 (eecodesize - 2)); 2146 /* 2147 if the ucdoe chksum flag bit worked, 2148 we wouldn't need this shit 2149 */ 2150 if (ee_chksum == calc_chksum) 2151 card->config.EepromValid = true; 2152 } 2153 /* copy in the DRAM size */ 2154 card->config.DramSize = dramsize; 2155 2156 /* copy in the MAC address(es) */ 2157 for (i = 0; i < macaddrs; i++) { 2158 memcpy(&card->config.MacInfo[i], 2159 &pmac[i], sizeof(struct slic_config_mac)); 2160 } 2161 2162 /* copy the Alacritech FRU information */ 2163 card->config.FruFormat = fruformat; 2164 memcpy(&card->config.AtkFru, patkfru, 2165 sizeof(struct atk_fru)); 2166 2167 pci_free_consistent(adapter->pcidev, 2168 sizeof(struct slic_eeprom), 2169 peeprom, phys_config); 2170 2171 if ((!card->config.EepromValid) && 2172 (adapter->reg_params.fail_on_bad_eeprom)) { 2173 slic_reg64_write(adapter, &slic_regs->slic_isp, 0, 2174 &slic_regs->slic_addr_upper, 2175 0, FLUSH); 2176 dev_err(&adapter->pcidev->dev, 2177 "unsupported CONFIGURATION EEPROM invalid\n"); 2178 return -EINVAL; 2179 } 2180 2181 card->config_set = 1; 2182 } 2183 2184 if (slic_card_download_gbrcv(adapter)) { 2185 dev_err(&adapter->pcidev->dev, 2186 "unable to download GB receive microcode\n"); 2187 return -EINVAL; 2188 } 2189 2190 if (slic_global.dynamic_intagg) 2191 slic_intagg_set(adapter, 0); 2192 else 2193 slic_intagg_set(adapter, intagg_delay); 2194 2195 /* 2196 * Initialize ping status to "ok" 2197 */ 2198 card->pingstatus = ISR_PINGMASK; 2199 2200 /* 2201 * Lastly, mark our card state as up and return success 2202 */ 2203 card->state = CARD_UP; 2204 card->reset_in_progress = 0; 2205 2206 return STATUS_SUCCESS; 2207} 2208 2209static u32 slic_card_locate(struct adapter *adapter) 2210{ 2211 struct sliccard *card = slic_global.slic_card; 2212 struct physcard *physcard = slic_global.phys_card; 2213 ushort card_hostid; 2214 u16 __iomem *hostid_reg; 2215 uint i; 2216 uint rdhostid_offset = 0; 2217 2218 switch (adapter->devid) { 2219 case SLIC_2GB_DEVICE_ID: 2220 rdhostid_offset = SLIC_RDHOSTID_2GB; 2221 break; 2222 case SLIC_1GB_DEVICE_ID: 2223 rdhostid_offset = SLIC_RDHOSTID_1GB; 2224 break; 2225 default: 2226 ASSERT(0); 2227 break; 2228 } 2229 2230 hostid_reg = 2231 (u16 __iomem *) (((u8 __iomem *) (adapter->slic_regs)) + 2232 rdhostid_offset); 2233 2234 /* read the 16 bit hostid from SRAM */ 2235 card_hostid = (ushort) readw(hostid_reg); 2236 2237 /* Initialize a new card structure if need be */ 2238 if (card_hostid == SLIC_HOSTID_DEFAULT) { 2239 card = kzalloc(sizeof(struct sliccard), GFP_KERNEL); 2240 if (card == NULL) 2241 return -ENOMEM; 2242 2243 card->next = slic_global.slic_card; 2244 slic_global.slic_card = card; 2245 card->busnumber = adapter->busnumber; 2246 card->slotnumber = adapter->slotnumber; 2247 2248 /* Find an available cardnum */ 2249 for (i = 0; i < SLIC_MAX_CARDS; i++) { 2250 if (slic_global.cardnuminuse[i] == 0) { 2251 slic_global.cardnuminuse[i] = 1; 2252 card->cardnum = i; 2253 break; 2254 } 2255 } 2256 slic_global.num_slic_cards++; 2257 2258 slic_debug_card_create(card); 2259 } else { 2260 /* Card exists, find the card this adapter belongs to */ 2261 while (card) { 2262 if (card->cardnum == card_hostid) 2263 break; 2264 card = card->next; 2265 } 2266 } 2267 2268 ASSERT(card); 2269 if (!card) 2270 return STATUS_FAILURE; 2271 /* Put the adapter in the card's adapter list */ 2272 ASSERT(card->adapter[adapter->port] == NULL); 2273 if (!card->adapter[adapter->port]) { 2274 card->adapter[adapter->port] = adapter; 2275 adapter->card = card; 2276 } 2277 2278 card->card_size = 1; /* one port per *logical* card */ 2279 2280 while (physcard) { 2281 for (i = 0; i < SLIC_MAX_PORTS; i++) { 2282 if (!physcard->adapter[i]) 2283 continue; 2284 else 2285 break; 2286 } 2287 ASSERT(i != SLIC_MAX_PORTS); 2288 if (physcard->adapter[i]->slotnumber == adapter->slotnumber) 2289 break; 2290 physcard = physcard->next; 2291 } 2292 if (!physcard) { 2293 /* no structure allocated for this physical card yet */ 2294 physcard = kzalloc(sizeof(struct physcard), GFP_ATOMIC); 2295 ASSERT(physcard); 2296 2297 physcard->next = slic_global.phys_card; 2298 slic_global.phys_card = physcard; 2299 physcard->adapters_allocd = 1; 2300 } else { 2301 physcard->adapters_allocd++; 2302 } 2303 /* Note - this is ZERO relative */ 2304 adapter->physport = physcard->adapters_allocd - 1; 2305 2306 ASSERT(physcard->adapter[adapter->physport] == NULL); 2307 physcard->adapter[adapter->physport] = adapter; 2308 adapter->physcard = physcard; 2309 2310 return 0; 2311} 2312 2313static void slic_soft_reset(struct adapter *adapter) 2314{ 2315 if (adapter->card->state == CARD_UP) { 2316 slic_reg32_write(&adapter->slic_regs->slic_quiesce, 0, FLUSH); 2317 mdelay(1); 2318 } 2319 2320 slic_reg32_write(&adapter->slic_regs->slic_reset, SLIC_RESET_MAGIC, 2321 FLUSH); 2322 mdelay(1); 2323} 2324 2325static void slic_config_set(struct adapter *adapter, bool linkchange) 2326{ 2327 u32 value; 2328 u32 RcrReset; 2329 __iomem struct slic_regs *slic_regs = adapter->slic_regs; 2330 2331 if (linkchange) { 2332 /* Setup MAC */ 2333 slic_mac_config(adapter); 2334 RcrReset = GRCR_RESET; 2335 } else { 2336 slic_mac_address_config(adapter); 2337 RcrReset = 0; 2338 } 2339 2340 if (adapter->linkduplex == LINK_FULLD) { 2341 /* setup xmtcfg */ 2342 value = (GXCR_RESET | /* Always reset */ 2343 GXCR_XMTEN | /* Enable transmit */ 2344 GXCR_PAUSEEN); /* Enable pause */ 2345 2346 slic_reg32_write(&slic_regs->slic_wxcfg, value, FLUSH); 2347 2348 /* Setup rcvcfg last */ 2349 value = (RcrReset | /* Reset, if linkchange */ 2350 GRCR_CTLEN | /* Enable CTL frames */ 2351 GRCR_ADDRAEN | /* Address A enable */ 2352 GRCR_RCVBAD | /* Rcv bad frames */ 2353 (GRCR_HASHSIZE << GRCR_HASHSIZE_SHIFT)); 2354 } else { 2355 /* setup xmtcfg */ 2356 value = (GXCR_RESET | /* Always reset */ 2357 GXCR_XMTEN); /* Enable transmit */ 2358 2359 slic_reg32_write(&slic_regs->slic_wxcfg, value, FLUSH); 2360 2361 /* Setup rcvcfg last */ 2362 value = (RcrReset | /* Reset, if linkchange */ 2363 GRCR_ADDRAEN | /* Address A enable */ 2364 GRCR_RCVBAD | /* Rcv bad frames */ 2365 (GRCR_HASHSIZE << GRCR_HASHSIZE_SHIFT)); 2366 } 2367 2368 if (adapter->state != ADAPT_DOWN) { 2369 /* Only enable receive if we are restarting or running */ 2370 value |= GRCR_RCVEN; 2371 } 2372 2373 if (adapter->macopts & MAC_PROMISC) 2374 value |= GRCR_RCVALL; 2375 2376 slic_reg32_write(&slic_regs->slic_wrcfg, value, FLUSH); 2377} 2378 2379/* 2380 * Turn off RCV and XMT, power down PHY 2381 */ 2382static void slic_config_clear(struct adapter *adapter) 2383{ 2384 u32 value; 2385 u32 phy_config; 2386 __iomem struct slic_regs *slic_regs = adapter->slic_regs; 2387 2388 /* Setup xmtcfg */ 2389 value = (GXCR_RESET | /* Always reset */ 2390 GXCR_PAUSEEN); /* Enable pause */ 2391 2392 slic_reg32_write(&slic_regs->slic_wxcfg, value, FLUSH); 2393 2394 value = (GRCR_RESET | /* Always reset */ 2395 GRCR_CTLEN | /* Enable CTL frames */ 2396 GRCR_ADDRAEN | /* Address A enable */ 2397 (GRCR_HASHSIZE << GRCR_HASHSIZE_SHIFT)); 2398 2399 slic_reg32_write(&slic_regs->slic_wrcfg, value, FLUSH); 2400 2401 /* power down phy */ 2402 phy_config = (MIICR_REG_PCR | (PCR_POWERDOWN)); 2403 slic_reg32_write(&slic_regs->slic_wphy, phy_config, FLUSH); 2404} 2405 2406static void slic_config_get(struct adapter *adapter, u32 config, 2407 u32 config_h) 2408{ 2409 int status; 2410 2411 status = slic_upr_request(adapter, 2412 SLIC_UPR_RCONFIG, 2413 (u32) config, (u32) config_h, 0, 0); 2414 ASSERT(status == 0); 2415} 2416 2417static void slic_mac_address_config(struct adapter *adapter) 2418{ 2419 u32 value; 2420 u32 value2; 2421 __iomem struct slic_regs *slic_regs = adapter->slic_regs; 2422 2423 value = *(u32 *) &adapter->currmacaddr[2]; 2424 value = ntohl(value); 2425 slic_reg32_write(&slic_regs->slic_wraddral, value, FLUSH); 2426 slic_reg32_write(&slic_regs->slic_wraddrbl, value, FLUSH); 2427 2428 value2 = (u32) ((adapter->currmacaddr[0] << 8 | 2429 adapter->currmacaddr[1]) & 0xFFFF); 2430 2431 slic_reg32_write(&slic_regs->slic_wraddrah, value2, FLUSH); 2432 slic_reg32_write(&slic_regs->slic_wraddrbh, value2, FLUSH); 2433 2434 /* Write our multicast mask out to the card. This is done */ 2435 /* here in addition to the slic_mcast_addr_set routine */ 2436 /* because ALL_MCAST may have been enabled or disabled */ 2437 slic_mcast_set_mask(adapter); 2438} 2439 2440static void slic_mac_config(struct adapter *adapter) 2441{ 2442 u32 value; 2443 __iomem struct slic_regs *slic_regs = adapter->slic_regs; 2444 2445 /* Setup GMAC gaps */ 2446 if (adapter->linkspeed == LINK_1000MB) { 2447 value = ((GMCR_GAPBB_1000 << GMCR_GAPBB_SHIFT) | 2448 (GMCR_GAPR1_1000 << GMCR_GAPR1_SHIFT) | 2449 (GMCR_GAPR2_1000 << GMCR_GAPR2_SHIFT)); 2450 } else { 2451 value = ((GMCR_GAPBB_100 << GMCR_GAPBB_SHIFT) | 2452 (GMCR_GAPR1_100 << GMCR_GAPR1_SHIFT) | 2453 (GMCR_GAPR2_100 << GMCR_GAPR2_SHIFT)); 2454 } 2455 2456 /* enable GMII */ 2457 if (adapter->linkspeed == LINK_1000MB) 2458 value |= GMCR_GBIT; 2459 2460 /* enable fullduplex */ 2461 if ((adapter->linkduplex == LINK_FULLD) 2462 || (adapter->macopts & MAC_LOOPBACK)) { 2463 value |= GMCR_FULLD; 2464 } 2465 2466 /* write mac config */ 2467 slic_reg32_write(&slic_regs->slic_wmcfg, value, FLUSH); 2468 2469 /* setup mac addresses */ 2470 slic_mac_address_config(adapter); 2471} 2472 2473static bool slic_mac_filter(struct adapter *adapter, 2474 struct ether_header *ether_frame) 2475{ 2476 u32 opts = adapter->macopts; 2477 u32 *dhost4 = (u32 *)&ether_frame->ether_dhost[0]; 2478 u16 *dhost2 = (u16 *)&ether_frame->ether_dhost[4]; 2479 2480 if (opts & MAC_PROMISC) 2481 return true; 2482 2483 if ((*dhost4 == 0xFFFFFFFF) && (*dhost2 == 0xFFFF)) { 2484 if (opts & MAC_BCAST) { 2485 adapter->rcv_broadcasts++; 2486 return true; 2487 } else { 2488 return false; 2489 } 2490 } 2491 2492 if (ether_frame->ether_dhost[0] & 0x01) { 2493 if (opts & MAC_ALLMCAST) { 2494 adapter->rcv_multicasts++; 2495 adapter->stats.multicast++; 2496 return true; 2497 } 2498 if (opts & MAC_MCAST) { 2499 struct mcast_address *mcaddr = adapter->mcastaddrs; 2500 2501 while (mcaddr) { 2502 if (!compare_ether_addr(mcaddr->address, 2503 ether_frame->ether_dhost)) { 2504 adapter->rcv_multicasts++; 2505 adapter->stats.multicast++; 2506 return true; 2507 } 2508 mcaddr = mcaddr->next; 2509 } 2510 return false; 2511 } else { 2512 return false; 2513 } 2514 } 2515 if (opts & MAC_DIRECTED) { 2516 adapter->rcv_unicasts++; 2517 return true; 2518 } 2519 return false; 2520 2521} 2522 2523static int slic_mac_set_address(struct net_device *dev, void *ptr) 2524{ 2525 struct adapter *adapter = netdev_priv(dev); 2526 struct sockaddr *addr = ptr; 2527 2528 if (netif_running(dev)) 2529 return -EBUSY; 2530 if (!adapter) 2531 return -EBUSY; 2532 2533 if (!is_valid_ether_addr(addr->sa_data)) 2534 return -EINVAL; 2535 2536 memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); 2537 memcpy(adapter->currmacaddr, addr->sa_data, dev->addr_len); 2538 2539 slic_config_set(adapter, true); 2540 return 0; 2541} 2542 2543static void slic_timer_load_check(ulong cardaddr) 2544{ 2545 struct sliccard *card = (struct sliccard *)cardaddr; 2546 struct adapter *adapter = card->master; 2547 u32 __iomem *intagg; 2548 u32 load = card->events; 2549 u32 level = 0; 2550 2551 intagg = &adapter->slic_regs->slic_intagg; 2552 2553 if ((adapter) && (adapter->state == ADAPT_UP) && 2554 (card->state == CARD_UP) && (slic_global.dynamic_intagg)) { 2555 if (adapter->devid == SLIC_1GB_DEVICE_ID) { 2556 if (adapter->linkspeed == LINK_1000MB) 2557 level = 100; 2558 else { 2559 if (load > SLIC_LOAD_5) 2560 level = SLIC_INTAGG_5; 2561 else if (load > SLIC_LOAD_4) 2562 level = SLIC_INTAGG_4; 2563 else if (load > SLIC_LOAD_3) 2564 level = SLIC_INTAGG_3; 2565 else if (load > SLIC_LOAD_2) 2566 level = SLIC_INTAGG_2; 2567 else if (load > SLIC_LOAD_1) 2568 level = SLIC_INTAGG_1; 2569 else 2570 level = SLIC_INTAGG_0; 2571 } 2572 if (card->loadlevel_current != level) { 2573 card->loadlevel_current = level; 2574 slic_reg32_write(intagg, level, FLUSH); 2575 } 2576 } else { 2577 if (load > SLIC_LOAD_5) 2578 level = SLIC_INTAGG_5; 2579 else if (load > SLIC_LOAD_4) 2580 level = SLIC_INTAGG_4; 2581 else if (load > SLIC_LOAD_3) 2582 level = SLIC_INTAGG_3; 2583 else if (load > SLIC_LOAD_2) 2584 level = SLIC_INTAGG_2; 2585 else if (load > SLIC_LOAD_1) 2586 level = SLIC_INTAGG_1; 2587 else 2588 level = SLIC_INTAGG_0; 2589 if (card->loadlevel_current != level) { 2590 card->loadlevel_current = level; 2591 slic_reg32_write(intagg, level, FLUSH); 2592 } 2593 } 2594 } 2595 card->events = 0; 2596 card->loadtimer.expires = jiffies + (SLIC_LOADTIMER_PERIOD * HZ); 2597 add_timer(&card->loadtimer); 2598} 2599 2600static void slic_assert_fail(void) 2601{ 2602 u32 cpuid; 2603 u32 curr_pid; 2604 cpuid = smp_processor_id(); 2605 curr_pid = current->pid; 2606 2607 printk(KERN_ERR "%s CPU # %d ---- PID # %d\n", 2608 __func__, cpuid, curr_pid); 2609} 2610 2611static int slic_upr_queue_request(struct adapter *adapter, 2612 u32 upr_request, 2613 u32 upr_data, 2614 u32 upr_data_h, 2615 u32 upr_buffer, u32 upr_buffer_h) 2616{ 2617 struct slic_upr *upr; 2618 struct slic_upr *uprqueue; 2619 2620 upr = kmalloc(sizeof(struct slic_upr), GFP_ATOMIC); 2621 if (!upr) 2622 return -ENOMEM; 2623 2624 upr->adapter = adapter->port; 2625 upr->upr_request = upr_request; 2626 upr->upr_data = upr_data; 2627 upr->upr_buffer = upr_buffer; 2628 upr->upr_data_h = upr_data_h; 2629 upr->upr_buffer_h = upr_buffer_h; 2630 upr->next = NULL; 2631 if (adapter->upr_list) { 2632 uprqueue = adapter->upr_list; 2633 2634 while (uprqueue->next) 2635 uprqueue = uprqueue->next; 2636 uprqueue->next = upr; 2637 } else { 2638 adapter->upr_list = upr; 2639 } 2640 return STATUS_SUCCESS; 2641} 2642 2643static int slic_upr_request(struct adapter *adapter, 2644 u32 upr_request, 2645 u32 upr_data, 2646 u32 upr_data_h, 2647 u32 upr_buffer, u32 upr_buffer_h) 2648{ 2649 int status; 2650 2651 spin_lock_irqsave(&adapter->upr_lock.lock, adapter->upr_lock.flags); 2652 status = slic_upr_queue_request(adapter, 2653 upr_request, 2654 upr_data, 2655 upr_data_h, upr_buffer, upr_buffer_h); 2656 if (status != STATUS_SUCCESS) { 2657 spin_unlock_irqrestore(&adapter->upr_lock.lock, 2658 adapter->upr_lock.flags); 2659 return status; 2660 } 2661 slic_upr_start(adapter); 2662 spin_unlock_irqrestore(&adapter->upr_lock.lock, 2663 adapter->upr_lock.flags); 2664 return STATUS_PENDING; 2665} 2666 2667static void slic_upr_request_complete(struct adapter *adapter, u32 isr) 2668{ 2669 struct sliccard *card = adapter->card; 2670 struct slic_upr *upr; 2671 2672 spin_lock_irqsave(&adapter->upr_lock.lock, adapter->upr_lock.flags); 2673 upr = adapter->upr_list; 2674 if (!upr) { 2675 ASSERT(0); 2676 spin_unlock_irqrestore(&adapter->upr_lock.lock, 2677 adapter->upr_lock.flags); 2678 return; 2679 } 2680 adapter->upr_list = upr->next; 2681 upr->next = NULL; 2682 adapter->upr_busy = 0; 2683 ASSERT(adapter->port == upr->adapter); 2684 switch (upr->upr_request) { 2685 case SLIC_UPR_STATS: 2686 { 2687 struct slic_stats *slicstats = 2688 (struct slic_stats *) &adapter->pshmem->inicstats; 2689 struct slic_stats *newstats = slicstats; 2690 struct slic_stats *old = &adapter->inicstats_prev; 2691 struct slicnet_stats *stst = &adapter->slic_stats; 2692 2693 if (isr & ISR_UPCERR) { 2694 dev_err(&adapter->netdev->dev, 2695 "SLIC_UPR_STATS command failed isr[%x]\n", 2696 isr); 2697 2698 break; 2699 } 2700 UPDATE_STATS_GB(stst->tcp.xmit_tcp_segs, 2701 newstats->xmit_tcp_segs_gb, 2702 old->xmit_tcp_segs_gb); 2703 2704 UPDATE_STATS_GB(stst->tcp.xmit_tcp_bytes, 2705 newstats->xmit_tcp_bytes_gb, 2706 old->xmit_tcp_bytes_gb); 2707 2708 UPDATE_STATS_GB(stst->tcp.rcv_tcp_segs, 2709 newstats->rcv_tcp_segs_gb, 2710 old->rcv_tcp_segs_gb); 2711 2712 UPDATE_STATS_GB(stst->tcp.rcv_tcp_bytes, 2713 newstats->rcv_tcp_bytes_gb, 2714 old->rcv_tcp_bytes_gb); 2715 2716 UPDATE_STATS_GB(stst->iface.xmt_bytes, 2717 newstats->xmit_bytes_gb, 2718 old->xmit_bytes_gb); 2719 2720 UPDATE_STATS_GB(stst->iface.xmt_ucast, 2721 newstats->xmit_unicasts_gb, 2722 old->xmit_unicasts_gb); 2723 2724 UPDATE_STATS_GB(stst->iface.rcv_bytes, 2725 newstats->rcv_bytes_gb, 2726 old->rcv_bytes_gb); 2727 2728 UPDATE_STATS_GB(stst->iface.rcv_ucast, 2729 newstats->rcv_unicasts_gb, 2730 old->rcv_unicasts_gb); 2731 2732 UPDATE_STATS_GB(stst->iface.xmt_errors, 2733 newstats->xmit_collisions_gb, 2734 old->xmit_collisions_gb); 2735 2736 UPDATE_STATS_GB(stst->iface.xmt_errors, 2737 newstats->xmit_excess_collisions_gb, 2738 old->xmit_excess_collisions_gb); 2739 2740 UPDATE_STATS_GB(stst->iface.xmt_errors, 2741 newstats->xmit_other_error_gb, 2742 old->xmit_other_error_gb); 2743 2744 UPDATE_STATS_GB(stst->iface.rcv_errors, 2745 newstats->rcv_other_error_gb, 2746 old->rcv_other_error_gb); 2747 2748 UPDATE_STATS_GB(stst->iface.rcv_discards, 2749 newstats->rcv_drops_gb, 2750 old->rcv_drops_gb); 2751 2752 if (newstats->rcv_drops_gb > old->rcv_drops_gb) { 2753 adapter->rcv_drops += 2754 (newstats->rcv_drops_gb - 2755 old->rcv_drops_gb); 2756 } 2757 memcpy(old, newstats, sizeof(struct slic_stats)); 2758 break; 2759 } 2760 case SLIC_UPR_RLSR: 2761 slic_link_upr_complete(adapter, isr); 2762 break; 2763 case SLIC_UPR_RCONFIG: 2764 break; 2765 case SLIC_UPR_RPHY: 2766 ASSERT(0); 2767 break; 2768 case SLIC_UPR_ENLB: 2769 ASSERT(0); 2770 break; 2771 case SLIC_UPR_ENCT: 2772 ASSERT(0); 2773 break; 2774 case SLIC_UPR_PDWN: 2775 ASSERT(0); 2776 break; 2777 case SLIC_UPR_PING: 2778 card->pingstatus |= (isr & ISR_PINGDSMASK); 2779 break; 2780 default: 2781 ASSERT(0); 2782 } 2783 kfree(upr); 2784 slic_upr_start(adapter); 2785 spin_unlock_irqrestore(&adapter->upr_lock.lock, 2786 adapter->upr_lock.flags); 2787} 2788 2789static void slic_upr_start(struct adapter *adapter) 2790{ 2791 struct slic_upr *upr; 2792 __iomem struct slic_regs *slic_regs = adapter->slic_regs; 2793/* 2794 char * ptr1; 2795 char * ptr2; 2796 uint cmdoffset; 2797*/ 2798 upr = adapter->upr_list; 2799 if (!upr) 2800 return; 2801 if (adapter->upr_busy) 2802 return; 2803 adapter->upr_busy = 1; 2804 2805 switch (upr->upr_request) { 2806 case SLIC_UPR_STATS: 2807 if (upr->upr_data_h == 0) { 2808 slic_reg32_write(&slic_regs->slic_stats, upr->upr_data, 2809 FLUSH); 2810 } else { 2811 slic_reg64_write(adapter, &slic_regs->slic_stats64, 2812 upr->upr_data, 2813 &slic_regs->slic_addr_upper, 2814 upr->upr_data_h, FLUSH); 2815 } 2816 break; 2817 2818 case SLIC_UPR_RLSR: 2819 slic_reg64_write(adapter, &slic_regs->slic_rlsr, upr->upr_data, 2820 &slic_regs->slic_addr_upper, upr->upr_data_h, 2821 FLUSH); 2822 break; 2823 2824 case SLIC_UPR_RCONFIG: 2825 slic_reg64_write(adapter, &slic_regs->slic_rconfig, 2826 upr->upr_data, &slic_regs->slic_addr_upper, 2827 upr->upr_data_h, FLUSH); 2828 break; 2829 case SLIC_UPR_PING: 2830 slic_reg32_write(&slic_regs->slic_ping, 1, FLUSH); 2831 break; 2832 default: 2833 ASSERT(0); 2834 } 2835} 2836 2837static void slic_link_upr_complete(struct adapter *adapter, u32 isr) 2838{ 2839 u32 linkstatus = adapter->pshmem->linkstatus; 2840 uint linkup; 2841 unsigned char linkspeed; 2842 unsigned char linkduplex; 2843 2844 if ((isr & ISR_UPCERR) || (isr & ISR_UPCBSY)) { 2845 struct slic_shmem *pshmem; 2846 2847 pshmem = (struct slic_shmem *)adapter->phys_shmem; 2848#if defined(CONFIG_X86_64) 2849 slic_upr_queue_request(adapter, 2850 SLIC_UPR_RLSR, 2851 SLIC_GET_ADDR_LOW(&pshmem->linkstatus), 2852 SLIC_GET_ADDR_HIGH(&pshmem->linkstatus), 2853 0, 0); 2854#elif defined(CONFIG_X86) 2855 slic_upr_queue_request(adapter, 2856 SLIC_UPR_RLSR, 2857 (u32) &pshmem->linkstatus, 2858 SLIC_GET_ADDR_HIGH(pshmem), 0, 0); 2859#else 2860 Stop Compilation; 2861#endif 2862 return; 2863 } 2864 if (adapter->state != ADAPT_UP) 2865 return; 2866 2867 ASSERT((adapter->devid == SLIC_1GB_DEVICE_ID) 2868 || (adapter->devid == SLIC_2GB_DEVICE_ID)); 2869 2870 linkup = linkstatus & GIG_LINKUP ? LINK_UP : LINK_DOWN; 2871 if (linkstatus & GIG_SPEED_1000) 2872 linkspeed = LINK_1000MB; 2873 else if (linkstatus & GIG_SPEED_100) 2874 linkspeed = LINK_100MB; 2875 else 2876 linkspeed = LINK_10MB; 2877 2878 if (linkstatus & GIG_FULLDUPLEX) 2879 linkduplex = LINK_FULLD; 2880 else 2881 linkduplex = LINK_HALFD; 2882 2883 if ((adapter->linkstate == LINK_DOWN) && (linkup == LINK_DOWN)) 2884 return; 2885 2886 /* link up event, but nothing has changed */ 2887 if ((adapter->linkstate == LINK_UP) && 2888 (linkup == LINK_UP) && 2889 (adapter->linkspeed == linkspeed) && 2890 (adapter->linkduplex == linkduplex)) 2891 return; 2892 2893 /* link has changed at this point */ 2894 2895 /* link has gone from up to down */ 2896 if (linkup == LINK_DOWN) { 2897 adapter->linkstate = LINK_DOWN; 2898 return; 2899 } 2900 2901 /* link has gone from down to up */ 2902 adapter->linkspeed = linkspeed; 2903 adapter->linkduplex = linkduplex; 2904 2905 if (adapter->linkstate != LINK_UP) { 2906 /* setup the mac */ 2907 slic_config_set(adapter, true); 2908 adapter->linkstate = LINK_UP; 2909 netif_start_queue(adapter->netdev); 2910 } 2911} 2912 2913/* 2914 * this is here to checksum the eeprom, there is some ucode bug 2915 * which prevens us from using the ucode result. 2916 * remove this once ucode is fixed. 2917 */ 2918static ushort slic_eeprom_cksum(char *m, int len) 2919{ 2920#define ADDCARRY(x) (x > 65535 ? x -= 65535 : x) 2921#define REDUCE {l_util.l = sum; sum = l_util.s[0] + l_util.s[1]; ADDCARRY(sum);\ 2922 } 2923 2924 u16 *w; 2925 u32 sum = 0; 2926 u32 byte_swapped = 0; 2927 u32 w_int; 2928 2929 union { 2930 char c[2]; 2931 ushort s; 2932 } s_util; 2933 2934 union { 2935 ushort s[2]; 2936 int l; 2937 } l_util; 2938 2939 l_util.l = 0; 2940 s_util.s = 0; 2941 2942 w = (u16 *)m; 2943#ifdef CONFIG_X86_64 2944 w_int = (u32) ((ulong) w & 0x00000000FFFFFFFF); 2945#else 2946 w_int = (u32) (w); 2947#endif 2948 if ((1 & w_int) && (len > 0)) { 2949 REDUCE; 2950 sum <<= 8; 2951 s_util.c[0] = *(unsigned char *)w; 2952 w = (u16 *)((char *)w + 1); 2953 len--; 2954 byte_swapped = 1; 2955 } 2956 2957 /* Unroll the loop to make overhead from branches &c small. */ 2958 while ((len -= 32) >= 0) { 2959 sum += w[0]; 2960 sum += w[1]; 2961 sum += w[2]; 2962 sum += w[3]; 2963 sum += w[4]; 2964 sum += w[5]; 2965 sum += w[6]; 2966 sum += w[7]; 2967 sum += w[8]; 2968 sum += w[9]; 2969 sum += w[10]; 2970 sum += w[11]; 2971 sum += w[12]; 2972 sum += w[13]; 2973 sum += w[14]; 2974 sum += w[15]; 2975 w = (u16 *)((ulong) w + 16); /* verify */ 2976 } 2977 len += 32; 2978 while ((len -= 8) >= 0) { 2979 sum += w[0]; 2980 sum += w[1]; 2981 sum += w[2]; 2982 sum += w[3]; 2983 w = (u16 *)((ulong) w + 4); /* verify */ 2984 } 2985 len += 8; 2986 if (len != 0 || byte_swapped != 0) { 2987 REDUCE; 2988 while ((len -= 2) >= 0) 2989 sum += *w++; /* verify */ 2990 if (byte_swapped) { 2991 REDUCE; 2992 sum <<= 8; 2993 byte_swapped = 0; 2994 if (len == -1) { 2995 s_util.c[1] = *(char *) w; 2996 sum += s_util.s; 2997 len = 0; 2998 } else { 2999 len = -1; 3000 } 3001 3002 } else if (len == -1) { 3003 s_util.c[0] = *(char *) w; 3004 } 3005 3006 if (len == -1) { 3007 s_util.c[1] = 0; 3008 sum += s_util.s; 3009 } 3010 } 3011 REDUCE; 3012 return (ushort) sum; 3013} 3014 3015static int slic_rspqueue_init(struct adapter *adapter) 3016{ 3017 int i; 3018 struct slic_rspqueue *rspq = &adapter->rspqueue; 3019 __iomem struct slic_regs *slic_regs = adapter->slic_regs; 3020 u32 paddrh = 0; 3021 3022 ASSERT(adapter->state == ADAPT_DOWN); 3023 memset(rspq, 0, sizeof(struct slic_rspqueue)); 3024 3025 rspq->num_pages = SLIC_RSPQ_PAGES_GB; 3026 3027 for (i = 0; i < rspq->num_pages; i++) { 3028 rspq->vaddr[i] = pci_alloc_consistent(adapter->pcidev, 3029 PAGE_SIZE, 3030 &rspq->paddr[i]); 3031 if (!rspq->vaddr[i]) { 3032 dev_err(&adapter->pcidev->dev, 3033 "pci_alloc_consistent failed\n"); 3034 slic_rspqueue_free(adapter); 3035 return STATUS_FAILURE; 3036 } 3037#ifndef CONFIG_X86_64 3038 ASSERT(((u32) rspq->vaddr[i] & 0xFFFFF000) == 3039 (u32) rspq->vaddr[i]); 3040 ASSERT(((u32) rspq->paddr[i] & 0xFFFFF000) == 3041 (u32) rspq->paddr[i]); 3042#endif 3043 memset(rspq->vaddr[i], 0, PAGE_SIZE); 3044 3045 if (paddrh == 0) { 3046 slic_reg32_write(&slic_regs->slic_rbar, 3047 (rspq->paddr[i] | SLIC_RSPQ_BUFSINPAGE), 3048 DONT_FLUSH); 3049 } else { 3050 slic_reg64_write(adapter, &slic_regs->slic_rbar64, 3051 (rspq->paddr[i] | SLIC_RSPQ_BUFSINPAGE), 3052 &slic_regs->slic_addr_upper, 3053 paddrh, DONT_FLUSH); 3054 } 3055 } 3056 rspq->offset = 0; 3057 rspq->pageindex = 0; 3058 rspq->rspbuf = (struct slic_rspbuf *)rspq->vaddr[0]; 3059 return STATUS_SUCCESS; 3060} 3061 3062static void slic_rspqueue_free(struct adapter *adapter) 3063{ 3064 int i; 3065 struct slic_rspqueue *rspq = &adapter->rspqueue; 3066 3067 for (i = 0; i < rspq->num_pages; i++) { 3068 if (rspq->vaddr[i]) { 3069 pci_free_consistent(adapter->pcidev, PAGE_SIZE, 3070 rspq->vaddr[i], rspq->paddr[i]); 3071 } 3072 rspq->vaddr[i] = NULL; 3073 rspq->paddr[i] = 0; 3074 } 3075 rspq->offset = 0; 3076 rspq->pageindex = 0; 3077 rspq->rspbuf = NULL; 3078} 3079 3080static struct slic_rspbuf *slic_rspqueue_getnext(struct adapter *adapter) 3081{ 3082 struct slic_rspqueue *rspq = &adapter->rspqueue; 3083 struct slic_rspbuf *buf; 3084 3085 if (!(rspq->rspbuf->status)) 3086 return NULL; 3087 3088 buf = rspq->rspbuf; 3089#ifndef CONFIG_X86_64 3090 ASSERT((buf->status & 0xFFFFFFE0) == 0); 3091#endif 3092 ASSERT(buf->hosthandle); 3093 if (++rspq->offset < SLIC_RSPQ_BUFSINPAGE) { 3094 rspq->rspbuf++; 3095#ifndef CONFIG_X86_64 3096 ASSERT(((u32) rspq->rspbuf & 0xFFFFFFE0) == 3097 (u32) rspq->rspbuf); 3098#endif 3099 } else { 3100 ASSERT(rspq->offset == SLIC_RSPQ_BUFSINPAGE); 3101 slic_reg64_write(adapter, &adapter->slic_regs->slic_rbar64, 3102 (rspq->paddr[rspq->pageindex] | SLIC_RSPQ_BUFSINPAGE), 3103 &adapter->slic_regs->slic_addr_upper, 0, DONT_FLUSH); 3104 rspq->pageindex = (++rspq->pageindex) % rspq->num_pages; 3105 rspq->offset = 0; 3106 rspq->rspbuf = (struct slic_rspbuf *) 3107 rspq->vaddr[rspq->pageindex]; 3108#ifndef CONFIG_X86_64 3109 ASSERT(((u32) rspq->rspbuf & 0xFFFFF000) == 3110 (u32) rspq->rspbuf); 3111#endif 3112 } 3113#ifndef CONFIG_X86_64 3114 ASSERT(((u32) buf & 0xFFFFFFE0) == (u32) buf); 3115#endif 3116 return buf; 3117} 3118 3119static void slic_cmdqmem_init(struct adapter *adapter) 3120{ 3121 struct slic_cmdqmem *cmdqmem = &adapter->cmdqmem; 3122 3123 memset(cmdqmem, 0, sizeof(struct slic_cmdqmem)); 3124} 3125 3126static void slic_cmdqmem_free(struct adapter *adapter) 3127{ 3128 struct slic_cmdqmem *cmdqmem = &adapter->cmdqmem; 3129 int i; 3130 3131 for (i = 0; i < SLIC_CMDQ_MAXPAGES; i++) { 3132 if (cmdqmem->pages[i]) { 3133 pci_free_consistent(adapter->pcidev, 3134 PAGE_SIZE, 3135 (void *) cmdqmem->pages[i], 3136 cmdqmem->dma_pages[i]); 3137 } 3138 } 3139 memset(cmdqmem, 0, sizeof(struct slic_cmdqmem)); 3140} 3141 3142static u32 *slic_cmdqmem_addpage(struct adapter *adapter) 3143{ 3144 struct slic_cmdqmem *cmdqmem = &adapter->cmdqmem; 3145 u32 *pageaddr; 3146 3147 if (cmdqmem->pagecnt >= SLIC_CMDQ_MAXPAGES) 3148 return NULL; 3149 pageaddr = pci_alloc_consistent(adapter->pcidev, 3150 PAGE_SIZE, 3151 &cmdqmem->dma_pages[cmdqmem->pagecnt]); 3152 if (!pageaddr) 3153 return NULL; 3154#ifndef CONFIG_X86_64 3155 ASSERT(((u32) pageaddr & 0xFFFFF000) == (u32) pageaddr); 3156#endif 3157 cmdqmem->pages[cmdqmem->pagecnt] = pageaddr; 3158 cmdqmem->pagecnt++; 3159 return pageaddr; 3160} 3161 3162static int slic_cmdq_init(struct adapter *adapter) 3163{ 3164 int i; 3165 u32 *pageaddr; 3166 3167 ASSERT(adapter->state == ADAPT_DOWN); 3168 memset(&adapter->cmdq_all, 0, sizeof(struct slic_cmdqueue)); 3169 memset(&adapter->cmdq_free, 0, sizeof(struct slic_cmdqueue)); 3170 memset(&adapter->cmdq_done, 0, sizeof(struct slic_cmdqueue)); 3171 spin_lock_init(&adapter->cmdq_all.lock.lock); 3172 spin_lock_init(&adapter->cmdq_free.lock.lock); 3173 spin_lock_init(&adapter->cmdq_done.lock.lock); 3174 slic_cmdqmem_init(adapter); 3175 adapter->slic_handle_ix = 1; 3176 for (i = 0; i < SLIC_CMDQ_INITPAGES; i++) { 3177 pageaddr = slic_cmdqmem_addpage(adapter); 3178#ifndef CONFIG_X86_64 3179 ASSERT(((u32) pageaddr & 0xFFFFF000) == (u32) pageaddr); 3180#endif 3181 if (!pageaddr) { 3182 slic_cmdq_free(adapter); 3183 return STATUS_FAILURE; 3184 } 3185 slic_cmdq_addcmdpage(adapter, pageaddr); 3186 } 3187 adapter->slic_handle_ix = 1; 3188 3189 return STATUS_SUCCESS; 3190} 3191 3192static void slic_cmdq_free(struct adapter *adapter) 3193{ 3194 struct slic_hostcmd *cmd; 3195 3196 cmd = adapter->cmdq_all.head; 3197 while (cmd) { 3198 if (cmd->busy) { 3199 struct sk_buff *tempskb; 3200 3201 tempskb = cmd->skb; 3202 if (tempskb) { 3203 cmd->skb = NULL; 3204 dev_kfree_skb_irq(tempskb); 3205 } 3206 } 3207 cmd = cmd->next_all; 3208 } 3209 memset(&adapter->cmdq_all, 0, sizeof(struct slic_cmdqueue)); 3210 memset(&adapter->cmdq_free, 0, sizeof(struct slic_cmdqueue)); 3211 memset(&adapter->cmdq_done, 0, sizeof(struct slic_cmdqueue)); 3212 slic_cmdqmem_free(adapter); 3213} 3214 3215static void slic_cmdq_reset(struct adapter *adapter) 3216{ 3217 struct slic_hostcmd *hcmd; 3218 struct sk_buff *skb; 3219 u32 outstanding; 3220 3221 spin_lock_irqsave(&adapter->cmdq_free.lock.lock, 3222 adapter->cmdq_free.lock.flags); 3223 spin_lock_irqsave(&adapter->cmdq_done.lock.lock, 3224 adapter->cmdq_done.lock.flags); 3225 outstanding = adapter->cmdq_all.count - adapter->cmdq_done.count; 3226 outstanding -= adapter->cmdq_free.count; 3227 hcmd = adapter->cmdq_all.head; 3228 while (hcmd) { 3229 if (hcmd->busy) { 3230 skb = hcmd->skb; 3231 ASSERT(skb); 3232 hcmd->busy = 0; 3233 hcmd->skb = NULL; 3234 dev_kfree_skb_irq(skb); 3235 } 3236 hcmd = hcmd->next_all; 3237 } 3238 adapter->cmdq_free.count = 0; 3239 adapter->cmdq_free.head = NULL; 3240 adapter->cmdq_free.tail = NULL; 3241 adapter->cmdq_done.count = 0; 3242 adapter->cmdq_done.head = NULL; 3243 adapter->cmdq_done.tail = NULL; 3244 adapter->cmdq_free.head = adapter->cmdq_all.head; 3245 hcmd = adapter->cmdq_all.head; 3246 while (hcmd) { 3247 adapter->cmdq_free.count++; 3248 hcmd->next = hcmd->next_all; 3249 hcmd = hcmd->next_all; 3250 } 3251 if (adapter->cmdq_free.count != adapter->cmdq_all.count) { 3252 dev_err(&adapter->netdev->dev, 3253 "free_count %d != all count %d\n", 3254 adapter->cmdq_free.count, adapter->cmdq_all.count); 3255 } 3256 spin_unlock_irqrestore(&adapter->cmdq_done.lock.lock, 3257 adapter->cmdq_done.lock.flags); 3258 spin_unlock_irqrestore(&adapter->cmdq_free.lock.lock, 3259 adapter->cmdq_free.lock.flags); 3260} 3261 3262static void slic_cmdq_addcmdpage(struct adapter *adapter, u32 *page) 3263{ 3264 struct slic_hostcmd *cmd; 3265 struct slic_hostcmd *prev; 3266 struct slic_hostcmd *tail; 3267 struct slic_cmdqueue *cmdq; 3268 int cmdcnt; 3269 void *cmdaddr; 3270 ulong phys_addr; 3271 u32 phys_addrl; 3272 u32 phys_addrh; 3273 struct slic_handle *pslic_handle; 3274 3275 cmdaddr = page; 3276 cmd = (struct slic_hostcmd *)cmdaddr; 3277 cmdcnt = 0; 3278 3279 phys_addr = virt_to_bus((void *)page); 3280 phys_addrl = SLIC_GET_ADDR_LOW(phys_addr); 3281 phys_addrh = SLIC_GET_ADDR_HIGH(phys_addr); 3282 3283 prev = NULL; 3284 tail = cmd; 3285 while ((cmdcnt < SLIC_CMDQ_CMDSINPAGE) && 3286 (adapter->slic_handle_ix < 256)) { 3287 /* Allocate and initialize a SLIC_HANDLE for this command */ 3288 SLIC_GET_SLIC_HANDLE(adapter, pslic_handle); 3289 if (pslic_handle == NULL) 3290 ASSERT(0); 3291 ASSERT(pslic_handle == 3292 &adapter->slic_handles[pslic_handle->token. 3293 handle_index]); 3294 pslic_handle->type = SLIC_HANDLE_CMD; 3295 pslic_handle->address = (void *) cmd; 3296 pslic_handle->offset = (ushort) adapter->slic_handle_ix++; 3297 pslic_handle->other_handle = NULL; 3298 pslic_handle->next = NULL; 3299 3300 cmd->pslic_handle = pslic_handle; 3301 cmd->cmd64.hosthandle = pslic_handle->token.handle_token; 3302 cmd->busy = false; 3303 cmd->paddrl = phys_addrl; 3304 cmd->paddrh = phys_addrh; 3305 cmd->next_all = prev; 3306 cmd->next = prev; 3307 prev = cmd; 3308 phys_addrl += SLIC_HOSTCMD_SIZE; 3309 cmdaddr += SLIC_HOSTCMD_SIZE; 3310 3311 cmd = (struct slic_hostcmd *)cmdaddr; 3312 cmdcnt++; 3313 } 3314 3315 cmdq = &adapter->cmdq_all; 3316 cmdq->count += cmdcnt; /* SLIC_CMDQ_CMDSINPAGE; mooktodo */ 3317 tail->next_all = cmdq->head; 3318 cmdq->head = prev; 3319 cmdq = &adapter->cmdq_free; 3320 spin_lock_irqsave(&cmdq->lock.lock, cmdq->lock.flags); 3321 cmdq->count += cmdcnt; /* SLIC_CMDQ_CMDSINPAGE; mooktodo */ 3322 tail->next = cmdq->head; 3323 cmdq->head = prev; 3324 spin_unlock_irqrestore(&cmdq->lock.lock, cmdq->lock.flags); 3325} 3326 3327static struct slic_hostcmd *slic_cmdq_getfree(struct adapter *adapter) 3328{ 3329 struct slic_cmdqueue *cmdq = &adapter->cmdq_free; 3330 struct slic_hostcmd *cmd = NULL; 3331 3332lock_and_retry: 3333 spin_lock_irqsave(&cmdq->lock.lock, cmdq->lock.flags); 3334retry: 3335 cmd = cmdq->head; 3336 if (cmd) { 3337 cmdq->head = cmd->next; 3338 cmdq->count--; 3339 spin_unlock_irqrestore(&cmdq->lock.lock, cmdq->lock.flags); 3340 } else { 3341 slic_cmdq_getdone(adapter); 3342 cmd = cmdq->head; 3343 if (cmd) { 3344 goto retry; 3345 } else { 3346 u32 *pageaddr; 3347 3348 spin_unlock_irqrestore(&cmdq->lock.lock, 3349 cmdq->lock.flags); 3350 pageaddr = slic_cmdqmem_addpage(adapter); 3351 if (pageaddr) { 3352 slic_cmdq_addcmdpage(adapter, pageaddr); 3353 goto lock_and_retry; 3354 } 3355 } 3356 } 3357 return cmd; 3358} 3359 3360static void slic_cmdq_getdone(struct adapter *adapter) 3361{ 3362 struct slic_cmdqueue *done_cmdq = &adapter->cmdq_done; 3363 struct slic_cmdqueue *free_cmdq = &adapter->cmdq_free; 3364 3365 ASSERT(free_cmdq->head == NULL); 3366 spin_lock_irqsave(&done_cmdq->lock.lock, done_cmdq->lock.flags); 3367 3368 free_cmdq->head = done_cmdq->head; 3369 free_cmdq->count = done_cmdq->count; 3370 done_cmdq->head = NULL; 3371 done_cmdq->tail = NULL; 3372 done_cmdq->count = 0; 3373 spin_unlock_irqrestore(&done_cmdq->lock.lock, done_cmdq->lock.flags); 3374} 3375 3376static void slic_cmdq_putdone_irq(struct adapter *adapter, 3377 struct slic_hostcmd *cmd) 3378{ 3379 struct slic_cmdqueue *cmdq = &adapter->cmdq_done; 3380 3381 spin_lock(&cmdq->lock.lock); 3382 cmd->busy = 0; 3383 cmd->next = cmdq->head; 3384 cmdq->head = cmd; 3385 cmdq->count++; 3386 if ((adapter->xmitq_full) && (cmdq->count > 10)) 3387 netif_wake_queue(adapter->netdev); 3388 spin_unlock(&cmdq->lock.lock); 3389} 3390 3391static int slic_rcvqueue_init(struct adapter *adapter) 3392{ 3393 int i, count; 3394 struct slic_rcvqueue *rcvq = &adapter->rcvqueue; 3395 3396 ASSERT(adapter->state == ADAPT_DOWN); 3397 rcvq->tail = NULL; 3398 rcvq->head = NULL; 3399 rcvq->size = SLIC_RCVQ_ENTRIES; 3400 rcvq->errors = 0; 3401 rcvq->count = 0; 3402 i = (SLIC_RCVQ_ENTRIES / SLIC_RCVQ_FILLENTRIES); 3403 count = 0; 3404 while (i) { 3405 count += slic_rcvqueue_fill(adapter); 3406 i--; 3407 } 3408 if (rcvq->count < SLIC_RCVQ_MINENTRIES) { 3409 slic_rcvqueue_free(adapter); 3410 return STATUS_FAILURE; 3411 } 3412 return STATUS_SUCCESS; 3413} 3414 3415static void slic_rcvqueue_free(struct adapter *adapter) 3416{ 3417 struct slic_rcvqueue *rcvq = &adapter->rcvqueue; 3418 struct sk_buff *skb; 3419 3420 while (rcvq->head) { 3421 skb = rcvq->head; 3422 rcvq->head = rcvq->head->next; 3423 dev_kfree_skb(skb); 3424 } 3425 rcvq->tail = NULL; 3426 rcvq->head = NULL; 3427 rcvq->count = 0; 3428} 3429 3430static struct sk_buff *slic_rcvqueue_getnext(struct adapter *adapter) 3431{ 3432 struct slic_rcvqueue *rcvq = &adapter->rcvqueue; 3433 struct sk_buff *skb; 3434 struct slic_rcvbuf *rcvbuf; 3435 int count; 3436 3437 if (rcvq->count) { 3438 skb = rcvq->head; 3439 rcvbuf = (struct slic_rcvbuf *)skb->head; 3440 ASSERT(rcvbuf); 3441 3442 if (rcvbuf->status & IRHDDR_SVALID) { 3443 rcvq->head = rcvq->head->next; 3444 skb->next = NULL; 3445 rcvq->count--; 3446 } else { 3447 skb = NULL; 3448 } 3449 } else { 3450 dev_err(&adapter->netdev->dev, 3451 "RcvQ Empty!! rcvq[%p] count[%x]\n", rcvq, rcvq->count); 3452 skb = NULL; 3453 } 3454 while (rcvq->count < SLIC_RCVQ_FILLTHRESH) { 3455 count = slic_rcvqueue_fill(adapter); 3456 if (!count) 3457 break; 3458 } 3459 if (skb) 3460 rcvq->errors = 0; 3461 return skb; 3462} 3463 3464static int slic_rcvqueue_fill(struct adapter *adapter) 3465{ 3466 void *paddr; 3467 u32 paddrl; 3468 u32 paddrh; 3469 struct slic_rcvqueue *rcvq = &adapter->rcvqueue; 3470 int i = 0; 3471 struct device *dev = &adapter->netdev->dev; 3472 3473 while (i < SLIC_RCVQ_FILLENTRIES) { 3474 struct slic_rcvbuf *rcvbuf; 3475 struct sk_buff *skb; 3476#ifdef KLUDGE_FOR_4GB_BOUNDARY 3477retry_rcvqfill: 3478#endif 3479 skb = alloc_skb(SLIC_RCVQ_RCVBUFSIZE, GFP_ATOMIC); 3480 if (skb) { 3481 paddr = (void *)pci_map_single(adapter->pcidev, 3482 skb->data, 3483 SLIC_RCVQ_RCVBUFSIZE, 3484 PCI_DMA_FROMDEVICE); 3485 paddrl = SLIC_GET_ADDR_LOW(paddr); 3486 paddrh = SLIC_GET_ADDR_HIGH(paddr); 3487 3488 skb->len = SLIC_RCVBUF_HEADSIZE; 3489 rcvbuf = (struct slic_rcvbuf *)skb->head; 3490 rcvbuf->status = 0; 3491 skb->next = NULL; 3492#ifdef KLUDGE_FOR_4GB_BOUNDARY 3493 if (paddrl == 0) { 3494 dev_err(dev, "%s: LOW 32bits PHYSICAL ADDRESS == 0\n", 3495 __func__); 3496 dev_err(dev, "skb[%p] PROBLEM\n", skb); 3497 dev_err(dev, " skbdata[%p]\n", skb->data); 3498 dev_err(dev, " skblen[%x]\n", skb->len); 3499 dev_err(dev, " paddr[%p]\n", paddr); 3500 dev_err(dev, " paddrl[%x]\n", paddrl); 3501 dev_err(dev, " paddrh[%x]\n", paddrh); 3502 dev_err(dev, " rcvq->head[%p]\n", rcvq->head); 3503 dev_err(dev, " rcvq->tail[%p]\n", rcvq->tail); 3504 dev_err(dev, " rcvq->count[%x]\n", rcvq->count); 3505 dev_err(dev, "SKIP THIS SKB!!!!!!!!\n"); 3506 goto retry_rcvqfill; 3507 } 3508#else 3509 if (paddrl == 0) { 3510 dev_err(dev, "%s: LOW 32bits PHYSICAL ADDRESS == 0\n", 3511 __func__); 3512 dev_err(dev, "skb[%p] PROBLEM\n", skb); 3513 dev_err(dev, " skbdata[%p]\n", skb->data); 3514 dev_err(dev, " skblen[%x]\n", skb->len); 3515 dev_err(dev, " paddr[%p]\n", paddr); 3516 dev_err(dev, " paddrl[%x]\n", paddrl); 3517 dev_err(dev, " paddrh[%x]\n", paddrh); 3518 dev_err(dev, " rcvq->head[%p]\n", rcvq->head); 3519 dev_err(dev, " rcvq->tail[%p]\n", rcvq->tail); 3520 dev_err(dev, " rcvq->count[%x]\n", rcvq->count); 3521 dev_err(dev, "GIVE TO CARD ANYWAY\n"); 3522 } 3523#endif 3524 if (paddrh == 0) { 3525 slic_reg32_write(&adapter->slic_regs->slic_hbar, 3526 (u32)paddrl, DONT_FLUSH); 3527 } else { 3528 slic_reg64_write(adapter, 3529 &adapter->slic_regs->slic_hbar64, 3530 paddrl, 3531 &adapter->slic_regs->slic_addr_upper, 3532 paddrh, DONT_FLUSH); 3533 } 3534 if (rcvq->head) 3535 rcvq->tail->next = skb; 3536 else 3537 rcvq->head = skb; 3538 rcvq->tail = skb; 3539 rcvq->count++; 3540 i++; 3541 } else { 3542 dev_err(&adapter->netdev->dev, 3543 "slic_rcvqueue_fill could only get [%d] skbuffs\n", 3544 i); 3545 break; 3546 } 3547 } 3548 return i; 3549} 3550 3551static u32 slic_rcvqueue_reinsert(struct adapter *adapter, struct sk_buff *skb) 3552{ 3553 struct slic_rcvqueue *rcvq = &adapter->rcvqueue; 3554 void *paddr; 3555 u32 paddrl; 3556 u32 paddrh; 3557 struct slic_rcvbuf *rcvbuf = (struct slic_rcvbuf *)skb->head; 3558 struct device *dev; 3559 3560 ASSERT(skb->len == SLIC_RCVBUF_HEADSIZE); 3561 3562 paddr = (void *)pci_map_single(adapter->pcidev, skb->head, 3563 SLIC_RCVQ_RCVBUFSIZE, PCI_DMA_FROMDEVICE); 3564 rcvbuf->status = 0; 3565 skb->next = NULL; 3566 3567 paddrl = SLIC_GET_ADDR_LOW(paddr); 3568 paddrh = SLIC_GET_ADDR_HIGH(paddr); 3569 3570 if (paddrl == 0) { 3571 dev = &adapter->netdev->dev; 3572 dev_err(dev, "%s: LOW 32bits PHYSICAL ADDRESS == 0\n", 3573 __func__); 3574 dev_err(dev, "skb[%p] PROBLEM\n", skb); 3575 dev_err(dev, " skbdata[%p]\n", skb->data); 3576 dev_err(dev, " skblen[%x]\n", skb->len); 3577 dev_err(dev, " paddr[%p]\n", paddr); 3578 dev_err(dev, " paddrl[%x]\n", paddrl); 3579 dev_err(dev, " paddrh[%x]\n", paddrh); 3580 dev_err(dev, " rcvq->head[%p]\n", rcvq->head); 3581 dev_err(dev, " rcvq->tail[%p]\n", rcvq->tail); 3582 dev_err(dev, " rcvq->count[%x]\n", rcvq->count); 3583 } 3584 if (paddrh == 0) { 3585 slic_reg32_write(&adapter->slic_regs->slic_hbar, (u32)paddrl, 3586 DONT_FLUSH); 3587 } else { 3588 slic_reg64_write(adapter, &adapter->slic_regs->slic_hbar64, 3589 paddrl, &adapter->slic_regs->slic_addr_upper, 3590 paddrh, DONT_FLUSH); 3591 } 3592 if (rcvq->head) 3593 rcvq->tail->next = skb; 3594 else 3595 rcvq->head = skb; 3596 rcvq->tail = skb; 3597 rcvq->count++; 3598 return rcvq->count; 3599} 3600 3601static int slic_debug_card_show(struct seq_file *seq, void *v) 3602{ 3603#ifdef MOOKTODO 3604 int i; 3605 struct sliccard *card = seq->private; 3606 struct slic_config *config = &card->config; 3607 unsigned char *fru = (unsigned char *)(&card->config.atk_fru); 3608 unsigned char *oemfru = (unsigned char *)(&card->config.OemFru); 3609#endif 3610 3611 seq_printf(seq, "driver_version : %s\n", slic_proc_version); 3612 seq_printf(seq, "Microcode versions: \n"); 3613 seq_printf(seq, " Gigabit (gb) : %s %s\n", 3614 MOJAVE_UCODE_VERS_STRING, MOJAVE_UCODE_VERS_DATE); 3615 seq_printf(seq, " Gigabit Receiver : %s %s\n", 3616 GB_RCVUCODE_VERS_STRING, GB_RCVUCODE_VERS_DATE); 3617 seq_printf(seq, "Vendor : %s\n", slic_vendor); 3618 seq_printf(seq, "Product Name : %s\n", slic_product_name); 3619#ifdef MOOKTODO 3620 seq_printf(seq, "VendorId : %4.4X\n", 3621 config->VendorId); 3622 seq_printf(seq, "DeviceId : %4.4X\n", 3623 config->DeviceId); 3624 seq_printf(seq, "RevisionId : %2.2x\n", 3625 config->RevisionId); 3626 seq_printf(seq, "Bus # : %d\n", card->busnumber); 3627 seq_printf(seq, "Device # : %d\n", card->slotnumber); 3628 seq_printf(seq, "Interfaces : %d\n", card->card_size); 3629 seq_printf(seq, " Initialized : %d\n", 3630 card->adapters_activated); 3631 seq_printf(seq, " Allocated : %d\n", 3632 card->adapters_allocated); 3633 ASSERT(card->card_size <= SLIC_NBR_MACS); 3634 for (i = 0; i < card->card_size; i++) { 3635 seq_printf(seq, 3636 " MAC%d : %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X\n", 3637 i, config->macinfo[i].macaddrA[0], 3638 config->macinfo[i].macaddrA[1], 3639 config->macinfo[i].macaddrA[2], 3640 config->macinfo[i].macaddrA[3], 3641 config->macinfo[i].macaddrA[4], 3642 config->macinfo[i].macaddrA[5]); 3643 } 3644 seq_printf(seq, " IF Init State Duplex/Speed irq\n"); 3645 seq_printf(seq, " -------------------------------\n"); 3646 for (i = 0; i < card->adapters_allocated; i++) { 3647 struct adapter *adapter; 3648 3649 adapter = card->adapter[i]; 3650 if (adapter) { 3651 seq_printf(seq, 3652 " %d %d %s %s %s 0x%X\n", 3653 adapter->physport, adapter->state, 3654 SLIC_LINKSTATE(adapter->linkstate), 3655 SLIC_DUPLEX(adapter->linkduplex), 3656 SLIC_SPEED(adapter->linkspeed), 3657 (uint) adapter->irq); 3658 } 3659 } 3660 seq_printf(seq, "Generation # : %4.4X\n", card->gennumber); 3661 seq_printf(seq, "RcvQ max entries : %4.4X\n", 3662 SLIC_RCVQ_ENTRIES); 3663 seq_printf(seq, "Ping Status : %8.8X\n", 3664 card->pingstatus); 3665 seq_printf(seq, "Minimum grant : %2.2x\n", 3666 config->MinGrant); 3667 seq_printf(seq, "Maximum Latency : %2.2x\n", config->MaxLat); 3668 seq_printf(seq, "PciStatus : %4.4x\n", 3669 config->Pcistatus); 3670 seq_printf(seq, "Debug Device Id : %4.4x\n", 3671 config->DbgDevId); 3672 seq_printf(seq, "DRAM ROM Function : %4.4x\n", 3673 config->DramRomFn); 3674 seq_printf(seq, "Network interface Pin 1 : %2.2x\n", 3675 config->NetIntPin1); 3676 seq_printf(seq, "Network interface Pin 2 : %2.2x\n", 3677 config->NetIntPin1); 3678 seq_printf(seq, "Network interface Pin 3 : %2.2x\n", 3679 config->NetIntPin1); 3680 seq_printf(seq, "PM capabilities : %4.4X\n", 3681 config->PMECapab); 3682 seq_printf(seq, "Network Clock Controls : %4.4X\n", 3683 config->NwClkCtrls); 3684 3685 switch (config->FruFormat) { 3686 case ATK_FRU_FORMAT: 3687 { 3688 seq_printf(seq, 3689 "Vendor : Alacritech, Inc.\n"); 3690 seq_printf(seq, 3691 "Assembly # : %c%c%c%c%c%c\n", 3692 fru[0], fru[1], fru[2], fru[3], fru[4], 3693 fru[5]); 3694 seq_printf(seq, 3695 "Revision # : %c%c\n", 3696 fru[6], fru[7]); 3697 3698 if (config->OEMFruFormat == VENDOR4_FRU_FORMAT) { 3699 seq_printf(seq, 3700 "Serial # : " 3701 "%c%c%c%c%c%c%c%c%c%c%c%c\n", 3702 fru[8], fru[9], fru[10], 3703 fru[11], fru[12], fru[13], 3704 fru[16], fru[17], fru[18], 3705 fru[19], fru[20], fru[21]); 3706 } else { 3707 seq_printf(seq, 3708 "Serial # : " 3709 "%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", 3710 fru[8], fru[9], fru[10], 3711 fru[11], fru[12], fru[13], 3712 fru[14], fru[15], fru[16], 3713 fru[17], fru[18], fru[19], 3714 fru[20], fru[21]); 3715 } 3716 break; 3717 } 3718 3719 default: 3720 { 3721 seq_printf(seq, 3722 "Vendor : Alacritech, Inc.\n"); 3723 seq_printf(seq, 3724 "Serial # : Empty FRU\n"); 3725 break; 3726 } 3727 } 3728 3729 switch (config->OEMFruFormat) { 3730 case VENDOR1_FRU_FORMAT: 3731 { 3732 seq_printf(seq, "FRU Information:\n"); 3733 seq_printf(seq, " Commodity # : %c\n", 3734 oemfru[0]); 3735 seq_printf(seq, 3736 " Assembly # : %c%c%c%c\n", 3737 oemfru[1], oemfru[2], oemfru[3], oemfru[4]); 3738 seq_printf(seq, 3739 " Revision # : %c%c\n", 3740 oemfru[5], oemfru[6]); 3741 seq_printf(seq, 3742 " Supplier # : %c%c\n", 3743 oemfru[7], oemfru[8]); 3744 seq_printf(seq, 3745 " Date : %c%c\n", 3746 oemfru[9], oemfru[10]); 3747 seq_sprintf(seq, 3748 " Sequence # : %c%c%c\n", 3749 oemfru[11], oemfru[12], oemfru[13]); 3750 break; 3751 } 3752 3753 case VENDOR2_FRU_FORMAT: 3754 { 3755 seq_printf(seq, "FRU Information:\n"); 3756 seq_printf(seq, 3757 " Part # : " 3758 "%c%c%c%c%c%c%c%c\n", 3759 oemfru[0], oemfru[1], oemfru[2], 3760 oemfru[3], oemfru[4], oemfru[5], 3761 oemfru[6], oemfru[7]); 3762 seq_printf(seq, 3763 " Supplier # : %c%c%c%c%c\n", 3764 oemfru[8], oemfru[9], oemfru[10], 3765 oemfru[11], oemfru[12]); 3766 seq_printf(seq, 3767 " Date : %c%c%c\n", 3768 oemfru[13], oemfru[14], oemfru[15]); 3769 seq_sprintf(seq, 3770 " Sequence # : %c%c%c%c\n", 3771 oemfru[16], oemfru[17], oemfru[18], 3772 oemfru[19]); 3773 break; 3774 } 3775 3776 case VENDOR3_FRU_FORMAT: 3777 { 3778 seq_printf(seq, "FRU Information:\n"); 3779 } 3780 3781 case VENDOR4_FRU_FORMAT: 3782 { 3783 seq_printf(seq, "FRU Information:\n"); 3784 seq_printf(seq, 3785 " FRU Number : " 3786 "%c%c%c%c%c%c%c%c\n", 3787 oemfru[0], oemfru[1], oemfru[2], 3788 oemfru[3], oemfru[4], oemfru[5], 3789 oemfru[6], oemfru[7]); 3790 seq_sprintf(seq, 3791 " Part Number : " 3792 "%c%c%c%c%c%c%c%c\n", 3793 oemfru[8], oemfru[9], oemfru[10], 3794 oemfru[11], oemfru[12], oemfru[13], 3795 oemfru[14], oemfru[15]); 3796 seq_printf(seq, 3797 " EC Level : " 3798 "%c%c%c%c%c%c%c%c\n", 3799 oemfru[16], oemfru[17], oemfru[18], 3800 oemfru[19], oemfru[20], oemfru[21], 3801 oemfru[22], oemfru[23]); 3802 break; 3803 } 3804 3805 default: 3806 break; 3807 } 3808#endif 3809 3810 return 0; 3811} 3812 3813static int slic_debug_adapter_show(struct seq_file *seq, void *v) 3814{ 3815 struct adapter *adapter = seq->private; 3816 3817 if ((adapter->netdev) && (adapter->netdev->name)) { 3818 seq_printf(seq, "info: interface : %s\n", 3819 adapter->netdev->name); 3820 } 3821 seq_printf(seq, "info: status : %s\n", 3822 SLIC_LINKSTATE(adapter->linkstate)); 3823 seq_printf(seq, "info: port : %d\n", 3824 adapter->physport); 3825 seq_printf(seq, "info: speed : %s\n", 3826 SLIC_SPEED(adapter->linkspeed)); 3827 seq_printf(seq, "info: duplex : %s\n", 3828 SLIC_DUPLEX(adapter->linkduplex)); 3829 seq_printf(seq, "info: irq : 0x%X\n", 3830 (uint) adapter->irq); 3831 seq_printf(seq, "info: Interrupt Agg Delay: %d usec\n", 3832 adapter->card->loadlevel_current); 3833 seq_printf(seq, "info: RcvQ max entries : %4.4X\n", 3834 SLIC_RCVQ_ENTRIES); 3835 seq_printf(seq, "info: RcvQ current : %4.4X\n", 3836 adapter->rcvqueue.count); 3837 seq_printf(seq, "rx stats: packets : %8.8lX\n", 3838 adapter->stats.rx_packets); 3839 seq_printf(seq, "rx stats: bytes : %8.8lX\n", 3840 adapter->stats.rx_bytes); 3841 seq_printf(seq, "rx stats: broadcasts : %8.8X\n", 3842 adapter->rcv_broadcasts); 3843 seq_printf(seq, "rx stats: multicasts : %8.8X\n", 3844 adapter->rcv_multicasts); 3845 seq_printf(seq, "rx stats: unicasts : %8.8X\n", 3846 adapter->rcv_unicasts); 3847 seq_printf(seq, "rx stats: errors : %8.8X\n", 3848 (u32) adapter->slic_stats.iface.rcv_errors); 3849 seq_printf(seq, "rx stats: Missed errors : %8.8X\n", 3850 (u32) adapter->slic_stats.iface.rcv_discards); 3851 seq_printf(seq, "rx stats: drops : %8.8X\n", 3852 (u32) adapter->rcv_drops); 3853 seq_printf(seq, "tx stats: packets : %8.8lX\n", 3854 adapter->stats.tx_packets); 3855 seq_printf(seq, "tx stats: bytes : %8.8lX\n", 3856 adapter->stats.tx_bytes); 3857 seq_printf(seq, "tx stats: errors : %8.8X\n", 3858 (u32) adapter->slic_stats.iface.xmt_errors); 3859 seq_printf(seq, "rx stats: multicasts : %8.8lX\n", 3860 adapter->stats.multicast); 3861 seq_printf(seq, "tx stats: collision errors : %8.8X\n", 3862 (u32) adapter->slic_stats.iface.xmit_collisions); 3863 seq_printf(seq, "perf: Max rcv frames/isr : %8.8X\n", 3864 adapter->max_isr_rcvs); 3865 seq_printf(seq, "perf: Rcv interrupt yields : %8.8X\n", 3866 adapter->rcv_interrupt_yields); 3867 seq_printf(seq, "perf: Max xmit complete/isr : %8.8X\n", 3868 adapter->max_isr_xmits); 3869 seq_printf(seq, "perf: error interrupts : %8.8X\n", 3870 adapter->error_interrupts); 3871 seq_printf(seq, "perf: error rmiss interrupts : %8.8X\n", 3872 adapter->error_rmiss_interrupts); 3873 seq_printf(seq, "perf: rcv interrupts : %8.8X\n", 3874 adapter->rcv_interrupts); 3875 seq_printf(seq, "perf: xmit interrupts : %8.8X\n", 3876 adapter->xmit_interrupts); 3877 seq_printf(seq, "perf: link event interrupts : %8.8X\n", 3878 adapter->linkevent_interrupts); 3879 seq_printf(seq, "perf: UPR interrupts : %8.8X\n", 3880 adapter->upr_interrupts); 3881 seq_printf(seq, "perf: interrupt count : %8.8X\n", 3882 adapter->num_isrs); 3883 seq_printf(seq, "perf: false interrupts : %8.8X\n", 3884 adapter->false_interrupts); 3885 seq_printf(seq, "perf: All register writes : %8.8X\n", 3886 adapter->all_reg_writes); 3887 seq_printf(seq, "perf: ICR register writes : %8.8X\n", 3888 adapter->icr_reg_writes); 3889 seq_printf(seq, "perf: ISR register writes : %8.8X\n", 3890 adapter->isr_reg_writes); 3891 seq_printf(seq, "ifevents: overflow 802 errors : %8.8X\n", 3892 adapter->if_events.oflow802); 3893 seq_printf(seq, "ifevents: transport overflow errors: %8.8X\n", 3894 adapter->if_events.Tprtoflow); 3895 seq_printf(seq, "ifevents: underflow errors : %8.8X\n", 3896 adapter->if_events.uflow802); 3897 seq_printf(seq, "ifevents: receive early : %8.8X\n", 3898 adapter->if_events.rcvearly); 3899 seq_printf(seq, "ifevents: buffer overflows : %8.8X\n", 3900 adapter->if_events.Bufov); 3901 seq_printf(seq, "ifevents: carrier errors : %8.8X\n", 3902 adapter->if_events.Carre); 3903 seq_printf(seq, "ifevents: Long : %8.8X\n", 3904 adapter->if_events.Longe); 3905 seq_printf(seq, "ifevents: invalid preambles : %8.8X\n", 3906 adapter->if_events.Invp); 3907 seq_printf(seq, "ifevents: CRC errors : %8.8X\n", 3908 adapter->if_events.Crc); 3909 seq_printf(seq, "ifevents: dribble nibbles : %8.8X\n", 3910 adapter->if_events.Drbl); 3911 seq_printf(seq, "ifevents: Code violations : %8.8X\n", 3912 adapter->if_events.Code); 3913 seq_printf(seq, "ifevents: TCP checksum errors : %8.8X\n", 3914 adapter->if_events.TpCsum); 3915 seq_printf(seq, "ifevents: TCP header short errors : %8.8X\n", 3916 adapter->if_events.TpHlen); 3917 seq_printf(seq, "ifevents: IP checksum errors : %8.8X\n", 3918 adapter->if_events.IpCsum); 3919 seq_printf(seq, "ifevents: IP frame incompletes : %8.8X\n", 3920 adapter->if_events.IpLen); 3921 seq_printf(seq, "ifevents: IP headers shorts : %8.8X\n", 3922 adapter->if_events.IpHlen); 3923 3924 return 0; 3925} 3926static int slic_debug_adapter_open(struct inode *inode, struct file *file) 3927{ 3928 return single_open(file, slic_debug_adapter_show, inode->i_private); 3929} 3930 3931static int slic_debug_card_open(struct inode *inode, struct file *file) 3932{ 3933 return single_open(file, slic_debug_card_show, inode->i_private); 3934} 3935 3936static const struct file_operations slic_debug_adapter_fops = { 3937 .owner = THIS_MODULE, 3938 .open = slic_debug_adapter_open, 3939 .read = seq_read, 3940 .llseek = seq_lseek, 3941 .release = single_release, 3942}; 3943 3944static const struct file_operations slic_debug_card_fops = { 3945 .owner = THIS_MODULE, 3946 .open = slic_debug_card_open, 3947 .read = seq_read, 3948 .llseek = seq_lseek, 3949 .release = single_release, 3950}; 3951 3952static void slic_debug_adapter_create(struct adapter *adapter) 3953{ 3954 struct dentry *d; 3955 char name[7]; 3956 struct sliccard *card = adapter->card; 3957 3958 if (!card->debugfs_dir) 3959 return; 3960 3961 sprintf(name, "port%d", adapter->port); 3962 d = debugfs_create_file(name, S_IRUGO, 3963 card->debugfs_dir, adapter, 3964 &slic_debug_adapter_fops); 3965 if (!d || IS_ERR(d)) 3966 pr_info(PFX "%s: debugfs create failed\n", name); 3967 else 3968 adapter->debugfs_entry = d; 3969} 3970 3971static void slic_debug_adapter_destroy(struct adapter *adapter) 3972{ 3973 debugfs_remove(adapter->debugfs_entry); 3974 adapter->debugfs_entry = NULL; 3975} 3976 3977static void slic_debug_card_create(struct sliccard *card) 3978{ 3979 struct dentry *d; 3980 char name[IFNAMSIZ]; 3981 3982 snprintf(name, sizeof(name), "slic%d", card->cardnum); 3983 d = debugfs_create_dir(name, slic_debugfs); 3984 if (!d || IS_ERR(d)) 3985 pr_info(PFX "%s: debugfs create dir failed\n", 3986 name); 3987 else { 3988 card->debugfs_dir = d; 3989 d = debugfs_create_file("cardinfo", S_IRUGO, 3990 slic_debugfs, card, 3991 &slic_debug_card_fops); 3992 if (!d || IS_ERR(d)) 3993 pr_info(PFX "%s: debugfs create failed\n", 3994 name); 3995 else 3996 card->debugfs_cardinfo = d; 3997 } 3998} 3999 4000static void slic_debug_card_destroy(struct sliccard *card) 4001{ 4002 int i; 4003 4004 for (i = 0; i < card->card_size; i++) { 4005 struct adapter *adapter; 4006 4007 adapter = card->adapter[i]; 4008 if (adapter) 4009 slic_debug_adapter_destroy(adapter); 4010 } 4011 if (card->debugfs_cardinfo) { 4012 debugfs_remove(card->debugfs_cardinfo); 4013 card->debugfs_cardinfo = NULL; 4014 } 4015 if (card->debugfs_dir) { 4016 debugfs_remove(card->debugfs_dir); 4017 card->debugfs_dir = NULL; 4018 } 4019} 4020 4021static void slic_debug_init(void) 4022{ 4023 struct dentry *ent; 4024 4025 ent = debugfs_create_dir("slic", NULL); 4026 if (!ent || IS_ERR(ent)) { 4027 pr_info(PFX "debugfs create directory failed\n"); 4028 return; 4029 } 4030 4031 slic_debugfs = ent; 4032} 4033 4034static void slic_debug_cleanup(void) 4035{ 4036 if (slic_debugfs) { 4037 debugfs_remove(slic_debugfs); 4038 slic_debugfs = NULL; 4039 } 4040} 4041 4042/******************************************************************************/ 4043/**************** MODULE INITIATION / TERMINATION FUNCTIONS ***************/ 4044/******************************************************************************/ 4045 4046static struct pci_driver slic_driver = { 4047 .name = DRV_NAME, 4048 .id_table = slic_pci_tbl, 4049 .probe = slic_entry_probe, 4050 .remove = __devexit_p(slic_entry_remove), 4051}; 4052 4053static int __init slic_module_init(void) 4054{ 4055 slic_init_driver(); 4056 4057 if (debug >= 0 && slic_debug != debug) 4058 printk(KERN_DEBUG KBUILD_MODNAME ": debug level is %d.\n", 4059 debug); 4060 if (debug >= 0) 4061 slic_debug = debug; 4062 4063 return pci_register_driver(&slic_driver); 4064} 4065 4066static void __exit slic_module_cleanup(void) 4067{ 4068 pci_unregister_driver(&slic_driver); 4069 slic_debug_cleanup(); 4070} 4071 4072module_init(slic_module_init); 4073module_exit(slic_module_cleanup);