Lines Matching +full:mini +full:- +full:core
5 * Copyright 1998-2002 by Jes Sorensen, <jes@trained-monkey.org>.
12 * about the driver. Send mail to linux-acenic-help@sunsite.auc.dk to
59 #include <linux/dma-mapping.h>
96 #define ACE_IS_TIGON_I(ap) (ap->version == 1)
97 #define ACE_TX_RING_ENTRIES(ap) ap->tx_ring_entries
121 * to care - stinky!
169 #define BOARD_IDX_OVERFLOW -1
194 * the parts dealing with the i2c eeprom on the card ;-)
209 * trace=<val> - Firmware trace level. This requires special traced
211 * the driver - for debugging purposes only.
213 * link=<val> - Link state. Normally you want to use the default link
217 * 0x0001 - Force half duplex link.
218 * 0x0002 - Do not negotiate line speed with the other end.
219 * 0x0010 - 10Mbit/sec link.
220 * 0x0020 - 100Mbit/sec link.
221 * 0x0040 - 1000Mbit/sec link.
222 * 0x0100 - Do not negotiate flow control.
223 * 0x0200 - Enable RX flow control Y
224 * 0x0400 - Enable TX flow control Y (Tigon II NICs only).
232 * tx_coal_tick=<val> - number of coalescing clock ticks (us) allowed
237 * rx_coal_tick=<val> - number of coalescing clock ticks (us) allowed
242 * max_tx_desc=<val> - maximum number of transmit descriptors
245 * max_rx_desc=<val> - maximum number of receive descriptors
248 * tx_ratio=<val> - 7 bit value (0 - 63) specifying the split in 64th
254 * dis_pci_mem_inval=<val> - disable PCI memory write and invalidate
267 * - Proper multicast support.
268 * - NIC dump support.
269 * - More tuning parameters.
271 * The mini ring is not used under Linux and I am not sure it makes sense
287 * RX_LOW_BUF_THRES - allocate buffers in the bottom half
288 * RX_PANIC_LOW_THRES - we are very low on buffers, allocate
290 * RX_RING_THRES - maximum number of buffers in the rx ring
291 * RX_MINI_THRES - maximum number of buffers in the mini ring
292 * RX_JUMBO_THRES - maximum number of buffers in the jumbo ring
324 * Threshold values for RX buffer allocation - the low water marks for
348 * Size of the mini ring entries, basically these just should be big
406 MODULE_AUTHOR("Jes Sorensen <jes@trained-monkey.org>");
427 …M_DESC(tx_ratio, "AceNIC/3C985/GA620 ratio of NIC memory used for TX/RX descriptors (range 0-63)");
431 "acenic.c: v0.92 08/05/2002 Jes Sorensen, linux-acenic@SunSITE.dk\n"
469 return -ENOMEM; in acenic_probe_one()
472 SET_NETDEV_DEV(dev, &pdev->dev); in acenic_probe_one()
475 ap->pdev = pdev; in acenic_probe_one()
476 ap->name = pci_name(pdev); in acenic_probe_one()
478 dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; in acenic_probe_one()
479 dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; in acenic_probe_one()
481 dev->watchdog_timeo = 5*HZ; in acenic_probe_one()
483 dev->netdev_ops = &ace_netdev_ops; in acenic_probe_one()
500 pci_read_config_word(pdev, PCI_COMMAND, &ap->pci_command); in acenic_probe_one()
502 /* OpenFirmware on Mac's does not set this - DOH.. */ in acenic_probe_one()
503 if (!(ap->pci_command & PCI_COMMAND_MEMORY)) { in acenic_probe_one()
505 "access - was not enabled by BIOS/Firmware\n", in acenic_probe_one()
506 ap->name); in acenic_probe_one()
507 ap->pci_command = ap->pci_command | PCI_COMMAND_MEMORY; in acenic_probe_one()
508 pci_write_config_word(ap->pdev, PCI_COMMAND, in acenic_probe_one()
509 ap->pci_command); in acenic_probe_one()
513 pci_read_config_byte(pdev, PCI_LATENCY_TIMER, &ap->pci_latency); in acenic_probe_one()
514 if (ap->pci_latency <= 0x40) { in acenic_probe_one()
515 ap->pci_latency = 0x40; in acenic_probe_one()
516 pci_write_config_byte(pdev, PCI_LATENCY_TIMER, ap->pci_latency); in acenic_probe_one()
520 * Remap the regs into kernel space - this is abuse of in acenic_probe_one()
521 * dev->base_addr since it was means for I/O port in acenic_probe_one()
524 dev->base_addr = pci_resource_start(pdev, 0); in acenic_probe_one()
525 ap->regs = ioremap(dev->base_addr, 0x4000); in acenic_probe_one()
526 if (!ap->regs) { in acenic_probe_one()
529 ap->name, boards_found); in acenic_probe_one()
533 switch(pdev->vendor) { in acenic_probe_one()
535 if (pdev->device == PCI_DEVICE_ID_FARALLON_PN9100T) { in acenic_probe_one()
536 printk(KERN_INFO "%s: Farallon PN9100-T ", in acenic_probe_one()
537 ap->name); in acenic_probe_one()
540 ap->name); in acenic_probe_one()
544 printk(KERN_INFO "%s: 3Com 3C985 ", ap->name); in acenic_probe_one()
547 printk(KERN_INFO "%s: NetGear GA620 ", ap->name); in acenic_probe_one()
550 if (pdev->device == PCI_DEVICE_ID_FARALLON_PN9000SX) { in acenic_probe_one()
551 printk(KERN_INFO "%s: Farallon PN9000-SX ", in acenic_probe_one()
552 ap->name); in acenic_probe_one()
556 printk(KERN_INFO "%s: SGI AceNIC ", ap->name); in acenic_probe_one()
559 printk(KERN_INFO "%s: Unknown AceNIC ", ap->name); in acenic_probe_one()
563 printk("Gigabit Ethernet at 0x%08lx, ", dev->base_addr); in acenic_probe_one()
564 printk("irq %d\n", pdev->irq); in acenic_probe_one()
567 if ((readl(&ap->regs->HostCtrl) >> 28) == 4) { in acenic_probe_one()
569 " support - NIC disabled\n", dev->name); in acenic_probe_one()
579 ap->board_idx = BOARD_IDX_OVERFLOW; in acenic_probe_one()
581 ap->board_idx = boards_found; in acenic_probe_one()
583 ap->board_idx = BOARD_IDX_STATIC; in acenic_probe_one()
593 ap->name = dev->name; in acenic_probe_one()
595 if (ap->pci_using_dac) in acenic_probe_one()
596 dev->features |= NETIF_F_HIGHDMA; in acenic_probe_one()
607 return -ENODEV; in acenic_probe_one()
614 struct ace_regs __iomem *regs = ap->regs; in acenic_remove_one()
619 writel(readl(®s->CpuCtrl) | CPU_HALT, ®s->CpuCtrl); in acenic_remove_one()
620 if (ap->version >= 2) in acenic_remove_one()
621 writel(readl(®s->CpuBCtrl) | CPU_HALT, ®s->CpuBCtrl); in acenic_remove_one()
626 writel(1, ®s->Mb0Lo); in acenic_remove_one()
627 readl(®s->CpuCtrl); /* flush */ in acenic_remove_one()
635 * Then release the RX buffers - jumbo buffers were in acenic_remove_one()
638 ace_sync_irq(dev->irq); in acenic_remove_one()
641 struct sk_buff *skb = ap->skb->rx_std_skbuff[i].skb; in acenic_remove_one()
647 ringp = &ap->skb->rx_std_skbuff[i]; in acenic_remove_one()
649 pci_unmap_page(ap->pdev, mapping, in acenic_remove_one()
653 ap->rx_std_ring[i].size = 0; in acenic_remove_one()
654 ap->skb->rx_std_skbuff[i].skb = NULL; in acenic_remove_one()
659 if (ap->version >= 2) { in acenic_remove_one()
661 struct sk_buff *skb = ap->skb->rx_mini_skbuff[i].skb; in acenic_remove_one()
667 ringp = &ap->skb->rx_mini_skbuff[i]; in acenic_remove_one()
669 pci_unmap_page(ap->pdev, mapping, in acenic_remove_one()
673 ap->rx_mini_ring[i].size = 0; in acenic_remove_one()
674 ap->skb->rx_mini_skbuff[i].skb = NULL; in acenic_remove_one()
681 struct sk_buff *skb = ap->skb->rx_jumbo_skbuff[i].skb; in acenic_remove_one()
686 ringp = &ap->skb->rx_jumbo_skbuff[i]; in acenic_remove_one()
688 pci_unmap_page(ap->pdev, mapping, in acenic_remove_one()
692 ap->rx_jumbo_ring[i].size = 0; in acenic_remove_one()
693 ap->skb->rx_jumbo_skbuff[i].skb = NULL; in acenic_remove_one()
727 if (ap->rx_std_ring != NULL) { in ace_free_descriptors()
733 pci_free_consistent(ap->pdev, size, ap->rx_std_ring, in ace_free_descriptors()
734 ap->rx_ring_base_dma); in ace_free_descriptors()
735 ap->rx_std_ring = NULL; in ace_free_descriptors()
736 ap->rx_jumbo_ring = NULL; in ace_free_descriptors()
737 ap->rx_mini_ring = NULL; in ace_free_descriptors()
738 ap->rx_return_ring = NULL; in ace_free_descriptors()
740 if (ap->evt_ring != NULL) { in ace_free_descriptors()
742 pci_free_consistent(ap->pdev, size, ap->evt_ring, in ace_free_descriptors()
743 ap->evt_ring_dma); in ace_free_descriptors()
744 ap->evt_ring = NULL; in ace_free_descriptors()
746 if (ap->tx_ring != NULL && !ACE_IS_TIGON_I(ap)) { in ace_free_descriptors()
748 pci_free_consistent(ap->pdev, size, ap->tx_ring, in ace_free_descriptors()
749 ap->tx_ring_dma); in ace_free_descriptors()
751 ap->tx_ring = NULL; in ace_free_descriptors()
753 if (ap->evt_prd != NULL) { in ace_free_descriptors()
754 pci_free_consistent(ap->pdev, sizeof(u32), in ace_free_descriptors()
755 (void *)ap->evt_prd, ap->evt_prd_dma); in ace_free_descriptors()
756 ap->evt_prd = NULL; in ace_free_descriptors()
758 if (ap->rx_ret_prd != NULL) { in ace_free_descriptors()
759 pci_free_consistent(ap->pdev, sizeof(u32), in ace_free_descriptors()
760 (void *)ap->rx_ret_prd, in ace_free_descriptors()
761 ap->rx_ret_prd_dma); in ace_free_descriptors()
762 ap->rx_ret_prd = NULL; in ace_free_descriptors()
764 if (ap->tx_csm != NULL) { in ace_free_descriptors()
765 pci_free_consistent(ap->pdev, sizeof(u32), in ace_free_descriptors()
766 (void *)ap->tx_csm, ap->tx_csm_dma); in ace_free_descriptors()
767 ap->tx_csm = NULL; in ace_free_descriptors()
783 ap->rx_std_ring = pci_alloc_consistent(ap->pdev, size, in ace_allocate_descriptors()
784 &ap->rx_ring_base_dma); in ace_allocate_descriptors()
785 if (ap->rx_std_ring == NULL) in ace_allocate_descriptors()
788 ap->rx_jumbo_ring = ap->rx_std_ring + RX_STD_RING_ENTRIES; in ace_allocate_descriptors()
789 ap->rx_mini_ring = ap->rx_jumbo_ring + RX_JUMBO_RING_ENTRIES; in ace_allocate_descriptors()
790 ap->rx_return_ring = ap->rx_mini_ring + RX_MINI_RING_ENTRIES; in ace_allocate_descriptors()
794 ap->evt_ring = pci_alloc_consistent(ap->pdev, size, &ap->evt_ring_dma); in ace_allocate_descriptors()
796 if (ap->evt_ring == NULL) in ace_allocate_descriptors()
801 * has to use PCI registers for this ;-( in ace_allocate_descriptors()
806 ap->tx_ring = pci_alloc_consistent(ap->pdev, size, in ace_allocate_descriptors()
807 &ap->tx_ring_dma); in ace_allocate_descriptors()
809 if (ap->tx_ring == NULL) in ace_allocate_descriptors()
813 ap->evt_prd = pci_alloc_consistent(ap->pdev, sizeof(u32), in ace_allocate_descriptors()
814 &ap->evt_prd_dma); in ace_allocate_descriptors()
815 if (ap->evt_prd == NULL) in ace_allocate_descriptors()
818 ap->rx_ret_prd = pci_alloc_consistent(ap->pdev, sizeof(u32), in ace_allocate_descriptors()
819 &ap->rx_ret_prd_dma); in ace_allocate_descriptors()
820 if (ap->rx_ret_prd == NULL) in ace_allocate_descriptors()
823 ap->tx_csm = pci_alloc_consistent(ap->pdev, sizeof(u32), in ace_allocate_descriptors()
824 &ap->tx_csm_dma); in ace_allocate_descriptors()
825 if (ap->tx_csm == NULL) in ace_allocate_descriptors()
849 if (ap->info) in ace_init_cleanup()
850 pci_free_consistent(ap->pdev, sizeof(struct ace_info), in ace_init_cleanup()
851 ap->info, ap->info_dma); in ace_init_cleanup()
852 kfree(ap->skb); in ace_init_cleanup()
853 kfree(ap->trace_buf); in ace_init_cleanup()
855 if (dev->irq) in ace_init_cleanup()
856 free_irq(dev->irq, dev); in ace_init_cleanup()
858 iounmap(ap->regs); in ace_init_cleanup()
869 idx = readl(®s->CmdPrd); in ace_issue_cmd()
871 writel(*(u32 *)(cmd), ®s->CmdRng[idx]); in ace_issue_cmd()
874 writel(idx, ®s->CmdPrd); in ace_issue_cmd()
892 regs = ap->regs; in ace_init()
894 board_idx = ap->board_idx; in ace_init()
897 * aman@sgi.com - its useful to do a NIC reset here to in ace_init()
901 writel(HW_RESET | (HW_RESET << 24), ®s->HostCtrl); in ace_init()
902 readl(®s->HostCtrl); /* PCI write posting */ in ace_init()
914 ®s->HostCtrl); in ace_init()
917 ®s->HostCtrl); in ace_init()
919 readl(®s->HostCtrl); /* PCI write posting */ in ace_init()
924 writel(readl(®s->CpuCtrl) | CPU_HALT, ®s->CpuCtrl); in ace_init()
925 readl(®s->CpuCtrl); /* PCI write posting */ in ace_init()
926 writel(0, ®s->Mb0Lo); in ace_init()
928 tig_ver = readl(®s->HostCtrl) >> 28; in ace_init()
935 tig_ver, ap->firmware_major, ap->firmware_minor, in ace_init()
936 ap->firmware_fix); in ace_init()
937 writel(0, ®s->LocalCtrl); in ace_init()
938 ap->version = 1; in ace_init()
939 ap->tx_ring_entries = TIGON_I_TX_RING_ENTRIES; in ace_init()
944 tig_ver, ap->firmware_major, ap->firmware_minor, in ace_init()
945 ap->firmware_fix); in ace_init()
946 writel(readl(®s->CpuBCtrl) | CPU_HALT, ®s->CpuBCtrl); in ace_init()
947 readl(®s->CpuBCtrl); /* PCI write posting */ in ace_init()
953 writel(SRAM_BANK_512K, ®s->LocalCtrl); in ace_init()
954 writel(SYNC_SRAM_TIMING, ®s->MiscCfg); in ace_init()
955 ap->version = 2; in ace_init()
956 ap->tx_ring_entries = MAX_TX_RING_ENTRIES; in ace_init()
961 ecode = -ENODEV; in ace_init()
974 ACE_WORD_SWAP_BD | ACE_NO_JUMBO_FRAG, ®s->ModeStat); in ace_init()
977 ACE_WORD_SWAP_BD | ACE_NO_JUMBO_FRAG, ®s->ModeStat); in ace_init()
979 readl(®s->ModeStat); /* PCI write posting */ in ace_init()
988 ecode = -EIO; in ace_init()
1000 ecode = -EIO; in ace_init()
1006 writel(mac1, ®s->MacAddrHi); in ace_init()
1007 writel(mac2, ®s->MacAddrLo); in ace_init()
1009 dev->dev_addr[0] = (mac1 >> 8) & 0xff; in ace_init()
1010 dev->dev_addr[1] = mac1 & 0xff; in ace_init()
1011 dev->dev_addr[2] = (mac2 >> 24) & 0xff; in ace_init()
1012 dev->dev_addr[3] = (mac2 >> 16) & 0xff; in ace_init()
1013 dev->dev_addr[4] = (mac2 >> 8) & 0xff; in ace_init()
1014 dev->dev_addr[5] = mac2 & 0xff; in ace_init()
1016 printk("MAC: %pM\n", dev->dev_addr); in ace_init()
1024 pdev = ap->pdev; in ace_init()
1039 pci_state = readl(®s->PciState); in ace_init()
1044 ap->pci_latency); in ace_init()
1054 * - that is what Alteon does for NT. in ace_init()
1057 if (ap->version >= 2) { in ace_init()
1064 if (ap->pci_command & PCI_COMMAND_INVALIDATE) { in ace_init()
1065 ap->pci_command &= ~PCI_COMMAND_INVALIDATE; in ace_init()
1067 ap->pci_command); in ace_init()
1071 } else if (ap->pci_command & PCI_COMMAND_INVALIDATE) { in ace_init()
1092 ap->pci_command &= ~PCI_COMMAND_INVALIDATE; in ace_init()
1094 ap->pci_command); in ace_init()
1102 * are. We use 64-byte maximum bursts, because if we in ace_init()
1105 * PCI controller will disconnect at 64-byte multiples. in ace_init()
1107 * Read-multiple will be properly enabled above, and when in ace_init()
1125 writel(tmp, ®s->PciState); in ace_init()
1132 * the PCI-PCI bridge if that applies). in ace_init()
1133 * -ggg in ace_init()
1139 if (!(ap->pci_command & PCI_COMMAND_FAST_BACK)) { in ace_init()
1141 ap->pci_command |= PCI_COMMAND_FAST_BACK; in ace_init()
1142 pci_write_config_word(pdev, PCI_COMMAND, ap->pci_command); in ace_init()
1150 ap->pci_using_dac = 1; in ace_init()
1152 ap->pci_using_dac = 0; in ace_init()
1154 ecode = -ENODEV; in ace_init()
1163 if (!(info = pci_alloc_consistent(ap->pdev, sizeof(struct ace_info), in ace_init()
1164 &ap->info_dma))) { in ace_init()
1165 ecode = -EAGAIN; in ace_init()
1168 ap->info = info; in ace_init()
1173 if (!(ap->skb = kmalloc(sizeof(struct ace_skb), GFP_KERNEL))) { in ace_init()
1174 ecode = -EAGAIN; in ace_init()
1178 ecode = request_irq(pdev->irq, ace_interrupt, IRQF_SHARED, in ace_init()
1182 DRV_NAME, pdev->irq); in ace_init()
1185 dev->irq = pdev->irq; in ace_init()
1188 spin_lock_init(&ap->debug_lock); in ace_init()
1189 ap->last_tx = ACE_TX_RING_ENTRIES(ap) - 1; in ace_init()
1190 ap->last_std_rx = 0; in ace_init()
1191 ap->last_mini_rx = 0; in ace_init()
1194 memset(ap->info, 0, sizeof(struct ace_info)); in ace_init()
1195 memset(ap->skb, 0, sizeof(struct ace_skb)); in ace_init()
1201 ap->fw_running = 0; in ace_init()
1203 tmp_ptr = ap->info_dma; in ace_init()
1204 writel(tmp_ptr >> 32, ®s->InfoPtrHi); in ace_init()
1205 writel(tmp_ptr & 0xffffffff, ®s->InfoPtrLo); in ace_init()
1207 memset(ap->evt_ring, 0, EVT_RING_ENTRIES * sizeof(struct event)); in ace_init()
1209 set_aceaddr(&info->evt_ctrl.rngptr, ap->evt_ring_dma); in ace_init()
1210 info->evt_ctrl.flags = 0; in ace_init()
1212 *(ap->evt_prd) = 0; in ace_init()
1214 set_aceaddr(&info->evt_prd_ptr, ap->evt_prd_dma); in ace_init()
1215 writel(0, ®s->EvtCsm); in ace_init()
1217 set_aceaddr(&info->cmd_ctrl.rngptr, 0x100); in ace_init()
1218 info->cmd_ctrl.flags = 0; in ace_init()
1219 info->cmd_ctrl.max_len = 0; in ace_init()
1222 writel(0, ®s->CmdRng[i]); in ace_init()
1224 writel(0, ®s->CmdPrd); in ace_init()
1225 writel(0, ®s->CmdCsm); in ace_init()
1227 tmp_ptr = ap->info_dma; in ace_init()
1228 tmp_ptr += (unsigned long) &(((struct ace_info *)0)->s.stats); in ace_init()
1229 set_aceaddr(&info->stats2_ptr, (dma_addr_t) tmp_ptr); in ace_init()
1231 set_aceaddr(&info->rx_std_ctrl.rngptr, ap->rx_ring_base_dma); in ace_init()
1232 info->rx_std_ctrl.max_len = ACE_STD_BUFSIZE; in ace_init()
1233 info->rx_std_ctrl.flags = in ace_init()
1236 memset(ap->rx_std_ring, 0, in ace_init()
1240 ap->rx_std_ring[i].flags = BD_FLG_TCP_UDP_SUM; in ace_init()
1242 ap->rx_std_skbprd = 0; in ace_init()
1243 atomic_set(&ap->cur_rx_bufs, 0); in ace_init()
1245 set_aceaddr(&info->rx_jumbo_ctrl.rngptr, in ace_init()
1246 (ap->rx_ring_base_dma + in ace_init()
1248 info->rx_jumbo_ctrl.max_len = 0; in ace_init()
1249 info->rx_jumbo_ctrl.flags = in ace_init()
1252 memset(ap->rx_jumbo_ring, 0, in ace_init()
1256 ap->rx_jumbo_ring[i].flags = BD_FLG_TCP_UDP_SUM | BD_FLG_JUMBO; in ace_init()
1258 ap->rx_jumbo_skbprd = 0; in ace_init()
1259 atomic_set(&ap->cur_jumbo_bufs, 0); in ace_init()
1261 memset(ap->rx_mini_ring, 0, in ace_init()
1264 if (ap->version >= 2) { in ace_init()
1265 set_aceaddr(&info->rx_mini_ctrl.rngptr, in ace_init()
1266 (ap->rx_ring_base_dma + in ace_init()
1270 info->rx_mini_ctrl.max_len = ACE_MINI_SIZE; in ace_init()
1271 info->rx_mini_ctrl.flags = in ace_init()
1275 ap->rx_mini_ring[i].flags = in ace_init()
1278 set_aceaddr(&info->rx_mini_ctrl.rngptr, 0); in ace_init()
1279 info->rx_mini_ctrl.flags = RCB_FLG_RNG_DISABLE; in ace_init()
1280 info->rx_mini_ctrl.max_len = 0; in ace_init()
1283 ap->rx_mini_skbprd = 0; in ace_init()
1284 atomic_set(&ap->cur_mini_bufs, 0); in ace_init()
1286 set_aceaddr(&info->rx_return_ctrl.rngptr, in ace_init()
1287 (ap->rx_ring_base_dma + in ace_init()
1292 info->rx_return_ctrl.flags = 0; in ace_init()
1293 info->rx_return_ctrl.max_len = RX_RETURN_RING_ENTRIES; in ace_init()
1295 memset(ap->rx_return_ring, 0, in ace_init()
1298 set_aceaddr(&info->rx_ret_prd_ptr, ap->rx_ret_prd_dma); in ace_init()
1299 *(ap->rx_ret_prd) = 0; in ace_init()
1301 writel(TX_RING_BASE, ®s->WinBase); in ace_init()
1304 ap->tx_ring = (__force struct tx_desc *) regs->Window; in ace_init()
1307 writel(0, (__force void __iomem *)ap->tx_ring + i * 4); in ace_init()
1309 set_aceaddr(&info->tx_ctrl.rngptr, TX_RING_BASE); in ace_init()
1311 memset(ap->tx_ring, 0, in ace_init()
1314 set_aceaddr(&info->tx_ctrl.rngptr, ap->tx_ring_dma); in ace_init()
1317 info->tx_ctrl.max_len = ACE_TX_RING_ENTRIES(ap); in ace_init()
1321 * The Tigon I does not like having the TX ring in host memory ;-( in ace_init()
1328 info->tx_ctrl.flags = tmp; in ace_init()
1330 set_aceaddr(&info->tx_csm_ptr, ap->tx_csm_dma); in ace_init()
1336 writel(DMA_THRESH_16W, ®s->DmaReadCfg); in ace_init()
1337 writel(DMA_THRESH_16W, ®s->DmaWriteCfg); in ace_init()
1339 writel(DMA_THRESH_8W, ®s->DmaReadCfg); in ace_init()
1340 writel(DMA_THRESH_8W, ®s->DmaWriteCfg); in ace_init()
1343 writel(0, ®s->MaskInt); in ace_init()
1344 writel(1, ®s->IfIdx); in ace_init()
1350 writel(1, ®s->AssistState); in ace_init()
1353 writel(DEF_STAT, ®s->TuneStatTicks); in ace_init()
1354 writel(DEF_TRACE, ®s->TuneTrace); in ace_init()
1361 ap->name, ACE_MAX_MOD_PARMS); in ace_init()
1365 ®s->TuneTxCoalTicks); in ace_init()
1367 writel(max_tx_desc[board_idx], ®s->TuneMaxTxDesc); in ace_init()
1371 ®s->TuneRxCoalTicks); in ace_init()
1373 writel(max_rx_desc[board_idx], ®s->TuneMaxRxDesc); in ace_init()
1376 writel(trace[board_idx], ®s->TuneTrace); in ace_init()
1379 writel(tx_ratio[board_idx], ®s->TxBufRat); in ace_init()
1387 if(ap->version >= 2) in ace_init()
1400 ap->name); in ace_init()
1413 "forcing auto negotiation\n", ap->name); in ace_init()
1421 "negotiation\n", ap->name); in ace_init()
1424 if ((option & 0x400) && (ap->version >= 2)) { in ace_init()
1426 ap->name); in ace_init()
1431 ap->link = tmp; in ace_init()
1432 writel(tmp, ®s->TuneLink); in ace_init()
1433 if (ap->version >= 2) in ace_init()
1434 writel(tmp, ®s->TuneFastLink); in ace_init()
1436 writel(ap->firmware_start, ®s->Pc); in ace_init()
1438 writel(0, ®s->Mb0Lo); in ace_init()
1446 ap->cur_rx = 0; in ace_init()
1447 ap->tx_prd = *(ap->tx_csm) = ap->tx_ret_csm = 0; in ace_init()
1451 writel(0, ®s->RxRetCsm); in ace_init()
1459 writel(1, ®s->AssistState); /* enable DMA */ in ace_init()
1464 writel(readl(®s->CpuCtrl) & ~(CPU_HALT|CPU_TRACE), ®s->CpuCtrl); in ace_init()
1465 readl(®s->CpuCtrl); in ace_init()
1468 * Wait for the firmware to spin up - max 3 seconds. in ace_init()
1471 while (time_before(jiffies, myjif) && !ap->fw_running) in ace_init()
1474 if (!ap->fw_running) { in ace_init()
1475 printk(KERN_ERR "%s: Firmware NOT running!\n", ap->name); in ace_init()
1478 writel(readl(®s->CpuCtrl) | CPU_HALT, ®s->CpuCtrl); in ace_init()
1479 readl(®s->CpuCtrl); in ace_init()
1481 /* aman@sgi.com - account for badly behaving firmware/NIC: in ace_init()
1482 * - have observed that the NIC may continue to generate in ace_init()
1483 * interrupts for some reason; attempt to stop it - halt in ace_init()
1485 * - if we're a module, we'll fail to load if this was in ace_init()
1488 * gone and OOps! - so free_irq also in ace_init()
1490 if (ap->version >= 2) in ace_init()
1491 writel(readl(®s->CpuBCtrl) | CPU_HALT, in ace_init()
1492 ®s->CpuBCtrl); in ace_init()
1493 writel(0, ®s->Mb0Lo); in ace_init()
1494 readl(®s->Mb0Lo); in ace_init()
1496 ecode = -EBUSY; in ace_init()
1502 * firmware to wipe the ring without re-initializing it. in ace_init()
1504 if (!test_and_set_bit(0, &ap->std_refill_busy)) in ace_init()
1508 ap->name); in ace_init()
1509 if (ap->version >= 2) { in ace_init()
1510 if (!test_and_set_bit(0, &ap->mini_refill_busy)) in ace_init()
1514 "the RX mini ring\n", ap->name); in ace_init()
1527 struct ace_regs __iomem *regs = ap->regs; in ace_set_rxtx_parms()
1528 int board_idx = ap->board_idx; in ace_set_rxtx_parms()
1533 writel(DEF_TX_COAL, ®s->TuneTxCoalTicks); in ace_set_rxtx_parms()
1535 writel(DEF_TX_MAX_DESC, ®s->TuneMaxTxDesc); in ace_set_rxtx_parms()
1537 writel(DEF_RX_COAL, ®s->TuneRxCoalTicks); in ace_set_rxtx_parms()
1539 writel(DEF_RX_MAX_DESC, ®s->TuneMaxRxDesc); in ace_set_rxtx_parms()
1541 writel(DEF_TX_RATIO, ®s->TxBufRat); in ace_set_rxtx_parms()
1545 ®s->TuneTxCoalTicks); in ace_set_rxtx_parms()
1548 ®s->TuneMaxTxDesc); in ace_set_rxtx_parms()
1551 ®s->TuneRxCoalTicks); in ace_set_rxtx_parms()
1554 ®s->TuneMaxRxDesc); in ace_set_rxtx_parms()
1556 writel(DEF_JUMBO_TX_RATIO, ®s->TxBufRat); in ace_set_rxtx_parms()
1566 struct ace_regs __iomem *regs = ap->regs; in ace_watchdog()
1573 if (*ap->tx_csm != ap->tx_ret_csm) { in ace_watchdog()
1575 dev->name, (unsigned int)readl(®s->HostCtrl)); in ace_watchdog()
1579 dev->name); in ace_watchdog()
1593 cur_size = atomic_read(&ap->cur_rx_bufs); in ace_tasklet()
1595 !test_and_set_bit(0, &ap->std_refill_busy)) { in ace_tasklet()
1599 ace_load_std_rx_ring(dev, RX_RING_SIZE - cur_size); in ace_tasklet()
1602 if (ap->version >= 2) { in ace_tasklet()
1603 cur_size = atomic_read(&ap->cur_mini_bufs); in ace_tasklet()
1605 !test_and_set_bit(0, &ap->mini_refill_busy)) { in ace_tasklet()
1607 printk("refilling mini buffers (current %i)\n", in ace_tasklet()
1610 ace_load_mini_rx_ring(dev, RX_MINI_SIZE - cur_size); in ace_tasklet()
1614 cur_size = atomic_read(&ap->cur_jumbo_bufs); in ace_tasklet()
1615 if (ap->jumbo && (cur_size < RX_LOW_JUMBO_THRES) && in ace_tasklet()
1616 !test_and_set_bit(0, &ap->jumbo_refill_busy)) { in ace_tasklet()
1620 ace_load_jumbo_rx_ring(dev, RX_JUMBO_SIZE - cur_size); in ace_tasklet()
1622 ap->tasklet_pending = 0; in ace_tasklet()
1632 if (!ap->trace_buf) in ace_dump_trace()
1633 if (!(ap->trace_buf = kmalloc(ACE_TRACE_SIZE, GFP_KERNEL))) in ace_dump_trace()
1649 struct ace_regs __iomem *regs = ap->regs; in ace_load_std_rx_ring()
1653 prefetchw(&ap->cur_rx_bufs); in ace_load_std_rx_ring()
1655 idx = ap->rx_std_skbprd; in ace_load_std_rx_ring()
1666 mapping = pci_map_page(ap->pdev, virt_to_page(skb->data), in ace_load_std_rx_ring()
1667 offset_in_page(skb->data), in ace_load_std_rx_ring()
1670 ap->skb->rx_std_skbuff[idx].skb = skb; in ace_load_std_rx_ring()
1671 dma_unmap_addr_set(&ap->skb->rx_std_skbuff[idx], in ace_load_std_rx_ring()
1674 rd = &ap->rx_std_ring[idx]; in ace_load_std_rx_ring()
1675 set_aceaddr(&rd->addr, mapping); in ace_load_std_rx_ring()
1676 rd->size = ACE_STD_BUFSIZE; in ace_load_std_rx_ring()
1677 rd->idx = idx; in ace_load_std_rx_ring()
1684 atomic_add(i, &ap->cur_rx_bufs); in ace_load_std_rx_ring()
1685 ap->rx_std_skbprd = idx; in ace_load_std_rx_ring()
1691 cmd.idx = ap->rx_std_skbprd; in ace_load_std_rx_ring()
1694 writel(idx, ®s->RxStdPrd); in ace_load_std_rx_ring()
1699 clear_bit(0, &ap->std_refill_busy); in ace_load_std_rx_ring()
1712 struct ace_regs __iomem *regs = ap->regs; in ace_load_mini_rx_ring()
1715 prefetchw(&ap->cur_mini_bufs); in ace_load_mini_rx_ring()
1717 idx = ap->rx_mini_skbprd; in ace_load_mini_rx_ring()
1727 mapping = pci_map_page(ap->pdev, virt_to_page(skb->data), in ace_load_mini_rx_ring()
1728 offset_in_page(skb->data), in ace_load_mini_rx_ring()
1731 ap->skb->rx_mini_skbuff[idx].skb = skb; in ace_load_mini_rx_ring()
1732 dma_unmap_addr_set(&ap->skb->rx_mini_skbuff[idx], in ace_load_mini_rx_ring()
1735 rd = &ap->rx_mini_ring[idx]; in ace_load_mini_rx_ring()
1736 set_aceaddr(&rd->addr, mapping); in ace_load_mini_rx_ring()
1737 rd->size = ACE_MINI_BUFSIZE; in ace_load_mini_rx_ring()
1738 rd->idx = idx; in ace_load_mini_rx_ring()
1745 atomic_add(i, &ap->cur_mini_bufs); in ace_load_mini_rx_ring()
1747 ap->rx_mini_skbprd = idx; in ace_load_mini_rx_ring()
1749 writel(idx, ®s->RxMiniPrd); in ace_load_mini_rx_ring()
1753 clear_bit(0, &ap->mini_refill_busy); in ace_load_mini_rx_ring()
1757 "mini receive buffers\n"); in ace_load_mini_rx_ring()
1769 struct ace_regs __iomem *regs = ap->regs; in ace_load_jumbo_rx_ring()
1772 idx = ap->rx_jumbo_skbprd; in ace_load_jumbo_rx_ring()
1783 mapping = pci_map_page(ap->pdev, virt_to_page(skb->data), in ace_load_jumbo_rx_ring()
1784 offset_in_page(skb->data), in ace_load_jumbo_rx_ring()
1787 ap->skb->rx_jumbo_skbuff[idx].skb = skb; in ace_load_jumbo_rx_ring()
1788 dma_unmap_addr_set(&ap->skb->rx_jumbo_skbuff[idx], in ace_load_jumbo_rx_ring()
1791 rd = &ap->rx_jumbo_ring[idx]; in ace_load_jumbo_rx_ring()
1792 set_aceaddr(&rd->addr, mapping); in ace_load_jumbo_rx_ring()
1793 rd->size = ACE_JUMBO_BUFSIZE; in ace_load_jumbo_rx_ring()
1794 rd->idx = idx; in ace_load_jumbo_rx_ring()
1801 atomic_add(i, &ap->cur_jumbo_bufs); in ace_load_jumbo_rx_ring()
1802 ap->rx_jumbo_skbprd = idx; in ace_load_jumbo_rx_ring()
1808 cmd.idx = ap->rx_jumbo_skbprd; in ace_load_jumbo_rx_ring()
1811 writel(idx, ®s->RxJumboPrd); in ace_load_jumbo_rx_ring()
1816 clear_bit(0, &ap->jumbo_refill_busy); in ace_load_jumbo_rx_ring()
1838 switch (ap->evt_ring[evtcsm].evt) { in ace_handle_event()
1841 ap->name); in ace_handle_event()
1842 ap->fw_running = 1; in ace_handle_event()
1849 u16 code = ap->evt_ring[evtcsm].code; in ace_handle_event()
1853 u32 state = readl(&ap->regs->GigLnkState); in ace_handle_event()
1856 ap->name, in ace_handle_event()
1864 ap->name); in ace_handle_event()
1868 "UP\n", ap->name); in ace_handle_event()
1872 "state %02x\n", ap->name, code); in ace_handle_event()
1877 switch(ap->evt_ring[evtcsm].code) { in ace_handle_event()
1880 ap->name); in ace_handle_event()
1884 "error\n", ap->name); in ace_handle_event()
1888 ap->name); in ace_handle_event()
1892 ap->name, ap->evt_ring[evtcsm].code); in ace_handle_event()
1899 if (ap->skb->rx_jumbo_skbuff[i].skb) { in ace_handle_event()
1900 ap->rx_jumbo_ring[i].size = 0; in ace_handle_event()
1901 set_aceaddr(&ap->rx_jumbo_ring[i].addr, 0); in ace_handle_event()
1902 dev_kfree_skb(ap->skb->rx_jumbo_skbuff[i].skb); in ace_handle_event()
1903 ap->skb->rx_jumbo_skbuff[i].skb = NULL; in ace_handle_event()
1912 ace_issue_cmd(ap->regs, &cmd); in ace_handle_event()
1914 writel(0, &((ap->regs)->RxJumboPrd)); in ace_handle_event()
1918 ap->jumbo = 0; in ace_handle_event()
1919 ap->rx_jumbo_skbprd = 0; in ace_handle_event()
1921 ap->name); in ace_handle_event()
1922 clear_bit(0, &ap->jumbo_refill_busy); in ace_handle_event()
1927 ap->name, ap->evt_ring[evtcsm].evt); in ace_handle_event()
1944 prefetchw(&ap->cur_rx_bufs); in ace_rx_int()
1945 prefetchw(&ap->cur_mini_bufs); in ace_rx_int()
1960 retdesc = &ap->rx_return_ring[idx]; in ace_rx_int()
1961 skbidx = retdesc->idx; in ace_rx_int()
1962 bd_flags = retdesc->flags; in ace_rx_int()
1969 * Mini and normal frames arrive frequently, in ace_rx_int()
1974 rip = &ap->skb->rx_std_skbuff[skbidx]; in ace_rx_int()
1976 rxdesc = &ap->rx_std_ring[skbidx]; in ace_rx_int()
1980 rip = &ap->skb->rx_jumbo_skbuff[skbidx]; in ace_rx_int()
1982 rxdesc = &ap->rx_jumbo_ring[skbidx]; in ace_rx_int()
1983 atomic_dec(&ap->cur_jumbo_bufs); in ace_rx_int()
1986 rip = &ap->skb->rx_mini_skbuff[skbidx]; in ace_rx_int()
1988 rxdesc = &ap->rx_mini_ring[skbidx]; in ace_rx_int()
1993 "returned by NIC\n", dev->name, in ace_rx_int()
1994 retdesc->flags); in ace_rx_int()
1998 skb = rip->skb; in ace_rx_int()
1999 rip->skb = NULL; in ace_rx_int()
2000 pci_unmap_page(ap->pdev, in ace_rx_int()
2004 skb_put(skb, retdesc->size); in ace_rx_int()
2009 csum = retdesc->tcp_udp_csum; in ace_rx_int()
2011 skb->protocol = eth_type_trans(skb, dev); in ace_rx_int()
2018 skb->csum = htons(csum); in ace_rx_int()
2019 skb->ip_summed = CHECKSUM_COMPLETE; in ace_rx_int()
2026 __vlan_hwaccel_put_tag(skb, retdesc->vlan); in ace_rx_int()
2029 dev->stats.rx_packets++; in ace_rx_int()
2030 dev->stats.rx_bytes += retdesc->size; in ace_rx_int()
2035 atomic_sub(std_count, &ap->cur_rx_bufs); in ace_rx_int()
2037 atomic_sub(mini_count, &ap->cur_mini_bufs); in ace_rx_int()
2042 * the 12.3.x Firmware - my Tigon I NICs seem to disagree! in ace_rx_int()
2045 writel(idx, &ap->regs->RxRetCsm); in ace_rx_int()
2047 ap->cur_rx = idx; in ace_rx_int()
2065 info = ap->skb->tx_skbuff + idx; in ace_tx_int()
2066 skb = info->skb; in ace_tx_int()
2069 pci_unmap_page(ap->pdev, dma_unmap_addr(info, mapping), in ace_tx_int()
2076 dev->stats.tx_packets++; in ace_tx_int()
2077 dev->stats.tx_bytes += skb->len; in ace_tx_int()
2079 info->skb = NULL; in ace_tx_int()
2089 ap->tx_ret_csm = txcsm; in ace_tx_int()
2102 * if we really have some space in ring (though the core doing in ace_tx_int()
2113 * Well, this dilemma exists in all lock-free devices. in ace_tx_int()
2116 * --ANK in ace_tx_int()
2125 struct ace_regs __iomem *regs = ap->regs; in ace_interrupt()
2135 if (!(readl(®s->HostCtrl) & IN_INT)) in ace_interrupt()
2140 * which happened _after_ rxretprd = *ap->rx_ret_prd; but before in ace_interrupt()
2141 * writel(0, ®s->Mb0Lo). in ace_interrupt()
2146 writel(0, ®s->Mb0Lo); in ace_interrupt()
2147 readl(®s->Mb0Lo); in ace_interrupt()
2153 * working on the other stuff - hey we don't need a spin lock in ace_interrupt()
2156 rxretprd = *ap->rx_ret_prd; in ace_interrupt()
2157 rxretcsm = ap->cur_rx; in ace_interrupt()
2162 txcsm = *ap->tx_csm; in ace_interrupt()
2163 idx = ap->tx_ret_csm; in ace_interrupt()
2173 if (!tx_ring_full(ap, txcsm, ap->tx_prd)) in ace_interrupt()
2177 evtcsm = readl(®s->EvtCsm); in ace_interrupt()
2178 evtprd = *ap->evt_prd; in ace_interrupt()
2182 writel(evtcsm, ®s->EvtCsm); in ace_interrupt()
2193 cur_size = atomic_read(&ap->cur_rx_bufs); in ace_interrupt()
2196 !test_and_set_bit(0, &ap->std_refill_busy)) { in ace_interrupt()
2201 RX_RING_SIZE - cur_size); in ace_interrupt()
2207 cur_size = atomic_read(&ap->cur_mini_bufs); in ace_interrupt()
2211 &ap->mini_refill_busy)) { in ace_interrupt()
2213 printk("low on mini buffers %i\n", in ace_interrupt()
2217 RX_MINI_SIZE - cur_size); in ace_interrupt()
2223 if (ap->jumbo) { in ace_interrupt()
2224 cur_size = atomic_read(&ap->cur_jumbo_bufs); in ace_interrupt()
2228 &ap->jumbo_refill_busy)){ in ace_interrupt()
2234 RX_JUMBO_SIZE - cur_size); in ace_interrupt()
2239 if (run_tasklet && !ap->tasklet_pending) { in ace_interrupt()
2240 ap->tasklet_pending = 1; in ace_interrupt()
2241 tasklet_schedule(&ap->ace_tasklet); in ace_interrupt()
2251 struct ace_regs __iomem *regs = ap->regs; in ace_open()
2254 if (!(ap->fw_running)) { in ace_open()
2255 printk(KERN_WARNING "%s: Firmware not running!\n", dev->name); in ace_open()
2256 return -EBUSY; in ace_open()
2259 writel(dev->mtu + ETH_HLEN + 4, ®s->IfMtu); in ace_open()
2271 if (ap->jumbo && in ace_open()
2272 !test_and_set_bit(0, &ap->jumbo_refill_busy)) in ace_open()
2275 if (dev->flags & IFF_PROMISC) { in ace_open()
2281 ap->promisc = 1; in ace_open()
2283 ap->promisc = 0; in ace_open()
2284 ap->mcast_all = 0; in ace_open()
2298 tasklet_init(&ap->ace_tasklet, ace_tasklet, (unsigned long)dev); in ace_open()
2306 struct ace_regs __iomem *regs = ap->regs; in ace_close()
2313 * is an absolute non-sense, by the way. It will be reset instantly in ace_close()
2319 if (ap->promisc) { in ace_close()
2324 ap->promisc = 0; in ace_close()
2332 tasklet_kill(&ap->ace_tasklet); in ace_close()
2346 info = ap->skb->tx_skbuff + i; in ace_close()
2347 skb = info->skb; in ace_close()
2353 tx = (__force struct tx_desc __iomem *) &ap->tx_ring[i]; in ace_close()
2354 writel(0, &tx->addr.addrhi); in ace_close()
2355 writel(0, &tx->addr.addrlo); in ace_close()
2356 writel(0, &tx->flagsize); in ace_close()
2358 memset(ap->tx_ring + i, 0, in ace_close()
2360 pci_unmap_page(ap->pdev, dma_unmap_addr(info, mapping), in ace_close()
2367 info->skb = NULL; in ace_close()
2371 if (ap->jumbo) { in ace_close()
2392 mapping = pci_map_page(ap->pdev, virt_to_page(skb->data), in ace_map_tx_skb()
2393 offset_in_page(skb->data), in ace_map_tx_skb()
2394 skb->len, PCI_DMA_TODEVICE); in ace_map_tx_skb()
2396 info = ap->skb->tx_skbuff + idx; in ace_map_tx_skb()
2397 info->skb = tail; in ace_map_tx_skb()
2399 dma_unmap_len_set(info, maplen, skb->len); in ace_map_tx_skb()
2414 writel(addr >> 32, &io->addr.addrhi); in ace_load_tx_bd()
2415 writel(addr & 0xffffffff, &io->addr.addrlo); in ace_load_tx_bd()
2416 writel(flagsize, &io->flagsize); in ace_load_tx_bd()
2417 writel(vlan_tag, &io->vlanres); in ace_load_tx_bd()
2419 desc->addr.addrhi = addr >> 32; in ace_load_tx_bd()
2420 desc->addr.addrlo = addr; in ace_load_tx_bd()
2421 desc->flagsize = flagsize; in ace_load_tx_bd()
2422 desc->vlanres = vlan_tag; in ace_load_tx_bd()
2431 struct ace_regs __iomem *regs = ap->regs; in ace_start_xmit()
2437 idx = ap->tx_prd; in ace_start_xmit()
2439 if (tx_ring_full(ap, ap->tx_ret_csm, idx)) in ace_start_xmit()
2442 if (!skb_shinfo(skb)->nr_frags) { in ace_start_xmit()
2447 flagsize = (skb->len << 16) | (BD_FLG_END); in ace_start_xmit()
2448 if (skb->ip_summed == CHECKSUM_PARTIAL) in ace_start_xmit()
2454 desc = ap->tx_ring + idx; in ace_start_xmit()
2458 if (tx_ring_full(ap, ap->tx_ret_csm, idx)) in ace_start_xmit()
2469 if (skb->ip_summed == CHECKSUM_PARTIAL) in ace_start_xmit()
2476 ace_load_tx_bd(ap, ap->tx_ring + idx, mapping, flagsize, vlan_tag); in ace_start_xmit()
2480 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { in ace_start_xmit()
2481 const skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; in ace_start_xmit()
2485 info = ap->skb->tx_skbuff + idx; in ace_start_xmit()
2486 desc = ap->tx_ring + idx; in ace_start_xmit()
2488 mapping = skb_frag_dma_map(&ap->pdev->dev, frag, 0, in ace_start_xmit()
2493 if (skb->ip_summed == CHECKSUM_PARTIAL) in ace_start_xmit()
2497 if (i == skb_shinfo(skb)->nr_frags - 1) { in ace_start_xmit()
2499 if (tx_ring_full(ap, ap->tx_ret_csm, idx)) in ace_start_xmit()
2506 info->skb = skb; in ace_start_xmit()
2508 info->skb = NULL; in ace_start_xmit()
2517 ap->tx_prd = idx; in ace_start_xmit()
2524 * A TX-descriptor producer (an IRQ) might have gotten in ace_start_xmit()
2527 * re-test. in ace_start_xmit()
2529 if (!tx_ring_full(ap, ap->tx_ret_csm, idx)) in ace_start_xmit()
2537 * This race condition is unavoidable with lock-free drivers. in ace_start_xmit()
2540 * This happens ~1-4 times per 100000 packets, so that we can allow in ace_start_xmit()
2545 * in tx ring than it is necessary (see original non-SG driver). in ace_start_xmit()
2559 printk(KERN_WARNING "%s: Transmit ring stuck full\n", dev->name); in ace_start_xmit()
2567 struct ace_regs __iomem *regs = ap->regs; in ace_change_mtu()
2570 return -EINVAL; in ace_change_mtu()
2572 writel(new_mtu + ETH_HLEN + 4, ®s->IfMtu); in ace_change_mtu()
2573 dev->mtu = new_mtu; in ace_change_mtu()
2576 if (!(ap->jumbo)) { in ace_change_mtu()
2578 "support\n", dev->name); in ace_change_mtu()
2579 ap->jumbo = 1; in ace_change_mtu()
2580 if (!test_and_set_bit(0, &ap->jumbo_refill_busy)) in ace_change_mtu()
2585 while (test_and_set_bit(0, &ap->jumbo_refill_busy)); in ace_change_mtu()
2586 ace_sync_irq(dev->irq); in ace_change_mtu()
2588 if (ap->jumbo) { in ace_change_mtu()
2604 struct ace_regs __iomem *regs = ap->regs; in ace_get_settings()
2608 ecmd->supported = in ace_get_settings()
2614 ecmd->port = PORT_FIBRE; in ace_get_settings()
2615 ecmd->transceiver = XCVR_INTERNAL; in ace_get_settings()
2617 link = readl(®s->GigLnkState); in ace_get_settings()
2621 link = readl(®s->FastLnkState); in ace_get_settings()
2630 ecmd->duplex = DUPLEX_FULL; in ace_get_settings()
2632 ecmd->duplex = DUPLEX_HALF; in ace_get_settings()
2635 ecmd->autoneg = AUTONEG_ENABLE; in ace_get_settings()
2637 ecmd->autoneg = AUTONEG_DISABLE; in ace_get_settings()
2643 ecmd->trace = readl(®s->TuneTrace); in ace_get_settings()
2645 ecmd->txcoal = readl(®s->TuneTxCoalTicks); in ace_get_settings()
2646 ecmd->rxcoal = readl(®s->TuneRxCoalTicks); in ace_get_settings()
2648 ecmd->maxtxpkt = readl(®s->TuneMaxTxDesc); in ace_get_settings()
2649 ecmd->maxrxpkt = readl(®s->TuneMaxRxDesc); in ace_get_settings()
2657 struct ace_regs __iomem *regs = ap->regs; in ace_set_settings()
2660 link = readl(®s->GigLnkState); in ace_set_settings()
2664 link = readl(®s->FastLnkState); in ace_set_settings()
2677 if (ecmd->autoneg == AUTONEG_ENABLE) in ace_set_settings()
2694 if (ecmd->duplex == DUPLEX_FULL) in ace_set_settings()
2697 if (link != ap->link) { in ace_set_settings()
2700 dev->name); in ace_set_settings()
2702 ap->link = link; in ace_set_settings()
2703 writel(link, ®s->TuneLink); in ace_set_settings()
2705 writel(link, ®s->TuneFastLink); in ace_set_settings()
2721 strlcpy(info->driver, "acenic", sizeof(info->driver)); in ace_get_drvinfo()
2722 snprintf(info->version, sizeof(info->version), "%i.%i.%i", in ace_get_drvinfo()
2723 ap->firmware_major, ap->firmware_minor, in ace_get_drvinfo()
2724 ap->firmware_fix); in ace_get_drvinfo()
2726 if (ap->pdev) in ace_get_drvinfo()
2727 strlcpy(info->bus_info, pci_name(ap->pdev), in ace_get_drvinfo()
2728 sizeof(info->bus_info)); in ace_get_drvinfo()
2738 struct ace_regs __iomem *regs = ap->regs; in ace_set_mac_addr()
2744 return -EBUSY; in ace_set_mac_addr()
2746 memcpy(dev->dev_addr, addr->sa_data,dev->addr_len); in ace_set_mac_addr()
2748 da = (u8 *)dev->dev_addr; in ace_set_mac_addr()
2750 writel(da[0] << 8 | da[1], ®s->MacAddrHi); in ace_set_mac_addr()
2752 ®s->MacAddrLo); in ace_set_mac_addr()
2766 struct ace_regs __iomem *regs = ap->regs; in ace_set_multicast_list()
2769 if ((dev->flags & IFF_ALLMULTI) && !(ap->mcast_all)) { in ace_set_multicast_list()
2774 ap->mcast_all = 1; in ace_set_multicast_list()
2775 } else if (ap->mcast_all) { in ace_set_multicast_list()
2780 ap->mcast_all = 0; in ace_set_multicast_list()
2783 if ((dev->flags & IFF_PROMISC) && !(ap->promisc)) { in ace_set_multicast_list()
2788 ap->promisc = 1; in ace_set_multicast_list()
2789 }else if (!(dev->flags & IFF_PROMISC) && (ap->promisc)) { in ace_set_multicast_list()
2794 ap->promisc = 0; in ace_set_multicast_list()
2803 if (!netdev_mc_empty(dev) && !ap->mcast_all) { in ace_set_multicast_list()
2808 }else if (!ap->mcast_all) { in ace_set_multicast_list()
2821 (struct ace_mac_stats __iomem *)ap->regs->Stats; in ace_get_stats()
2823 dev->stats.rx_missed_errors = readl(&mac_stats->drop_space); in ace_get_stats()
2824 dev->stats.multicast = readl(&mac_stats->kept_mc); in ace_get_stats()
2825 dev->stats.collisions = readl(&mac_stats->coll); in ace_get_stats()
2827 return &dev->stats; in ace_get_stats()
2841 tsize = min_t(u32, ((~dest & (ACE_WINDOW_SIZE - 1)) + 1), in ace_copy()
2843 tdest = (void __iomem *) ®s->Window + in ace_copy()
2844 (dest & (ACE_WINDOW_SIZE - 1)); in ace_copy()
2845 writel(dest & ~(ACE_WINDOW_SIZE - 1), ®s->WinBase); in ace_copy()
2847 /* Firmware is big-endian */ in ace_copy()
2852 size -= 4; in ace_copy()
2867 tsize = min_t(u32, ((~dest & (ACE_WINDOW_SIZE - 1)) + 1), in ace_clear()
2869 tdest = (void __iomem *) ®s->Window + in ace_clear()
2870 (dest & (ACE_WINDOW_SIZE - 1)); in ace_clear()
2871 writel(dest & ~(ACE_WINDOW_SIZE - 1), ®s->WinBase); in ace_clear()
2878 size -= tsize; in ace_clear()
2894 struct ace_regs __iomem *regs = ap->regs; in ace_load_firmware()
2899 if (!(readl(®s->CpuCtrl) & CPU_HALTED)) { in ace_load_firmware()
2901 "CPU is running!\n", ap->name); in ace_load_firmware()
2902 return -EFAULT; in ace_load_firmware()
2908 ret = request_firmware(&fw, fw_name, &ap->pdev->dev); in ace_load_firmware()
2911 ap->name, fw_name); in ace_load_firmware()
2915 fw_data = (void *)fw->data; in ace_load_firmware()
2922 ap->firmware_major = fw->data[0]; in ace_load_firmware()
2923 ap->firmware_minor = fw->data[1]; in ace_load_firmware()
2924 ap->firmware_fix = fw->data[2]; in ace_load_firmware()
2926 ap->firmware_start = be32_to_cpu(fw_data[1]); in ace_load_firmware()
2927 if (ap->firmware_start < 0x4000 || ap->firmware_start >= 0x80000) { in ace_load_firmware()
2929 ap->name, ap->firmware_start, fw_name); in ace_load_firmware()
2930 ret = -EINVAL; in ace_load_firmware()
2937 ap->name, load_addr, fw_name); in ace_load_firmware()
2938 ret = -EINVAL; in ace_load_firmware()
2946 ace_clear(regs, 0x2000, 0x80000-0x2000); in ace_load_firmware()
2947 ace_copy(regs, &fw_data[3], load_addr, fw->size-12); in ace_load_firmware()
2957 * Accessing the EEPROM is `interesting' to say the least - don't read
2960 * This is all about black magic and bit-banging the device .... I
2973 readl(®s->LocalCtrl); in eeprom_start()
2975 local = readl(®s->LocalCtrl); in eeprom_start()
2977 writel(local, ®s->LocalCtrl); in eeprom_start()
2978 readl(®s->LocalCtrl); in eeprom_start()
2982 writel(local, ®s->LocalCtrl); in eeprom_start()
2983 readl(®s->LocalCtrl); in eeprom_start()
2987 writel(local, ®s->LocalCtrl); in eeprom_start()
2988 readl(®s->LocalCtrl); in eeprom_start()
2992 writel(local, ®s->LocalCtrl); in eeprom_start()
2993 readl(®s->LocalCtrl); in eeprom_start()
3004 local = readl(®s->LocalCtrl); in eeprom_prep()
3007 writel(local, ®s->LocalCtrl); in eeprom_prep()
3008 readl(®s->LocalCtrl); in eeprom_prep()
3017 writel(local, ®s->LocalCtrl); in eeprom_prep()
3018 readl(®s->LocalCtrl); in eeprom_prep()
3023 writel(local, ®s->LocalCtrl); in eeprom_prep()
3024 readl(®s->LocalCtrl); in eeprom_prep()
3028 writel(local, ®s->LocalCtrl); in eeprom_prep()
3029 readl(®s->LocalCtrl); in eeprom_prep()
3040 local = readl(®s->LocalCtrl); in eeprom_check_ack()
3042 writel(local, ®s->LocalCtrl); in eeprom_check_ack()
3043 readl(®s->LocalCtrl); in eeprom_check_ack()
3047 writel(local, ®s->LocalCtrl); in eeprom_check_ack()
3048 readl(®s->LocalCtrl); in eeprom_check_ack()
3052 state = (readl(®s->LocalCtrl) & EEPROM_DATA_IN) != 0; in eeprom_check_ack()
3055 writel(readl(®s->LocalCtrl) & ~EEPROM_CLK_OUT, ®s->LocalCtrl); in eeprom_check_ack()
3056 readl(®s->LocalCtrl); in eeprom_check_ack()
3068 local = readl(®s->LocalCtrl); in eeprom_stop()
3070 writel(local, ®s->LocalCtrl); in eeprom_stop()
3071 readl(®s->LocalCtrl); in eeprom_stop()
3075 writel(local, ®s->LocalCtrl); in eeprom_stop()
3076 readl(®s->LocalCtrl); in eeprom_stop()
3080 writel(local, ®s->LocalCtrl); in eeprom_stop()
3081 readl(®s->LocalCtrl); in eeprom_stop()
3085 writel(local, ®s->LocalCtrl); in eeprom_stop()
3086 readl(®s->LocalCtrl); in eeprom_stop()
3090 writel(local, ®s->LocalCtrl); in eeprom_stop()
3102 struct ace_regs __iomem *regs = ap->regs; in read_eeprom_byte()
3119 printk(KERN_ERR "%s: Unable to sync eeprom\n", ap->name); in read_eeprom_byte()
3120 result = -EIO; in read_eeprom_byte()
3128 ap->name); in read_eeprom_byte()
3129 result = -EIO; in read_eeprom_byte()
3137 ap->name); in read_eeprom_byte()
3138 result = -EIO; in read_eeprom_byte()
3147 ap->name); in read_eeprom_byte()
3148 result = -EIO; in read_eeprom_byte()
3153 local = readl(®s->LocalCtrl); in read_eeprom_byte()
3155 writel(local, ®s->LocalCtrl); in read_eeprom_byte()
3156 readl(®s->LocalCtrl); in read_eeprom_byte()
3160 writel(local, ®s->LocalCtrl); in read_eeprom_byte()
3161 readl(®s->LocalCtrl); in read_eeprom_byte()
3166 ((readl(®s->LocalCtrl) & EEPROM_DATA_IN) != 0); in read_eeprom_byte()
3169 local = readl(®s->LocalCtrl); in read_eeprom_byte()
3171 writel(local, ®s->LocalCtrl); in read_eeprom_byte()
3172 readl(®s->LocalCtrl); in read_eeprom_byte()
3177 writel(local, ®s->LocalCtrl); in read_eeprom_byte()
3178 readl(®s->LocalCtrl); in read_eeprom_byte()
3185 writel(local, ®s->LocalCtrl); in read_eeprom_byte()
3186 readl(®s->LocalCtrl); in read_eeprom_byte()
3189 writel(readl(®s->LocalCtrl) | EEPROM_CLK_OUT, ®s->LocalCtrl); in read_eeprom_byte()
3190 readl(®s->LocalCtrl); in read_eeprom_byte()
3192 writel(readl(®s->LocalCtrl) & ~EEPROM_CLK_OUT, ®s->LocalCtrl); in read_eeprom_byte()
3193 readl(®s->LocalCtrl); in read_eeprom_byte()
3204 ap->name, offset); in read_eeprom_byte()