Lines Matching +full:bd +full:- +full:address

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 2006-2009 Freescale Semicondutor, Inc. All rights reserved.
26 #include <linux/dma-mapping.h>
63 #define UGETH_MSG_DEFAULT (NETIF_MSG_IFUP << 1 ) - 1
70 } debug = { -1 };
103 /* adjusted at startup if max-speed 1000 */
215 struct list_head *node = lh->next; in dequeue()
226 u8 __iomem *bd) in get_new_skb() argument
230 skb = netdev_alloc_skb(ugeth->ndev, in get_new_skb()
231 ugeth->ug_info->uf_info.max_rx_buf_length + in get_new_skb()
240 UCC_GETH_RX_DATA_BUF_ALIGNMENT - in get_new_skb()
241 (((unsigned)skb->data) & (UCC_GETH_RX_DATA_BUF_ALIGNMENT - in get_new_skb()
244 out_be32(&((struct qe_bd __iomem *)bd)->buf, in get_new_skb()
245 dma_map_single(ugeth->dev, in get_new_skb()
246 skb->data, in get_new_skb()
247 ugeth->ug_info->uf_info.max_rx_buf_length + in get_new_skb()
251 out_be32((u32 __iomem *)bd, in get_new_skb()
252 (R_E | R_I | (in_be32((u32 __iomem*)bd) & R_W))); in get_new_skb()
259 u8 __iomem *bd; in rx_bd_buffer_set() local
264 bd = ugeth->p_rx_bd_ring[rxQ]; in rx_bd_buffer_set()
268 bd_status = in_be32((u32 __iomem *)bd); in rx_bd_buffer_set()
269 skb = get_new_skb(ugeth, bd); in rx_bd_buffer_set()
273 return -ENOMEM; in rx_bd_buffer_set()
275 ugeth->rx_skbuff[rxQ][i] = skb; in rx_bd_buffer_set()
277 /* advance the BD pointer */ in rx_bd_buffer_set()
278 bd += sizeof(struct qe_bd); in rx_bd_buffer_set()
313 return -ENOMEM; in fill_init_enet_entries()
337 /* Check that this entry was actually valid -- in return_init_enet_entries()
372 /* Check that this entry was actually valid -- in dump_init_enet_entries()
385 pr_info("Base address: 0x%08x\n", in dump_init_enet_entries()
416 return -EINVAL; in hw_clear_addr_in_paddr()
420 (struct ucc_geth_82xx_address_filtering_pram __iomem *) ugeth->p_rx_glbl_pram-> in hw_clear_addr_in_paddr()
423 /* Writing address ff.ff.ff.ff.ff.ff disables address in hw_clear_addr_in_paddr()
425 out_be16(&p_82xx_addr_filt->paddr[paddr_num].h, 0xffff); in hw_clear_addr_in_paddr()
426 out_be16(&p_82xx_addr_filt->paddr[paddr_num].m, 0xffff); in hw_clear_addr_in_paddr()
427 out_be16(&p_82xx_addr_filt->paddr[paddr_num].l, 0xffff); in hw_clear_addr_in_paddr()
439 (struct ucc_geth_82xx_address_filtering_pram __iomem *) ugeth->p_rx_glbl_pram-> in hw_add_addr_in_hash()
443 ucc_fast_get_qe_cr_subblock(ugeth->ug_info->uf_info.ucc_num); in hw_add_addr_in_hash()
447 /* the address to the hash (Big Endian mode), we reverse the bytes.*/ in hw_add_addr_in_hash()
449 set_mac_addr(&p_82xx_addr_filt->taddr.h, p_enet_addr); in hw_add_addr_in_hash()
468 ug_regs = ugeth->ug_regs; in get_statistics()
470 p_tx_fw_statistics_pram = ugeth->p_tx_fw_statistics_pram; in get_statistics()
471 p_rx_fw_statistics_pram = ugeth->p_rx_fw_statistics_pram; in get_statistics()
476 tx_firmware_statistics->sicoltx = in get_statistics()
477 in_be32(&p_tx_fw_statistics_pram->sicoltx); in get_statistics()
478 tx_firmware_statistics->mulcoltx = in get_statistics()
479 in_be32(&p_tx_fw_statistics_pram->mulcoltx); in get_statistics()
480 tx_firmware_statistics->latecoltxfr = in get_statistics()
481 in_be32(&p_tx_fw_statistics_pram->latecoltxfr); in get_statistics()
482 tx_firmware_statistics->frabortduecol = in get_statistics()
483 in_be32(&p_tx_fw_statistics_pram->frabortduecol); in get_statistics()
484 tx_firmware_statistics->frlostinmactxer = in get_statistics()
485 in_be32(&p_tx_fw_statistics_pram->frlostinmactxer); in get_statistics()
486 tx_firmware_statistics->carriersenseertx = in get_statistics()
487 in_be32(&p_tx_fw_statistics_pram->carriersenseertx); in get_statistics()
488 tx_firmware_statistics->frtxok = in get_statistics()
489 in_be32(&p_tx_fw_statistics_pram->frtxok); in get_statistics()
490 tx_firmware_statistics->txfrexcessivedefer = in get_statistics()
491 in_be32(&p_tx_fw_statistics_pram->txfrexcessivedefer); in get_statistics()
492 tx_firmware_statistics->txpkts256 = in get_statistics()
493 in_be32(&p_tx_fw_statistics_pram->txpkts256); in get_statistics()
494 tx_firmware_statistics->txpkts512 = in get_statistics()
495 in_be32(&p_tx_fw_statistics_pram->txpkts512); in get_statistics()
496 tx_firmware_statistics->txpkts1024 = in get_statistics()
497 in_be32(&p_tx_fw_statistics_pram->txpkts1024); in get_statistics()
498 tx_firmware_statistics->txpktsjumbo = in get_statistics()
499 in_be32(&p_tx_fw_statistics_pram->txpktsjumbo); in get_statistics()
506 rx_firmware_statistics->frrxfcser = in get_statistics()
507 in_be32(&p_rx_fw_statistics_pram->frrxfcser); in get_statistics()
508 rx_firmware_statistics->fraligner = in get_statistics()
509 in_be32(&p_rx_fw_statistics_pram->fraligner); in get_statistics()
510 rx_firmware_statistics->inrangelenrxer = in get_statistics()
511 in_be32(&p_rx_fw_statistics_pram->inrangelenrxer); in get_statistics()
512 rx_firmware_statistics->outrangelenrxer = in get_statistics()
513 in_be32(&p_rx_fw_statistics_pram->outrangelenrxer); in get_statistics()
514 rx_firmware_statistics->frtoolong = in get_statistics()
515 in_be32(&p_rx_fw_statistics_pram->frtoolong); in get_statistics()
516 rx_firmware_statistics->runt = in get_statistics()
517 in_be32(&p_rx_fw_statistics_pram->runt); in get_statistics()
518 rx_firmware_statistics->verylongevent = in get_statistics()
519 in_be32(&p_rx_fw_statistics_pram->verylongevent); in get_statistics()
520 rx_firmware_statistics->symbolerror = in get_statistics()
521 in_be32(&p_rx_fw_statistics_pram->symbolerror); in get_statistics()
522 rx_firmware_statistics->dropbsy = in get_statistics()
523 in_be32(&p_rx_fw_statistics_pram->dropbsy); in get_statistics()
525 rx_firmware_statistics->res0[i] = in get_statistics()
526 p_rx_fw_statistics_pram->res0[i]; in get_statistics()
527 rx_firmware_statistics->mismatchdrop = in get_statistics()
528 in_be32(&p_rx_fw_statistics_pram->mismatchdrop); in get_statistics()
529 rx_firmware_statistics->underpkts = in get_statistics()
530 in_be32(&p_rx_fw_statistics_pram->underpkts); in get_statistics()
531 rx_firmware_statistics->pkts256 = in get_statistics()
532 in_be32(&p_rx_fw_statistics_pram->pkts256); in get_statistics()
533 rx_firmware_statistics->pkts512 = in get_statistics()
534 in_be32(&p_rx_fw_statistics_pram->pkts512); in get_statistics()
535 rx_firmware_statistics->pkts1024 = in get_statistics()
536 in_be32(&p_rx_fw_statistics_pram->pkts1024); in get_statistics()
537 rx_firmware_statistics->pktsjumbo = in get_statistics()
538 in_be32(&p_rx_fw_statistics_pram->pktsjumbo); in get_statistics()
539 rx_firmware_statistics->frlossinmacer = in get_statistics()
540 in_be32(&p_rx_fw_statistics_pram->frlossinmacer); in get_statistics()
541 rx_firmware_statistics->pausefr = in get_statistics()
542 in_be32(&p_rx_fw_statistics_pram->pausefr); in get_statistics()
544 rx_firmware_statistics->res1[i] = in get_statistics()
545 p_rx_fw_statistics_pram->res1[i]; in get_statistics()
546 rx_firmware_statistics->removevlan = in get_statistics()
547 in_be32(&p_rx_fw_statistics_pram->removevlan); in get_statistics()
548 rx_firmware_statistics->replacevlan = in get_statistics()
549 in_be32(&p_rx_fw_statistics_pram->replacevlan); in get_statistics()
550 rx_firmware_statistics->insertvlan = in get_statistics()
551 in_be32(&p_rx_fw_statistics_pram->insertvlan); in get_statistics()
557 (in_be32(&uf_regs->upsmr) & UCC_GETH_UPSMR_HSE)) { in get_statistics()
558 hardware_statistics->tx64 = in_be32(&ug_regs->tx64); in get_statistics()
559 hardware_statistics->tx127 = in_be32(&ug_regs->tx127); in get_statistics()
560 hardware_statistics->tx255 = in_be32(&ug_regs->tx255); in get_statistics()
561 hardware_statistics->rx64 = in_be32(&ug_regs->rx64); in get_statistics()
562 hardware_statistics->rx127 = in_be32(&ug_regs->rx127); in get_statistics()
563 hardware_statistics->rx255 = in_be32(&ug_regs->rx255); in get_statistics()
564 hardware_statistics->txok = in_be32(&ug_regs->txok); in get_statistics()
565 hardware_statistics->txcf = in_be16(&ug_regs->txcf); in get_statistics()
566 hardware_statistics->tmca = in_be32(&ug_regs->tmca); in get_statistics()
567 hardware_statistics->tbca = in_be32(&ug_regs->tbca); in get_statistics()
568 hardware_statistics->rxfok = in_be32(&ug_regs->rxfok); in get_statistics()
569 hardware_statistics->rxbok = in_be32(&ug_regs->rxbok); in get_statistics()
570 hardware_statistics->rbyt = in_be32(&ug_regs->rbyt); in get_statistics()
571 hardware_statistics->rmca = in_be32(&ug_regs->rmca); in get_statistics()
572 hardware_statistics->rbca = in_be32(&ug_regs->rbca); in get_statistics()
581 for (i = 0; i < ucc_geth_tx_queues(ugeth->ug_info); i++) { in dump_bds()
582 if (ugeth->p_tx_bd_ring[i]) { in dump_bds()
584 (ugeth->ug_info->bdRingLenTx[i] * in dump_bds()
587 mem_disp(ugeth->p_tx_bd_ring[i], length); in dump_bds()
590 for (i = 0; i < ucc_geth_rx_queues(ugeth->ug_info); i++) { in dump_bds()
591 if (ugeth->p_rx_bd_ring[i]) { in dump_bds()
593 (ugeth->ug_info->bdRingLenRx[i] * in dump_bds()
596 mem_disp(ugeth->p_rx_bd_ring[i], length); in dump_bds()
605 pr_info("UCC%d Geth registers:\n", ugeth->ug_info->uf_info.ucc_num + 1); in dump_regs()
606 pr_info("Base address: 0x%08x\n", (u32)ugeth->ug_regs); in dump_regs()
608 pr_info("maccfg1 : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
609 (u32)&ugeth->ug_regs->maccfg1, in dump_regs()
610 in_be32(&ugeth->ug_regs->maccfg1)); in dump_regs()
611 pr_info("maccfg2 : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
612 (u32)&ugeth->ug_regs->maccfg2, in dump_regs()
613 in_be32(&ugeth->ug_regs->maccfg2)); in dump_regs()
614 pr_info("ipgifg : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
615 (u32)&ugeth->ug_regs->ipgifg, in dump_regs()
616 in_be32(&ugeth->ug_regs->ipgifg)); in dump_regs()
617 pr_info("hafdup : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
618 (u32)&ugeth->ug_regs->hafdup, in dump_regs()
619 in_be32(&ugeth->ug_regs->hafdup)); in dump_regs()
620 pr_info("ifctl : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
621 (u32)&ugeth->ug_regs->ifctl, in dump_regs()
622 in_be32(&ugeth->ug_regs->ifctl)); in dump_regs()
623 pr_info("ifstat : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
624 (u32)&ugeth->ug_regs->ifstat, in dump_regs()
625 in_be32(&ugeth->ug_regs->ifstat)); in dump_regs()
626 pr_info("macstnaddr1: addr - 0x%08x, val - 0x%08x\n", in dump_regs()
627 (u32)&ugeth->ug_regs->macstnaddr1, in dump_regs()
628 in_be32(&ugeth->ug_regs->macstnaddr1)); in dump_regs()
629 pr_info("macstnaddr2: addr - 0x%08x, val - 0x%08x\n", in dump_regs()
630 (u32)&ugeth->ug_regs->macstnaddr2, in dump_regs()
631 in_be32(&ugeth->ug_regs->macstnaddr2)); in dump_regs()
632 pr_info("uempr : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
633 (u32)&ugeth->ug_regs->uempr, in dump_regs()
634 in_be32(&ugeth->ug_regs->uempr)); in dump_regs()
635 pr_info("utbipar : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
636 (u32)&ugeth->ug_regs->utbipar, in dump_regs()
637 in_be32(&ugeth->ug_regs->utbipar)); in dump_regs()
638 pr_info("uescr : addr - 0x%08x, val - 0x%04x\n", in dump_regs()
639 (u32)&ugeth->ug_regs->uescr, in dump_regs()
640 in_be16(&ugeth->ug_regs->uescr)); in dump_regs()
641 pr_info("tx64 : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
642 (u32)&ugeth->ug_regs->tx64, in dump_regs()
643 in_be32(&ugeth->ug_regs->tx64)); in dump_regs()
644 pr_info("tx127 : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
645 (u32)&ugeth->ug_regs->tx127, in dump_regs()
646 in_be32(&ugeth->ug_regs->tx127)); in dump_regs()
647 pr_info("tx255 : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
648 (u32)&ugeth->ug_regs->tx255, in dump_regs()
649 in_be32(&ugeth->ug_regs->tx255)); in dump_regs()
650 pr_info("rx64 : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
651 (u32)&ugeth->ug_regs->rx64, in dump_regs()
652 in_be32(&ugeth->ug_regs->rx64)); in dump_regs()
653 pr_info("rx127 : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
654 (u32)&ugeth->ug_regs->rx127, in dump_regs()
655 in_be32(&ugeth->ug_regs->rx127)); in dump_regs()
656 pr_info("rx255 : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
657 (u32)&ugeth->ug_regs->rx255, in dump_regs()
658 in_be32(&ugeth->ug_regs->rx255)); in dump_regs()
659 pr_info("txok : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
660 (u32)&ugeth->ug_regs->txok, in dump_regs()
661 in_be32(&ugeth->ug_regs->txok)); in dump_regs()
662 pr_info("txcf : addr - 0x%08x, val - 0x%04x\n", in dump_regs()
663 (u32)&ugeth->ug_regs->txcf, in dump_regs()
664 in_be16(&ugeth->ug_regs->txcf)); in dump_regs()
665 pr_info("tmca : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
666 (u32)&ugeth->ug_regs->tmca, in dump_regs()
667 in_be32(&ugeth->ug_regs->tmca)); in dump_regs()
668 pr_info("tbca : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
669 (u32)&ugeth->ug_regs->tbca, in dump_regs()
670 in_be32(&ugeth->ug_regs->tbca)); in dump_regs()
671 pr_info("rxfok : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
672 (u32)&ugeth->ug_regs->rxfok, in dump_regs()
673 in_be32(&ugeth->ug_regs->rxfok)); in dump_regs()
674 pr_info("rxbok : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
675 (u32)&ugeth->ug_regs->rxbok, in dump_regs()
676 in_be32(&ugeth->ug_regs->rxbok)); in dump_regs()
677 pr_info("rbyt : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
678 (u32)&ugeth->ug_regs->rbyt, in dump_regs()
679 in_be32(&ugeth->ug_regs->rbyt)); in dump_regs()
680 pr_info("rmca : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
681 (u32)&ugeth->ug_regs->rmca, in dump_regs()
682 in_be32(&ugeth->ug_regs->rmca)); in dump_regs()
683 pr_info("rbca : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
684 (u32)&ugeth->ug_regs->rbca, in dump_regs()
685 in_be32(&ugeth->ug_regs->rbca)); in dump_regs()
686 pr_info("scar : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
687 (u32)&ugeth->ug_regs->scar, in dump_regs()
688 in_be32(&ugeth->ug_regs->scar)); in dump_regs()
689 pr_info("scam : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
690 (u32)&ugeth->ug_regs->scam, in dump_regs()
691 in_be32(&ugeth->ug_regs->scam)); in dump_regs()
693 if (ugeth->p_thread_data_tx) { in dump_regs()
694 int count = ucc_geth_thread_count(ugeth->ug_info->numThreadsTx); in dump_regs()
697 pr_info("Base address: 0x%08x\n", in dump_regs()
698 (u32)ugeth->p_thread_data_tx); in dump_regs()
701 pr_info("Base address: 0x%08x\n", in dump_regs()
702 (u32)&ugeth->p_thread_data_tx[i]); in dump_regs()
703 mem_disp((u8 *) & ugeth->p_thread_data_tx[i], in dump_regs()
707 if (ugeth->p_thread_data_rx) { in dump_regs()
708 int count = ucc_geth_thread_count(ugeth->ug_info->numThreadsRx); in dump_regs()
711 pr_info("Base address: 0x%08x\n", in dump_regs()
712 (u32)ugeth->p_thread_data_rx); in dump_regs()
715 pr_info("Base address: 0x%08x\n", in dump_regs()
716 (u32)&ugeth->p_thread_data_rx[i]); in dump_regs()
717 mem_disp((u8 *) & ugeth->p_thread_data_rx[i], in dump_regs()
721 if (ugeth->p_exf_glbl_param) { in dump_regs()
723 pr_info("Base address: 0x%08x\n", in dump_regs()
724 (u32)ugeth->p_exf_glbl_param); in dump_regs()
725 mem_disp((u8 *) ugeth->p_exf_glbl_param, in dump_regs()
726 sizeof(*ugeth->p_exf_glbl_param)); in dump_regs()
728 if (ugeth->p_tx_glbl_pram) { in dump_regs()
730 pr_info("Base address: 0x%08x\n", (u32)ugeth->p_tx_glbl_pram); in dump_regs()
731 pr_info("temoder : addr - 0x%08x, val - 0x%04x\n", in dump_regs()
732 (u32)&ugeth->p_tx_glbl_pram->temoder, in dump_regs()
733 in_be16(&ugeth->p_tx_glbl_pram->temoder)); in dump_regs()
734 pr_info("sqptr : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
735 (u32)&ugeth->p_tx_glbl_pram->sqptr, in dump_regs()
736 in_be32(&ugeth->p_tx_glbl_pram->sqptr)); in dump_regs()
737 pr_info("schedulerbasepointer: addr - 0x%08x, val - 0x%08x\n", in dump_regs()
738 (u32)&ugeth->p_tx_glbl_pram->schedulerbasepointer, in dump_regs()
739 in_be32(&ugeth->p_tx_glbl_pram->schedulerbasepointer)); in dump_regs()
740 pr_info("txrmonbaseptr: addr - 0x%08x, val - 0x%08x\n", in dump_regs()
741 (u32)&ugeth->p_tx_glbl_pram->txrmonbaseptr, in dump_regs()
742 in_be32(&ugeth->p_tx_glbl_pram->txrmonbaseptr)); in dump_regs()
743 pr_info("tstate : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
744 (u32)&ugeth->p_tx_glbl_pram->tstate, in dump_regs()
745 in_be32(&ugeth->p_tx_glbl_pram->tstate)); in dump_regs()
746 pr_info("iphoffset[0] : addr - 0x%08x, val - 0x%02x\n", in dump_regs()
747 (u32)&ugeth->p_tx_glbl_pram->iphoffset[0], in dump_regs()
748 ugeth->p_tx_glbl_pram->iphoffset[0]); in dump_regs()
749 pr_info("iphoffset[1] : addr - 0x%08x, val - 0x%02x\n", in dump_regs()
750 (u32)&ugeth->p_tx_glbl_pram->iphoffset[1], in dump_regs()
751 ugeth->p_tx_glbl_pram->iphoffset[1]); in dump_regs()
752 pr_info("iphoffset[2] : addr - 0x%08x, val - 0x%02x\n", in dump_regs()
753 (u32)&ugeth->p_tx_glbl_pram->iphoffset[2], in dump_regs()
754 ugeth->p_tx_glbl_pram->iphoffset[2]); in dump_regs()
755 pr_info("iphoffset[3] : addr - 0x%08x, val - 0x%02x\n", in dump_regs()
756 (u32)&ugeth->p_tx_glbl_pram->iphoffset[3], in dump_regs()
757 ugeth->p_tx_glbl_pram->iphoffset[3]); in dump_regs()
758 pr_info("iphoffset[4] : addr - 0x%08x, val - 0x%02x\n", in dump_regs()
759 (u32)&ugeth->p_tx_glbl_pram->iphoffset[4], in dump_regs()
760 ugeth->p_tx_glbl_pram->iphoffset[4]); in dump_regs()
761 pr_info("iphoffset[5] : addr - 0x%08x, val - 0x%02x\n", in dump_regs()
762 (u32)&ugeth->p_tx_glbl_pram->iphoffset[5], in dump_regs()
763 ugeth->p_tx_glbl_pram->iphoffset[5]); in dump_regs()
764 pr_info("iphoffset[6] : addr - 0x%08x, val - 0x%02x\n", in dump_regs()
765 (u32)&ugeth->p_tx_glbl_pram->iphoffset[6], in dump_regs()
766 ugeth->p_tx_glbl_pram->iphoffset[6]); in dump_regs()
767 pr_info("iphoffset[7] : addr - 0x%08x, val - 0x%02x\n", in dump_regs()
768 (u32)&ugeth->p_tx_glbl_pram->iphoffset[7], in dump_regs()
769 ugeth->p_tx_glbl_pram->iphoffset[7]); in dump_regs()
770 pr_info("vtagtable[0] : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
771 (u32)&ugeth->p_tx_glbl_pram->vtagtable[0], in dump_regs()
772 in_be32(&ugeth->p_tx_glbl_pram->vtagtable[0])); in dump_regs()
773 pr_info("vtagtable[1] : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
774 (u32)&ugeth->p_tx_glbl_pram->vtagtable[1], in dump_regs()
775 in_be32(&ugeth->p_tx_glbl_pram->vtagtable[1])); in dump_regs()
776 pr_info("vtagtable[2] : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
777 (u32)&ugeth->p_tx_glbl_pram->vtagtable[2], in dump_regs()
778 in_be32(&ugeth->p_tx_glbl_pram->vtagtable[2])); in dump_regs()
779 pr_info("vtagtable[3] : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
780 (u32)&ugeth->p_tx_glbl_pram->vtagtable[3], in dump_regs()
781 in_be32(&ugeth->p_tx_glbl_pram->vtagtable[3])); in dump_regs()
782 pr_info("vtagtable[4] : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
783 (u32)&ugeth->p_tx_glbl_pram->vtagtable[4], in dump_regs()
784 in_be32(&ugeth->p_tx_glbl_pram->vtagtable[4])); in dump_regs()
785 pr_info("vtagtable[5] : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
786 (u32)&ugeth->p_tx_glbl_pram->vtagtable[5], in dump_regs()
787 in_be32(&ugeth->p_tx_glbl_pram->vtagtable[5])); in dump_regs()
788 pr_info("vtagtable[6] : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
789 (u32)&ugeth->p_tx_glbl_pram->vtagtable[6], in dump_regs()
790 in_be32(&ugeth->p_tx_glbl_pram->vtagtable[6])); in dump_regs()
791 pr_info("vtagtable[7] : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
792 (u32)&ugeth->p_tx_glbl_pram->vtagtable[7], in dump_regs()
793 in_be32(&ugeth->p_tx_glbl_pram->vtagtable[7])); in dump_regs()
794 pr_info("tqptr : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
795 (u32)&ugeth->p_tx_glbl_pram->tqptr, in dump_regs()
796 in_be32(&ugeth->p_tx_glbl_pram->tqptr)); in dump_regs()
798 if (ugeth->p_rx_glbl_pram) { in dump_regs()
800 pr_info("Base address: 0x%08x\n", (u32)ugeth->p_rx_glbl_pram); in dump_regs()
801 pr_info("remoder : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
802 (u32)&ugeth->p_rx_glbl_pram->remoder, in dump_regs()
803 in_be32(&ugeth->p_rx_glbl_pram->remoder)); in dump_regs()
804 pr_info("rqptr : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
805 (u32)&ugeth->p_rx_glbl_pram->rqptr, in dump_regs()
806 in_be32(&ugeth->p_rx_glbl_pram->rqptr)); in dump_regs()
807 pr_info("typeorlen : addr - 0x%08x, val - 0x%04x\n", in dump_regs()
808 (u32)&ugeth->p_rx_glbl_pram->typeorlen, in dump_regs()
809 in_be16(&ugeth->p_rx_glbl_pram->typeorlen)); in dump_regs()
810 pr_info("rxgstpack : addr - 0x%08x, val - 0x%02x\n", in dump_regs()
811 (u32)&ugeth->p_rx_glbl_pram->rxgstpack, in dump_regs()
812 ugeth->p_rx_glbl_pram->rxgstpack); in dump_regs()
813 pr_info("rxrmonbaseptr : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
814 (u32)&ugeth->p_rx_glbl_pram->rxrmonbaseptr, in dump_regs()
815 in_be32(&ugeth->p_rx_glbl_pram->rxrmonbaseptr)); in dump_regs()
816 pr_info("intcoalescingptr: addr - 0x%08x, val - 0x%08x\n", in dump_regs()
817 (u32)&ugeth->p_rx_glbl_pram->intcoalescingptr, in dump_regs()
818 in_be32(&ugeth->p_rx_glbl_pram->intcoalescingptr)); in dump_regs()
819 pr_info("rstate : addr - 0x%08x, val - 0x%02x\n", in dump_regs()
820 (u32)&ugeth->p_rx_glbl_pram->rstate, in dump_regs()
821 ugeth->p_rx_glbl_pram->rstate); in dump_regs()
822 pr_info("mrblr : addr - 0x%08x, val - 0x%04x\n", in dump_regs()
823 (u32)&ugeth->p_rx_glbl_pram->mrblr, in dump_regs()
824 in_be16(&ugeth->p_rx_glbl_pram->mrblr)); in dump_regs()
825 pr_info("rbdqptr : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
826 (u32)&ugeth->p_rx_glbl_pram->rbdqptr, in dump_regs()
827 in_be32(&ugeth->p_rx_glbl_pram->rbdqptr)); in dump_regs()
828 pr_info("mflr : addr - 0x%08x, val - 0x%04x\n", in dump_regs()
829 (u32)&ugeth->p_rx_glbl_pram->mflr, in dump_regs()
830 in_be16(&ugeth->p_rx_glbl_pram->mflr)); in dump_regs()
831 pr_info("minflr : addr - 0x%08x, val - 0x%04x\n", in dump_regs()
832 (u32)&ugeth->p_rx_glbl_pram->minflr, in dump_regs()
833 in_be16(&ugeth->p_rx_glbl_pram->minflr)); in dump_regs()
834 pr_info("maxd1 : addr - 0x%08x, val - 0x%04x\n", in dump_regs()
835 (u32)&ugeth->p_rx_glbl_pram->maxd1, in dump_regs()
836 in_be16(&ugeth->p_rx_glbl_pram->maxd1)); in dump_regs()
837 pr_info("maxd2 : addr - 0x%08x, val - 0x%04x\n", in dump_regs()
838 (u32)&ugeth->p_rx_glbl_pram->maxd2, in dump_regs()
839 in_be16(&ugeth->p_rx_glbl_pram->maxd2)); in dump_regs()
840 pr_info("ecamptr : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
841 (u32)&ugeth->p_rx_glbl_pram->ecamptr, in dump_regs()
842 in_be32(&ugeth->p_rx_glbl_pram->ecamptr)); in dump_regs()
843 pr_info("l2qt : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
844 (u32)&ugeth->p_rx_glbl_pram->l2qt, in dump_regs()
845 in_be32(&ugeth->p_rx_glbl_pram->l2qt)); in dump_regs()
846 pr_info("l3qt[0] : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
847 (u32)&ugeth->p_rx_glbl_pram->l3qt[0], in dump_regs()
848 in_be32(&ugeth->p_rx_glbl_pram->l3qt[0])); in dump_regs()
849 pr_info("l3qt[1] : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
850 (u32)&ugeth->p_rx_glbl_pram->l3qt[1], in dump_regs()
851 in_be32(&ugeth->p_rx_glbl_pram->l3qt[1])); in dump_regs()
852 pr_info("l3qt[2] : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
853 (u32)&ugeth->p_rx_glbl_pram->l3qt[2], in dump_regs()
854 in_be32(&ugeth->p_rx_glbl_pram->l3qt[2])); in dump_regs()
855 pr_info("l3qt[3] : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
856 (u32)&ugeth->p_rx_glbl_pram->l3qt[3], in dump_regs()
857 in_be32(&ugeth->p_rx_glbl_pram->l3qt[3])); in dump_regs()
858 pr_info("l3qt[4] : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
859 (u32)&ugeth->p_rx_glbl_pram->l3qt[4], in dump_regs()
860 in_be32(&ugeth->p_rx_glbl_pram->l3qt[4])); in dump_regs()
861 pr_info("l3qt[5] : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
862 (u32)&ugeth->p_rx_glbl_pram->l3qt[5], in dump_regs()
863 in_be32(&ugeth->p_rx_glbl_pram->l3qt[5])); in dump_regs()
864 pr_info("l3qt[6] : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
865 (u32)&ugeth->p_rx_glbl_pram->l3qt[6], in dump_regs()
866 in_be32(&ugeth->p_rx_glbl_pram->l3qt[6])); in dump_regs()
867 pr_info("l3qt[7] : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
868 (u32)&ugeth->p_rx_glbl_pram->l3qt[7], in dump_regs()
869 in_be32(&ugeth->p_rx_glbl_pram->l3qt[7])); in dump_regs()
870 pr_info("vlantype : addr - 0x%08x, val - 0x%04x\n", in dump_regs()
871 (u32)&ugeth->p_rx_glbl_pram->vlantype, in dump_regs()
872 in_be16(&ugeth->p_rx_glbl_pram->vlantype)); in dump_regs()
873 pr_info("vlantci : addr - 0x%08x, val - 0x%04x\n", in dump_regs()
874 (u32)&ugeth->p_rx_glbl_pram->vlantci, in dump_regs()
875 in_be16(&ugeth->p_rx_glbl_pram->vlantci)); in dump_regs()
877 pr_info("addressfiltering[%d]: addr - 0x%08x, val - 0x%02x\n", in dump_regs()
879 (u32)&ugeth->p_rx_glbl_pram->addressfiltering[i], in dump_regs()
880 ugeth->p_rx_glbl_pram->addressfiltering[i]); in dump_regs()
881 pr_info("exfGlobalParam : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
882 (u32)&ugeth->p_rx_glbl_pram->exfGlobalParam, in dump_regs()
883 in_be32(&ugeth->p_rx_glbl_pram->exfGlobalParam)); in dump_regs()
885 if (ugeth->p_send_q_mem_reg) { in dump_regs()
887 pr_info("Base address: 0x%08x\n", (u32)ugeth->p_send_q_mem_reg); in dump_regs()
888 for (i = 0; i < ucc_geth_tx_queues(ugeth->ug_info); i++) { in dump_regs()
890 pr_info("Base address: 0x%08x\n", in dump_regs()
891 (u32)&ugeth->p_send_q_mem_reg->sqqd[i]); in dump_regs()
892 mem_disp((u8 *) & ugeth->p_send_q_mem_reg->sqqd[i], in dump_regs()
896 if (ugeth->p_scheduler) { in dump_regs()
898 pr_info("Base address: 0x%08x\n", (u32)ugeth->p_scheduler); in dump_regs()
899 mem_disp((u8 *) ugeth->p_scheduler, in dump_regs()
900 sizeof(*ugeth->p_scheduler)); in dump_regs()
902 if (ugeth->p_tx_fw_statistics_pram) { in dump_regs()
904 pr_info("Base address: 0x%08x\n", in dump_regs()
905 (u32)ugeth->p_tx_fw_statistics_pram); in dump_regs()
906 mem_disp((u8 *) ugeth->p_tx_fw_statistics_pram, in dump_regs()
907 sizeof(*ugeth->p_tx_fw_statistics_pram)); in dump_regs()
909 if (ugeth->p_rx_fw_statistics_pram) { in dump_regs()
911 pr_info("Base address: 0x%08x\n", in dump_regs()
912 (u32)ugeth->p_rx_fw_statistics_pram); in dump_regs()
913 mem_disp((u8 *) ugeth->p_rx_fw_statistics_pram, in dump_regs()
914 sizeof(*ugeth->p_rx_fw_statistics_pram)); in dump_regs()
916 if (ugeth->p_rx_irq_coalescing_tbl) { in dump_regs()
918 pr_info("Base address: 0x%08x\n", in dump_regs()
919 (u32)ugeth->p_rx_irq_coalescing_tbl); in dump_regs()
920 for (i = 0; i < ucc_geth_rx_queues(ugeth->ug_info); i++) { in dump_regs()
922 pr_info("Base address: 0x%08x\n", in dump_regs()
923 (u32)&ugeth->p_rx_irq_coalescing_tbl-> in dump_regs()
925 pr_info("interruptcoalescingmaxvalue: addr - 0x%08x, val - 0x%08x\n", in dump_regs()
926 (u32)&ugeth->p_rx_irq_coalescing_tbl-> in dump_regs()
928 in_be32(&ugeth->p_rx_irq_coalescing_tbl-> in dump_regs()
931 pr_info("interruptcoalescingcounter : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
932 (u32)&ugeth->p_rx_irq_coalescing_tbl-> in dump_regs()
934 in_be32(&ugeth->p_rx_irq_coalescing_tbl-> in dump_regs()
939 if (ugeth->p_rx_bd_qs_tbl) { in dump_regs()
940 pr_info("RX BD QS tables:\n"); in dump_regs()
941 pr_info("Base address: 0x%08x\n", (u32)ugeth->p_rx_bd_qs_tbl); in dump_regs()
942 for (i = 0; i < ucc_geth_rx_queues(ugeth->ug_info); i++) { in dump_regs()
943 pr_info("RX BD QS table[%d]:\n", i); in dump_regs()
944 pr_info("Base address: 0x%08x\n", in dump_regs()
945 (u32)&ugeth->p_rx_bd_qs_tbl[i]); in dump_regs()
946 pr_info("bdbaseptr : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
947 (u32)&ugeth->p_rx_bd_qs_tbl[i].bdbaseptr, in dump_regs()
948 in_be32(&ugeth->p_rx_bd_qs_tbl[i].bdbaseptr)); in dump_regs()
949 pr_info("bdptr : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
950 (u32)&ugeth->p_rx_bd_qs_tbl[i].bdptr, in dump_regs()
951 in_be32(&ugeth->p_rx_bd_qs_tbl[i].bdptr)); in dump_regs()
952 pr_info("externalbdbaseptr: addr - 0x%08x, val - 0x%08x\n", in dump_regs()
953 (u32)&ugeth->p_rx_bd_qs_tbl[i].externalbdbaseptr, in dump_regs()
954 in_be32(&ugeth->p_rx_bd_qs_tbl[i]. in dump_regs()
956 pr_info("externalbdptr : addr - 0x%08x, val - 0x%08x\n", in dump_regs()
957 (u32)&ugeth->p_rx_bd_qs_tbl[i].externalbdptr, in dump_regs()
958 in_be32(&ugeth->p_rx_bd_qs_tbl[i].externalbdptr)); in dump_regs()
960 pr_info("Base address: 0x%08x\n", in dump_regs()
962 (&ugeth->p_rx_bd_qs_tbl[i]. in dump_regs()
966 (&ugeth->p_rx_bd_qs_tbl[i]. in dump_regs()
971 if (ugeth->p_init_enet_param_shadow) { in dump_regs()
974 pr_info("Base address: 0x%08x\n", in dump_regs()
975 (u32) ugeth->p_init_enet_param_shadow); in dump_regs()
976 mem_disp((u8 *) ugeth->p_init_enet_param_shadow, in dump_regs()
977 sizeof(*ugeth->p_init_enet_param_shadow)); in dump_regs()
980 if (ugeth->ug_info->rxExtendedFiltering) { in dump_regs()
983 if (ugeth->ug_info->largestexternallookupkeysize == in dump_regs()
987 if (ugeth->ug_info->largestexternallookupkeysize == in dump_regs()
994 &(ugeth->p_init_enet_param_shadow-> in dump_regs()
998 ugeth->ug_info->riscTx, 0); in dump_regs()
1000 &(ugeth->p_init_enet_param_shadow-> in dump_regs()
1003 ugeth->ug_info->riscRx, 1); in dump_regs()
1031 return -EINVAL; in init_half_duplex_params()
1060 /* Non-Back-to-back IPG part 1 should be <= Non-Back-to-back in init_inter_frame_gap_params()
1063 return -EINVAL; in init_inter_frame_gap_params()
1069 return -EINVAL; in init_inter_frame_gap_params()
1177 /* Example: for a station address of 0x12345678ABCD, */ in init_mac_station_addr_regs()
1183 /* station address byte 5 station address byte 4 */ in init_mac_station_addr_regs()
1185 /* station address byte 3 station address byte 2 */ in init_mac_station_addr_regs()
1196 /* station address byte 1 station address byte 0 */ in init_mac_station_addr_regs()
1242 return -EINVAL; in init_max_rx_buff_len()
1255 if (min_frame_length >= (mrblr_value - 4)) in init_min_frame_len()
1256 return -EINVAL; in init_min_frame_len()
1276 uccf = ugeth->uccf; in ugeth_graceful_stop_tx()
1279 clrbits32(uccf->p_uccm, UCC_GETH_UCCE_GRA); in ugeth_graceful_stop_tx()
1280 out_be32(uccf->p_ucce, UCC_GETH_UCCE_GRA); /* clear by writing 1 */ in ugeth_graceful_stop_tx()
1284 ucc_fast_get_qe_cr_subblock(ugeth->ug_info->uf_info.ucc_num); in ugeth_graceful_stop_tx()
1291 temp = in_be32(uccf->p_ucce); in ugeth_graceful_stop_tx()
1292 } while (!(temp & UCC_GETH_UCCE_GRA) && --i); in ugeth_graceful_stop_tx()
1294 uccf->stopped_tx = 1; in ugeth_graceful_stop_tx()
1306 uccf = ugeth->uccf; in ugeth_graceful_stop_rx()
1309 temp = in_8(&ugeth->p_rx_glbl_pram->rxgstpack); in ugeth_graceful_stop_rx()
1311 out_8(&ugeth->p_rx_glbl_pram->rxgstpack, temp); in ugeth_graceful_stop_rx()
1318 ucc_fast_get_qe_cr_subblock(ugeth->ug_info->uf_info. in ugeth_graceful_stop_rx()
1323 temp = in_8(&ugeth->p_rx_glbl_pram->rxgstpack); in ugeth_graceful_stop_rx()
1324 } while (!(temp & GRACEFUL_STOP_ACKNOWLEDGE_RX) && --i); in ugeth_graceful_stop_rx()
1326 uccf->stopped_rx = 1; in ugeth_graceful_stop_rx()
1336 uccf = ugeth->uccf; in ugeth_restart_tx()
1339 ucc_fast_get_qe_cr_subblock(ugeth->ug_info->uf_info.ucc_num); in ugeth_restart_tx()
1341 uccf->stopped_tx = 0; in ugeth_restart_tx()
1351 uccf = ugeth->uccf; in ugeth_restart_rx()
1354 ucc_fast_get_qe_cr_subblock(ugeth->ug_info->uf_info.ucc_num); in ugeth_restart_rx()
1357 uccf->stopped_rx = 0; in ugeth_restart_rx()
1367 uccf = ugeth->uccf; in ugeth_enable()
1370 if (ugeth->ug_info->uf_info.ucc_num >= UCC_MAX_NUM) { in ugeth_enable()
1373 return -EINVAL; in ugeth_enable()
1376 enabled_tx = uccf->enabled_tx; in ugeth_enable()
1377 enabled_rx = uccf->enabled_rx; in ugeth_enable()
1381 if ((mode & COMM_DIR_TX) && (!enabled_tx) && uccf->stopped_tx) in ugeth_enable()
1383 if ((mode & COMM_DIR_RX) && (!enabled_rx) && uccf->stopped_rx) in ugeth_enable()
1396 uccf = ugeth->uccf; in ugeth_disable()
1399 if (ugeth->ug_info->uf_info.ucc_num >= UCC_MAX_NUM) { in ugeth_disable()
1402 return -EINVAL; in ugeth_disable()
1406 if ((mode & COMM_DIR_TX) && uccf->enabled_tx && !uccf->stopped_tx) in ugeth_disable()
1410 if ((mode & COMM_DIR_RX) && uccf->enabled_rx && !uccf->stopped_rx) in ugeth_disable()
1413 ucc_fast_disable(ugeth->uccf, mode); /* OK to do even if not enabled */ in ugeth_disable()
1421 netif_tx_stop_all_queues(ugeth->ndev); in ugeth_quiesce()
1424 disable_irq(ugeth->ug_info->uf_info.irq); in ugeth_quiesce()
1427 napi_disable(&ugeth->napi); in ugeth_quiesce()
1432 napi_enable(&ugeth->napi); in ugeth_activate()
1433 enable_irq(ugeth->ug_info->uf_info.irq); in ugeth_activate()
1436 netif_tx_wake_all_queues(ugeth->ndev); in ugeth_activate()
1437 netdev_watchdog_up(ugeth->ndev); in ugeth_activate()
1443 * "normal" PHY at the address found in the UTBIPA register. We assume
1451 struct ucc_geth_info *ug_info = ugeth->ug_info; in uec_configure_serdes()
1454 if (!ug_info->tbi_node) { in uec_configure_serdes()
1455 dev_warn(&dev->dev, "SGMII mode requires that the device tree specify a tbi-handle\n"); in uec_configure_serdes()
1459 tbiphy = of_phy_find_device(ug_info->tbi_node); in uec_configure_serdes()
1461 dev_err(&dev->dev, "error: Could not get TBI device\n"); in uec_configure_serdes()
1467 * configure and reset the TBI<->SerDes link. Maybe U-Boot configured in uec_configure_serdes()
1472 put_device(&tbiphy->mdio.dev); in uec_configure_serdes()
1483 put_device(&tbiphy->mdio.dev); in uec_configure_serdes()
1490 struct net_device *ndev = to_net_dev(config->dev); in ugeth_mac_link_up()
1492 struct ucc_geth_info *ug_info = ugeth->ug_info; in ugeth_mac_link_up()
1493 struct ucc_geth __iomem *ug_regs = ugeth->ug_regs; in ugeth_mac_link_up()
1494 struct ucc_fast __iomem *uf_regs = ugeth->uccf->uf_regs; in ugeth_mac_link_up()
1495 u32 old_maccfg2, maccfg2 = in_be32(&ug_regs->maccfg2); in ugeth_mac_link_up()
1496 u32 old_upsmr, upsmr = in_be32(&uf_regs->upsmr); in ugeth_mac_link_up()
1512 maccfg2 |= ug_info->padAndCrc; in ugeth_mac_link_up()
1545 * ugeth->lock, which is a bad idea since 'graceful in ugeth_mac_link_up()
1552 out_be32(&ug_regs->maccfg2, maccfg2); in ugeth_mac_link_up()
1553 out_be32(&uf_regs->upsmr, upsmr); in ugeth_mac_link_up()
1563 ug_info->aufc = 0; in ugeth_mac_link_up()
1564 ug_info->receiveFlowControl = rx_pause; in ugeth_mac_link_up()
1565 ug_info->transmitFlowControl = tx_pause; in ugeth_mac_link_up()
1567 init_flow_control_params(ug_info->aufc, in ugeth_mac_link_up()
1568 ug_info->receiveFlowControl, in ugeth_mac_link_up()
1569 ug_info->transmitFlowControl, in ugeth_mac_link_up()
1570 ug_info->pausePeriod, in ugeth_mac_link_up()
1571 ug_info->extensionField, in ugeth_mac_link_up()
1572 &ugeth->uccf->uf_regs->upsmr, in ugeth_mac_link_up()
1573 &ugeth->ug_regs->uempr, in ugeth_mac_link_up()
1574 &ugeth->ug_regs->maccfg1); in ugeth_mac_link_up()
1583 struct net_device *ndev = to_net_dev(config->dev); in ugeth_mac_link_down()
1592 struct net_device *ndev = to_net_dev(config->dev); in ugeth_mac_config()
1594 struct ucc_geth_info *ug_info = ugeth->ug_info; in ugeth_mac_config()
1597 if (state->interface == PHY_INTERFACE_MODE_TBI || in ugeth_mac_config()
1598 state->interface == PHY_INTERFACE_MODE_RTBI) { in ugeth_mac_config()
1601 if (!ug_info->tbi_node) in ugeth_mac_config()
1602 pr_warn("TBI mode requires that the device tree specify a tbi-handle\n"); in ugeth_mac_config()
1604 tbiphy = of_phy_find_device(ug_info->tbi_node); in ugeth_mac_config()
1612 put_device(&tbiphy->mdio.dev); in ugeth_mac_config()
1616 ug_info->aufc = 1; in ugeth_mac_config()
1618 init_flow_control_params(ug_info->aufc, 1, 1, in ugeth_mac_config()
1619 ug_info->pausePeriod, in ugeth_mac_config()
1620 ug_info->extensionField, in ugeth_mac_config()
1621 &ugeth->uccf->uf_regs->upsmr, in ugeth_mac_config()
1622 &ugeth->ug_regs->uempr, in ugeth_mac_config()
1623 &ugeth->ug_regs->maccfg1); in ugeth_mac_config()
1630 ucc_fast_dump_regs(ugeth->uccf); in ugeth_dump_regs()
1650 uccf = ugeth->uccf; in ugeth_82xx_filtering_clear_all_addr_in_hash()
1654 ugeth->p_rx_glbl_pram->addressfiltering; in ugeth_82xx_filtering_clear_all_addr_in_hash()
1657 addr_h = &(p_82xx_addr_filt->gaddr_h); in ugeth_82xx_filtering_clear_all_addr_in_hash()
1658 addr_l = &(p_82xx_addr_filt->gaddr_l); in ugeth_82xx_filtering_clear_all_addr_in_hash()
1659 p_lh = &ugeth->group_hash_q; in ugeth_82xx_filtering_clear_all_addr_in_hash()
1660 p_counter = &(ugeth->numGroupAddrInHash); in ugeth_82xx_filtering_clear_all_addr_in_hash()
1662 addr_h = &(p_82xx_addr_filt->iaddr_h); in ugeth_82xx_filtering_clear_all_addr_in_hash()
1663 addr_l = &(p_82xx_addr_filt->iaddr_l); in ugeth_82xx_filtering_clear_all_addr_in_hash()
1664 p_lh = &ugeth->ind_hash_q; in ugeth_82xx_filtering_clear_all_addr_in_hash()
1665 p_counter = &(ugeth->numIndAddrInHash); in ugeth_82xx_filtering_clear_all_addr_in_hash()
1667 return -EINVAL; in ugeth_82xx_filtering_clear_all_addr_in_hash()
1670 if (uccf->enabled_tx) in ugeth_82xx_filtering_clear_all_addr_in_hash()
1672 if (uccf->enabled_rx) in ugeth_82xx_filtering_clear_all_addr_in_hash()
1701 ugeth->indAddrRegUsed[paddr_num] = 0; /* mark this paddr as not used */ in ugeth_82xx_filtering_clear_addr_in_paddr()
1710 u8 __iomem *bd; in ucc_geth_free_rx() local
1713 ug_info = ugeth->ug_info; in ucc_geth_free_rx()
1714 uf_info = &ug_info->uf_info; in ucc_geth_free_rx()
1716 for (i = 0; i < ucc_geth_rx_queues(ugeth->ug_info); i++) { in ucc_geth_free_rx()
1717 if (ugeth->p_rx_bd_ring[i]) { in ucc_geth_free_rx()
1719 bd = ugeth->p_rx_bd_ring[i]; in ucc_geth_free_rx()
1720 for (j = 0; j < ugeth->ug_info->bdRingLenRx[i]; j++) { in ucc_geth_free_rx()
1721 if (ugeth->rx_skbuff[i][j]) { in ucc_geth_free_rx()
1722 dma_unmap_single(ugeth->dev, in ucc_geth_free_rx()
1723 in_be32(&((struct qe_bd __iomem *)bd)->buf), in ucc_geth_free_rx()
1724 ugeth->ug_info-> in ucc_geth_free_rx()
1729 ugeth->rx_skbuff[i][j]); in ucc_geth_free_rx()
1730 ugeth->rx_skbuff[i][j] = NULL; in ucc_geth_free_rx()
1732 bd += sizeof(struct qe_bd); in ucc_geth_free_rx()
1735 kfree(ugeth->rx_skbuff[i]); in ucc_geth_free_rx()
1737 kfree(ugeth->p_rx_bd_ring[i]); in ucc_geth_free_rx()
1738 ugeth->p_rx_bd_ring[i] = NULL; in ucc_geth_free_rx()
1749 u8 __iomem *bd; in ucc_geth_free_tx() local
1751 netdev_reset_queue(ugeth->ndev); in ucc_geth_free_tx()
1753 ug_info = ugeth->ug_info; in ucc_geth_free_tx()
1754 uf_info = &ug_info->uf_info; in ucc_geth_free_tx()
1756 for (i = 0; i < ucc_geth_tx_queues(ugeth->ug_info); i++) { in ucc_geth_free_tx()
1757 bd = ugeth->p_tx_bd_ring[i]; in ucc_geth_free_tx()
1758 if (!bd) in ucc_geth_free_tx()
1760 for (j = 0; j < ugeth->ug_info->bdRingLenTx[i]; j++) { in ucc_geth_free_tx()
1761 if (ugeth->tx_skbuff[i][j]) { in ucc_geth_free_tx()
1762 dma_unmap_single(ugeth->dev, in ucc_geth_free_tx()
1763 in_be32(&((struct qe_bd __iomem *)bd)->buf), in ucc_geth_free_tx()
1764 (in_be32((u32 __iomem *)bd) & in ucc_geth_free_tx()
1767 dev_kfree_skb_any(ugeth->tx_skbuff[i][j]); in ucc_geth_free_tx()
1768 ugeth->tx_skbuff[i][j] = NULL; in ucc_geth_free_tx()
1772 kfree(ugeth->tx_skbuff[i]); in ucc_geth_free_tx()
1774 kfree(ugeth->p_tx_bd_ring[i]); in ucc_geth_free_tx()
1775 ugeth->p_tx_bd_ring[i] = NULL; in ucc_geth_free_tx()
1785 if (ugeth->uccf) { in ucc_geth_memclean()
1786 ucc_fast_free(ugeth->uccf); in ucc_geth_memclean()
1787 ugeth->uccf = NULL; in ucc_geth_memclean()
1790 qe_muram_free_addr(ugeth->p_thread_data_tx); in ucc_geth_memclean()
1791 ugeth->p_thread_data_tx = NULL; in ucc_geth_memclean()
1793 qe_muram_free_addr(ugeth->p_thread_data_rx); in ucc_geth_memclean()
1794 ugeth->p_thread_data_rx = NULL; in ucc_geth_memclean()
1796 qe_muram_free_addr(ugeth->p_exf_glbl_param); in ucc_geth_memclean()
1797 ugeth->p_exf_glbl_param = NULL; in ucc_geth_memclean()
1799 qe_muram_free_addr(ugeth->p_rx_glbl_pram); in ucc_geth_memclean()
1800 ugeth->p_rx_glbl_pram = NULL; in ucc_geth_memclean()
1802 qe_muram_free_addr(ugeth->p_tx_glbl_pram); in ucc_geth_memclean()
1803 ugeth->p_tx_glbl_pram = NULL; in ucc_geth_memclean()
1805 qe_muram_free_addr(ugeth->p_send_q_mem_reg); in ucc_geth_memclean()
1806 ugeth->p_send_q_mem_reg = NULL; in ucc_geth_memclean()
1808 qe_muram_free_addr(ugeth->p_scheduler); in ucc_geth_memclean()
1809 ugeth->p_scheduler = NULL; in ucc_geth_memclean()
1811 qe_muram_free_addr(ugeth->p_tx_fw_statistics_pram); in ucc_geth_memclean()
1812 ugeth->p_tx_fw_statistics_pram = NULL; in ucc_geth_memclean()
1814 qe_muram_free_addr(ugeth->p_rx_fw_statistics_pram); in ucc_geth_memclean()
1815 ugeth->p_rx_fw_statistics_pram = NULL; in ucc_geth_memclean()
1817 qe_muram_free_addr(ugeth->p_rx_irq_coalescing_tbl); in ucc_geth_memclean()
1818 ugeth->p_rx_irq_coalescing_tbl = NULL; in ucc_geth_memclean()
1820 qe_muram_free_addr(ugeth->p_rx_bd_qs_tbl); in ucc_geth_memclean()
1821 ugeth->p_rx_bd_qs_tbl = NULL; in ucc_geth_memclean()
1823 if (ugeth->p_init_enet_param_shadow) { in ucc_geth_memclean()
1825 &(ugeth->p_init_enet_param_shadow-> in ucc_geth_memclean()
1828 ugeth->ug_info->riscRx, 1); in ucc_geth_memclean()
1830 &(ugeth->p_init_enet_param_shadow-> in ucc_geth_memclean()
1833 ugeth->ug_info->riscTx, 0); in ucc_geth_memclean()
1834 kfree(ugeth->p_init_enet_param_shadow); in ucc_geth_memclean()
1835 ugeth->p_init_enet_param_shadow = NULL; in ucc_geth_memclean()
1839 while (!list_empty(&ugeth->group_hash_q)) in ucc_geth_memclean()
1841 (dequeue(&ugeth->group_hash_q))); in ucc_geth_memclean()
1842 while (!list_empty(&ugeth->ind_hash_q)) in ucc_geth_memclean()
1844 (dequeue(&ugeth->ind_hash_q))); in ucc_geth_memclean()
1845 if (ugeth->ug_regs) { in ucc_geth_memclean()
1846 iounmap(ugeth->ug_regs); in ucc_geth_memclean()
1847 ugeth->ug_regs = NULL; in ucc_geth_memclean()
1860 uf_regs = ugeth->uccf->uf_regs; in ucc_geth_set_multi()
1862 if (dev->flags & IFF_PROMISC) { in ucc_geth_set_multi()
1863 setbits32(&uf_regs->upsmr, UCC_GETH_UPSMR_PRO); in ucc_geth_set_multi()
1865 clrbits32(&uf_regs->upsmr, UCC_GETH_UPSMR_PRO); in ucc_geth_set_multi()
1868 (struct ucc_geth_82xx_address_filtering_pram __iomem *) ugeth-> in ucc_geth_set_multi()
1869 p_rx_glbl_pram->addressfiltering; in ucc_geth_set_multi()
1871 if (dev->flags & IFF_ALLMULTI) { in ucc_geth_set_multi()
1875 out_be32(&p_82xx_addr_filt->gaddr_h, 0xffffffff); in ucc_geth_set_multi()
1876 out_be32(&p_82xx_addr_filt->gaddr_l, 0xffffffff); in ucc_geth_set_multi()
1880 out_be32(&p_82xx_addr_filt->gaddr_h, 0x0); in ucc_geth_set_multi()
1881 out_be32(&p_82xx_addr_filt->gaddr_l, 0x0); in ucc_geth_set_multi()
1887 hw_add_addr_in_hash(ugeth, ha->addr); in ucc_geth_set_multi()
1895 struct ucc_geth __iomem *ug_regs = ugeth->ug_regs; in ucc_geth_stop()
1904 phylink_stop(ugeth->phylink); in ucc_geth_stop()
1910 out_be32(ugeth->uccf->p_uccm, 0x00000000); in ucc_geth_stop()
1913 out_be32(ugeth->uccf->p_ucce, 0xffffffff); in ucc_geth_stop()
1916 clrbits32(&ug_regs->maccfg1, MACCFG1_ENABLE_RX | MACCFG1_ENABLE_TX); in ucc_geth_stop()
1927 ug_info = ugeth->ug_info; in ucc_struct_init()
1928 uf_info = &ug_info->uf_info; in ucc_struct_init()
1930 /* Rx BD lengths */ in ucc_struct_init()
1932 if ((ug_info->bdRingLenRx[i] < UCC_GETH_RX_BD_RING_SIZE_MIN) || in ucc_struct_init()
1933 (ug_info->bdRingLenRx[i] % in ucc_struct_init()
1936 pr_err("Rx BD ring length must be multiple of 4, no smaller than 8\n"); in ucc_struct_init()
1937 return -EINVAL; in ucc_struct_init()
1941 /* Tx BD lengths */ in ucc_struct_init()
1943 if (ug_info->bdRingLenTx[i] < UCC_GETH_TX_BD_RING_SIZE_MIN) { in ucc_struct_init()
1945 pr_err("Tx BD ring length must be no smaller than 2\n"); in ucc_struct_init()
1946 return -EINVAL; in ucc_struct_init()
1951 if ((uf_info->max_rx_buf_length == 0) || in ucc_struct_init()
1952 (uf_info->max_rx_buf_length % UCC_GETH_MRBLR_ALIGNMENT)) { in ucc_struct_init()
1954 pr_err("max_rx_buf_length must be non-zero multiple of 128\n"); in ucc_struct_init()
1955 return -EINVAL; in ucc_struct_init()
1962 return -EINVAL; in ucc_struct_init()
1969 return -EINVAL; in ucc_struct_init()
1974 if (ug_info->l2qt[i] >= ucc_geth_rx_queues(ug_info)) { in ucc_struct_init()
1977 return -EINVAL; in ucc_struct_init()
1983 if (ug_info->l3qt[i] >= ucc_geth_rx_queues(ug_info)) { in ucc_struct_init()
1986 return -EINVAL; in ucc_struct_init()
1990 if (ug_info->cam && !ug_info->ecamptr) { in ucc_struct_init()
1993 return -EINVAL; in ucc_struct_init()
1996 if ((ug_info->numStationAddresses != in ucc_struct_init()
1998 ug_info->rxExtendedFiltering) { in ucc_struct_init()
2001 return -EINVAL; in ucc_struct_init()
2005 uf_info->uccm_mask = ug_info->eventRegMask & UCCE_OTHER;/* Errors */ in ucc_struct_init()
2007 uf_info->uccm_mask |= (UCC_GETH_UCCE_RXF0 << i); in ucc_struct_init()
2010 uf_info->uccm_mask |= (UCC_GETH_UCCE_TXB0 << i); in ucc_struct_init()
2012 if (ucc_fast_init(uf_info, &ugeth->uccf)) { in ucc_struct_init()
2015 return -ENOMEM; in ucc_struct_init()
2022 ug_info->riscTx = QE_RISC_ALLOCATION_FOUR_RISCS; in ucc_struct_init()
2023 ug_info->riscRx = QE_RISC_ALLOCATION_FOUR_RISCS; in ucc_struct_init()
2026 ugeth->ug_regs = ioremap(uf_info->regs, sizeof(*ugeth->ug_regs)); in ucc_struct_init()
2027 if (!ugeth->ug_regs) { in ucc_struct_init()
2030 return -ENOMEM; in ucc_struct_init()
2042 u8 __iomem *bd; in ucc_geth_alloc_tx() local
2044 ug_info = ugeth->ug_info; in ucc_geth_alloc_tx()
2045 uf_info = &ug_info->uf_info; in ucc_geth_alloc_tx()
2053 length = ug_info->bdRingLenTx[j] * sizeof(struct qe_bd); in ucc_geth_alloc_tx()
2057 ugeth->p_tx_bd_ring[j] = kmalloc(alloc, GFP_KERNEL); in ucc_geth_alloc_tx()
2059 if (!ugeth->p_tx_bd_ring[j]) { in ucc_geth_alloc_tx()
2061 pr_err("Can not allocate memory for Tx bd rings\n"); in ucc_geth_alloc_tx()
2062 return -ENOMEM; in ucc_geth_alloc_tx()
2064 /* Zero unused end of bd ring, according to spec */ in ucc_geth_alloc_tx()
2065 memset(ugeth->p_tx_bd_ring[j] + length, 0, alloc - length); in ucc_geth_alloc_tx()
2071 ugeth->tx_skbuff[j] = in ucc_geth_alloc_tx()
2072 kcalloc(ugeth->ug_info->bdRingLenTx[j], in ucc_geth_alloc_tx()
2075 if (ugeth->tx_skbuff[j] == NULL) { in ucc_geth_alloc_tx()
2078 return -ENOMEM; in ucc_geth_alloc_tx()
2081 ugeth->skb_curtx[j] = ugeth->skb_dirtytx[j] = 0; in ucc_geth_alloc_tx()
2082 bd = ugeth->confBd[j] = ugeth->txBd[j] = ugeth->p_tx_bd_ring[j]; in ucc_geth_alloc_tx()
2083 for (i = 0; i < ug_info->bdRingLenTx[j]; i++) { in ucc_geth_alloc_tx()
2084 /* clear bd buffer */ in ucc_geth_alloc_tx()
2085 out_be32(&((struct qe_bd __iomem *)bd)->buf, 0); in ucc_geth_alloc_tx()
2086 /* set bd status and length */ in ucc_geth_alloc_tx()
2087 out_be32((u32 __iomem *)bd, 0); in ucc_geth_alloc_tx()
2088 bd += sizeof(struct qe_bd); in ucc_geth_alloc_tx()
2090 bd -= sizeof(struct qe_bd); in ucc_geth_alloc_tx()
2091 /* set bd status and length */ in ucc_geth_alloc_tx()
2092 out_be32((u32 __iomem *)bd, T_W); /* for last BD set Wrap bit */ in ucc_geth_alloc_tx()
2104 u8 __iomem *bd; in ucc_geth_alloc_rx() local
2106 ug_info = ugeth->ug_info; in ucc_geth_alloc_rx()
2107 uf_info = &ug_info->uf_info; in ucc_geth_alloc_rx()
2114 length = ug_info->bdRingLenRx[j] * sizeof(struct qe_bd); in ucc_geth_alloc_rx()
2118 ugeth->p_rx_bd_ring[j] = kmalloc(alloc, GFP_KERNEL); in ucc_geth_alloc_rx()
2119 if (!ugeth->p_rx_bd_ring[j]) { in ucc_geth_alloc_rx()
2121 pr_err("Can not allocate memory for Rx bd rings\n"); in ucc_geth_alloc_rx()
2122 return -ENOMEM; in ucc_geth_alloc_rx()
2129 ugeth->rx_skbuff[j] = in ucc_geth_alloc_rx()
2130 kcalloc(ugeth->ug_info->bdRingLenRx[j], in ucc_geth_alloc_rx()
2133 if (ugeth->rx_skbuff[j] == NULL) { in ucc_geth_alloc_rx()
2136 return -ENOMEM; in ucc_geth_alloc_rx()
2139 ugeth->skb_currx[j] = 0; in ucc_geth_alloc_rx()
2140 bd = ugeth->rxBd[j] = ugeth->p_rx_bd_ring[j]; in ucc_geth_alloc_rx()
2141 for (i = 0; i < ug_info->bdRingLenRx[j]; i++) { in ucc_geth_alloc_rx()
2142 /* set bd status and length */ in ucc_geth_alloc_rx()
2143 out_be32((u32 __iomem *)bd, R_I); in ucc_geth_alloc_rx()
2144 /* clear bd buffer */ in ucc_geth_alloc_rx()
2145 out_be32(&((struct qe_bd __iomem *)bd)->buf, 0); in ucc_geth_alloc_rx()
2146 bd += sizeof(struct qe_bd); in ucc_geth_alloc_rx()
2148 bd -= sizeof(struct qe_bd); in ucc_geth_alloc_rx()
2149 /* set bd status and length */ in ucc_geth_alloc_rx()
2150 out_be32((u32 __iomem *)bd, R_W); /* for last BD set Wrap bit */ in ucc_geth_alloc_rx()
2165 int ret_val = -EINVAL; in ucc_geth_startup()
2176 uccf = ugeth->uccf; in ucc_geth_startup()
2177 ug_info = ugeth->ug_info; in ucc_geth_startup()
2178 uf_info = &ug_info->uf_info; in ucc_geth_startup()
2179 uf_regs = uccf->uf_regs; in ucc_geth_startup()
2180 ug_regs = ugeth->ug_regs; in ucc_geth_startup()
2182 numThreadsRxNumerical = ucc_geth_thread_count(ug_info->numThreadsRx); in ucc_geth_startup()
2186 return -EINVAL; in ucc_geth_startup()
2189 numThreadsTxNumerical = ucc_geth_thread_count(ug_info->numThreadsTx); in ucc_geth_startup()
2193 return -EINVAL; in ucc_geth_startup()
2197 ugeth->rx_non_dynamic_extended_features = ug_info->ipCheckSumCheck || in ucc_geth_startup()
2198 ug_info->ipAddressAlignment || in ucc_geth_startup()
2199 (ug_info->numStationAddresses != in ucc_geth_startup()
2202 ugeth->rx_extended_features = ugeth->rx_non_dynamic_extended_features || in ucc_geth_startup()
2203 (ug_info->vlanOperationTagged != UCC_GETH_VLAN_OPERATION_TAGGED_NOP) || in ucc_geth_startup()
2204 (ug_info->vlanOperationNonTagged != in ucc_geth_startup()
2207 init_default_reg_vals(&uf_regs->upsmr, in ucc_geth_startup()
2208 &ug_regs->maccfg1, &ug_regs->maccfg2); in ucc_geth_startup()
2212 init_rx_parameters(ug_info->bro, in ucc_geth_startup()
2213 ug_info->rsh, ug_info->pro, &uf_regs->upsmr); in ucc_geth_startup()
2220 init_flow_control_params(ug_info->aufc, in ucc_geth_startup()
2221 ug_info->receiveFlowControl, in ucc_geth_startup()
2222 ug_info->transmitFlowControl, in ucc_geth_startup()
2223 ug_info->pausePeriod, in ucc_geth_startup()
2224 ug_info->extensionField, in ucc_geth_startup()
2225 &uf_regs->upsmr, in ucc_geth_startup()
2226 &ug_regs->uempr, &ug_regs->maccfg1); in ucc_geth_startup()
2228 setbits32(&ug_regs->maccfg1, MACCFG1_ENABLE_RX | MACCFG1_ENABLE_TX); in ucc_geth_startup()
2232 ret_val = init_inter_frame_gap_params(ug_info->nonBackToBackIfgPart1, in ucc_geth_startup()
2233 ug_info->nonBackToBackIfgPart2, in ucc_geth_startup()
2234 ug_info-> in ucc_geth_startup()
2236 ug_info->backToBackInterFrameGap, in ucc_geth_startup()
2237 &ug_regs->ipgifg); in ucc_geth_startup()
2246 ret_val = init_half_duplex_params(ug_info->altBeb, in ucc_geth_startup()
2247 ug_info->backPressureNoBackoff, in ucc_geth_startup()
2248 ug_info->noBackoff, in ucc_geth_startup()
2249 ug_info->excessDefer, in ucc_geth_startup()
2250 ug_info->altBebTruncation, in ucc_geth_startup()
2251 ug_info->maxRetransmission, in ucc_geth_startup()
2252 ug_info->collisionWindow, in ucc_geth_startup()
2253 &ug_regs->hafdup); in ucc_geth_startup()
2262 /* Read only - resets upon read */ in ucc_geth_startup()
2263 ifstat = in_be32(&ug_regs->ifstat); in ucc_geth_startup()
2267 out_be32(&ug_regs->uempr, 0); in ucc_geth_startup()
2271 init_hw_statistics_gathering_mode((ug_info->statisticsMode & in ucc_geth_startup()
2273 0, &uf_regs->upsmr, &ug_regs->uescr); in ucc_geth_startup()
2294 return -ENOMEM; in ucc_geth_startup()
2296 ugeth->p_tx_glbl_pram = qe_muram_addr(tx_glbl_pram_offset); in ucc_geth_startup()
2301 ugeth->thread_dat_tx_offset = in ucc_geth_startup()
2306 if (IS_ERR_VALUE(ugeth->thread_dat_tx_offset)) { in ucc_geth_startup()
2309 return -ENOMEM; in ucc_geth_startup()
2312 ugeth->p_thread_data_tx = in ucc_geth_startup()
2313 (struct ucc_geth_thread_data_tx __iomem *) qe_muram_addr(ugeth-> in ucc_geth_startup()
2315 out_be32(&ugeth->p_tx_glbl_pram->tqptr, ugeth->thread_dat_tx_offset); in ucc_geth_startup()
2319 out_be32(&ugeth->p_tx_glbl_pram->vtagtable[i], in ucc_geth_startup()
2320 ug_info->vtagtable[i]); in ucc_geth_startup()
2324 out_8(&ugeth->p_tx_glbl_pram->iphoffset[i], in ucc_geth_startup()
2325 ug_info->iphoffset[i]); in ucc_geth_startup()
2329 ugeth->send_q_mem_reg_offset = in ucc_geth_startup()
2333 if (IS_ERR_VALUE(ugeth->send_q_mem_reg_offset)) { in ucc_geth_startup()
2336 return -ENOMEM; in ucc_geth_startup()
2339 ugeth->p_send_q_mem_reg = in ucc_geth_startup()
2340 (struct ucc_geth_send_queue_mem_region __iomem *) qe_muram_addr(ugeth-> in ucc_geth_startup()
2342 out_be32(&ugeth->p_tx_glbl_pram->sqptr, ugeth->send_q_mem_reg_offset); in ucc_geth_startup()
2345 /* Assume BD rings are already established */ in ucc_geth_startup()
2348 ugeth->p_tx_bd_ring[i] + (ug_info->bdRingLenTx[i] - in ucc_geth_startup()
2350 out_be32(&ugeth->p_send_q_mem_reg->sqqd[i].bd_ring_base, in ucc_geth_startup()
2351 (u32) virt_to_phys(ugeth->p_tx_bd_ring[i])); in ucc_geth_startup()
2352 out_be32(&ugeth->p_send_q_mem_reg->sqqd[i]. in ucc_geth_startup()
2361 ugeth->scheduler_offset = in ucc_geth_startup()
2364 if (IS_ERR_VALUE(ugeth->scheduler_offset)) { in ucc_geth_startup()
2367 return -ENOMEM; in ucc_geth_startup()
2370 ugeth->p_scheduler = in ucc_geth_startup()
2371 (struct ucc_geth_scheduler __iomem *) qe_muram_addr(ugeth-> in ucc_geth_startup()
2373 out_be32(&ugeth->p_tx_glbl_pram->schedulerbasepointer, in ucc_geth_startup()
2374 ugeth->scheduler_offset); in ucc_geth_startup()
2377 out_be32(&ugeth->p_scheduler->mblinterval, in ucc_geth_startup()
2378 ug_info->mblinterval); in ucc_geth_startup()
2379 out_be16(&ugeth->p_scheduler->nortsrbytetime, in ucc_geth_startup()
2380 ug_info->nortsrbytetime); in ucc_geth_startup()
2381 out_8(&ugeth->p_scheduler->fracsiz, ug_info->fracsiz); in ucc_geth_startup()
2382 out_8(&ugeth->p_scheduler->strictpriorityq, in ucc_geth_startup()
2383 ug_info->strictpriorityq); in ucc_geth_startup()
2384 out_8(&ugeth->p_scheduler->txasap, ug_info->txasap); in ucc_geth_startup()
2385 out_8(&ugeth->p_scheduler->extrabw, ug_info->extrabw); in ucc_geth_startup()
2387 out_8(&ugeth->p_scheduler->weightfactor[i], in ucc_geth_startup()
2388 ug_info->weightfactor[i]); in ucc_geth_startup()
2391 ugeth->p_cpucount[0] = &(ugeth->p_scheduler->cpucount0); in ucc_geth_startup()
2392 ugeth->p_cpucount[1] = &(ugeth->p_scheduler->cpucount1); in ucc_geth_startup()
2393 ugeth->p_cpucount[2] = &(ugeth->p_scheduler->cpucount2); in ucc_geth_startup()
2394 ugeth->p_cpucount[3] = &(ugeth->p_scheduler->cpucount3); in ucc_geth_startup()
2395 ugeth->p_cpucount[4] = &(ugeth->p_scheduler->cpucount4); in ucc_geth_startup()
2396 ugeth->p_cpucount[5] = &(ugeth->p_scheduler->cpucount5); in ucc_geth_startup()
2397 ugeth->p_cpucount[6] = &(ugeth->p_scheduler->cpucount6); in ucc_geth_startup()
2398 ugeth->p_cpucount[7] = &(ugeth->p_scheduler->cpucount7); in ucc_geth_startup()
2403 if (ug_info-> in ucc_geth_startup()
2405 ugeth->tx_fw_statistics_pram_offset = in ucc_geth_startup()
2409 if (IS_ERR_VALUE(ugeth->tx_fw_statistics_pram_offset)) { in ucc_geth_startup()
2412 return -ENOMEM; in ucc_geth_startup()
2414 ugeth->p_tx_fw_statistics_pram = in ucc_geth_startup()
2416 qe_muram_addr(ugeth->tx_fw_statistics_pram_offset); in ucc_geth_startup()
2424 if (ug_info->ipCheckSumGenerate) in ucc_geth_startup()
2426 temoder |= ((ucc_geth_tx_queues(ug_info) - 1) << TEMODER_NUM_OF_QUEUES_SHIFT); in ucc_geth_startup()
2427 out_be16(&ugeth->p_tx_glbl_pram->temoder, temoder); in ucc_geth_startup()
2434 out_be32(&ugeth->p_tx_glbl_pram->tstate, ((u32) function_code) << 24); in ucc_geth_startup()
2444 return -ENOMEM; in ucc_geth_startup()
2446 ugeth->p_rx_glbl_pram = qe_muram_addr(rx_glbl_pram_offset); in ucc_geth_startup()
2451 ugeth->thread_dat_rx_offset = in ucc_geth_startup()
2455 if (IS_ERR_VALUE(ugeth->thread_dat_rx_offset)) { in ucc_geth_startup()
2458 return -ENOMEM; in ucc_geth_startup()
2461 ugeth->p_thread_data_rx = in ucc_geth_startup()
2462 (struct ucc_geth_thread_data_rx __iomem *) qe_muram_addr(ugeth-> in ucc_geth_startup()
2464 out_be32(&ugeth->p_rx_glbl_pram->rqptr, ugeth->thread_dat_rx_offset); in ucc_geth_startup()
2467 out_be16(&ugeth->p_rx_glbl_pram->typeorlen, ug_info->typeorlen); in ucc_geth_startup()
2470 if (ug_info-> in ucc_geth_startup()
2472 ugeth->rx_fw_statistics_pram_offset = in ucc_geth_startup()
2476 if (IS_ERR_VALUE(ugeth->rx_fw_statistics_pram_offset)) { in ucc_geth_startup()
2479 return -ENOMEM; in ucc_geth_startup()
2481 ugeth->p_rx_fw_statistics_pram = in ucc_geth_startup()
2483 qe_muram_addr(ugeth->rx_fw_statistics_pram_offset); in ucc_geth_startup()
2489 ugeth->rx_irq_coalescing_tbl_offset = in ucc_geth_startup()
2493 if (IS_ERR_VALUE(ugeth->rx_irq_coalescing_tbl_offset)) { in ucc_geth_startup()
2496 return -ENOMEM; in ucc_geth_startup()
2499 ugeth->p_rx_irq_coalescing_tbl = in ucc_geth_startup()
2501 qe_muram_addr(ugeth->rx_irq_coalescing_tbl_offset); in ucc_geth_startup()
2502 out_be32(&ugeth->p_rx_glbl_pram->intcoalescingptr, in ucc_geth_startup()
2503 ugeth->rx_irq_coalescing_tbl_offset); in ucc_geth_startup()
2507 out_be32(&ugeth->p_rx_irq_coalescing_tbl->coalescingentry[i]. in ucc_geth_startup()
2509 ug_info->interruptcoalescingmaxvalue[i]); in ucc_geth_startup()
2510 out_be32(&ugeth->p_rx_irq_coalescing_tbl->coalescingentry[i]. in ucc_geth_startup()
2512 ug_info->interruptcoalescingmaxvalue[i]); in ucc_geth_startup()
2516 init_max_rx_buff_len(uf_info->max_rx_buf_length, in ucc_geth_startup()
2517 &ugeth->p_rx_glbl_pram->mrblr); in ucc_geth_startup()
2519 out_be16(&ugeth->p_rx_glbl_pram->mflr, ug_info->maxFrameLength); in ucc_geth_startup()
2521 init_min_frame_len(ug_info->minFrameLength, in ucc_geth_startup()
2522 &ugeth->p_rx_glbl_pram->minflr, in ucc_geth_startup()
2523 &ugeth->p_rx_glbl_pram->mrblr); in ucc_geth_startup()
2525 out_be16(&ugeth->p_rx_glbl_pram->maxd1, ug_info->maxD1Length); in ucc_geth_startup()
2527 out_be16(&ugeth->p_rx_glbl_pram->maxd2, ug_info->maxD2Length); in ucc_geth_startup()
2532 l2qt |= (ug_info->l2qt[i] << (28 - 4 * i)); in ucc_geth_startup()
2533 out_be32(&ugeth->p_rx_glbl_pram->l2qt, l2qt); in ucc_geth_startup()
2539 l3qt |= (ug_info->l3qt[j + i] << (28 - 4 * i)); in ucc_geth_startup()
2540 out_be32(&ugeth->p_rx_glbl_pram->l3qt[j/8], l3qt); in ucc_geth_startup()
2544 out_be16(&ugeth->p_rx_glbl_pram->vlantype, ug_info->vlantype); in ucc_geth_startup()
2547 out_be16(&ugeth->p_rx_glbl_pram->vlantci, ug_info->vlantci); in ucc_geth_startup()
2550 out_be32(&ugeth->p_rx_glbl_pram->ecamptr, ug_info->ecamptr); in ucc_geth_startup()
2554 ugeth->rx_bd_qs_tbl_offset = in ucc_geth_startup()
2559 if (IS_ERR_VALUE(ugeth->rx_bd_qs_tbl_offset)) { in ucc_geth_startup()
2562 return -ENOMEM; in ucc_geth_startup()
2565 ugeth->p_rx_bd_qs_tbl = in ucc_geth_startup()
2566 (struct ucc_geth_rx_bd_queues_entry __iomem *) qe_muram_addr(ugeth-> in ucc_geth_startup()
2568 out_be32(&ugeth->p_rx_glbl_pram->rbdqptr, ugeth->rx_bd_qs_tbl_offset); in ucc_geth_startup()
2571 /* Assume BD rings are already established */ in ucc_geth_startup()
2573 out_be32(&ugeth->p_rx_bd_qs_tbl[i].externalbdbaseptr, in ucc_geth_startup()
2574 (u32) virt_to_phys(ugeth->p_rx_bd_ring[i])); in ucc_geth_startup()
2581 if (ugeth->rx_extended_features) in ucc_geth_startup()
2583 if (ug_info->rxExtendedFiltering) in ucc_geth_startup()
2585 if (ug_info->dynamicMaxFrameLength) in ucc_geth_startup()
2587 if (ug_info->dynamicMinFrameLength) in ucc_geth_startup()
2590 ug_info->vlanOperationTagged << REMODER_VLAN_OPERATION_TAGGED_SHIFT; in ucc_geth_startup()
2592 ug_info-> in ucc_geth_startup()
2594 remoder |= ug_info->rxQoSMode << REMODER_RX_QOS_MODE_SHIFT; in ucc_geth_startup()
2595 remoder |= ((ucc_geth_rx_queues(ug_info) - 1) << REMODER_NUM_OF_QUEUES_SHIFT); in ucc_geth_startup()
2596 if (ug_info->ipCheckSumCheck) in ucc_geth_startup()
2598 if (ug_info->ipAddressAlignment) in ucc_geth_startup()
2600 out_be32(&ugeth->p_rx_glbl_pram->remoder, remoder); in ucc_geth_startup()
2605 init_firmware_statistics_gathering_mode((ug_info-> in ucc_geth_startup()
2608 (ug_info->statisticsMode & in ucc_geth_startup()
2610 &ugeth->p_tx_glbl_pram->txrmonbaseptr, in ucc_geth_startup()
2611 ugeth->tx_fw_statistics_pram_offset, in ucc_geth_startup()
2612 &ugeth->p_rx_glbl_pram->rxrmonbaseptr, in ucc_geth_startup()
2613 ugeth->rx_fw_statistics_pram_offset, in ucc_geth_startup()
2614 &ugeth->p_tx_glbl_pram->temoder, in ucc_geth_startup()
2615 &ugeth->p_rx_glbl_pram->remoder); in ucc_geth_startup()
2618 out_8(&ugeth->p_rx_glbl_pram->rstate, function_code); in ucc_geth_startup()
2621 if (ug_info->rxExtendedFiltering) { in ucc_geth_startup()
2622 if (!ug_info->extendedFilteringChainPointer) { in ucc_geth_startup()
2625 return -EINVAL; in ucc_geth_startup()
2630 ugeth->exf_glbl_param_offset = in ucc_geth_startup()
2633 if (IS_ERR_VALUE(ugeth->exf_glbl_param_offset)) { in ucc_geth_startup()
2636 return -ENOMEM; in ucc_geth_startup()
2639 ugeth->p_exf_glbl_param = in ucc_geth_startup()
2640 (struct ucc_geth_exf_global_pram __iomem *) qe_muram_addr(ugeth-> in ucc_geth_startup()
2642 out_be32(&ugeth->p_rx_glbl_pram->exfGlobalParam, in ucc_geth_startup()
2643 ugeth->exf_glbl_param_offset); in ucc_geth_startup()
2644 out_be32(&ugeth->p_exf_glbl_param->l2pcdptr, in ucc_geth_startup()
2645 (u32) ug_info->extendedFilteringChainPointer); in ucc_geth_startup()
2647 } else { /* initialize 82xx style address filtering */ in ucc_geth_startup()
2649 /* Init individual address recognition registers to disabled */ in ucc_geth_startup()
2655 (struct ucc_geth_82xx_address_filtering_pram __iomem *) ugeth-> in ucc_geth_startup()
2656 p_rx_glbl_pram->addressfiltering; in ucc_geth_startup()
2677 if (!(ugeth->p_init_enet_param_shadow = in ucc_geth_startup()
2681 return -ENOMEM; in ucc_geth_startup()
2686 ugeth->p_init_enet_param_shadow->resinit1 = in ucc_geth_startup()
2688 ugeth->p_init_enet_param_shadow->resinit2 = in ucc_geth_startup()
2690 ugeth->p_init_enet_param_shadow->resinit3 = in ucc_geth_startup()
2692 ugeth->p_init_enet_param_shadow->resinit4 = in ucc_geth_startup()
2694 ugeth->p_init_enet_param_shadow->resinit5 = in ucc_geth_startup()
2696 ugeth->p_init_enet_param_shadow->rgftgfrxglobal |= in ucc_geth_startup()
2697 ((u32) ug_info->numThreadsRx) << ENET_INIT_PARAM_RGF_SHIFT; in ucc_geth_startup()
2698 ugeth->p_init_enet_param_shadow->rgftgfrxglobal |= in ucc_geth_startup()
2699 ((u32) ug_info->numThreadsTx) << ENET_INIT_PARAM_TGF_SHIFT; in ucc_geth_startup()
2701 ugeth->p_init_enet_param_shadow->rgftgfrxglobal |= in ucc_geth_startup()
2702 rx_glbl_pram_offset | ug_info->riscRx; in ucc_geth_startup()
2703 if ((ug_info->largestexternallookupkeysize != in ucc_geth_startup()
2705 (ug_info->largestexternallookupkeysize != in ucc_geth_startup()
2707 (ug_info->largestexternallookupkeysize != in ucc_geth_startup()
2711 return -EINVAL; in ucc_geth_startup()
2713 ugeth->p_init_enet_param_shadow->largestexternallookupkeysize = in ucc_geth_startup()
2714 ug_info->largestexternallookupkeysize; in ucc_geth_startup()
2716 if (ug_info->rxExtendedFiltering) { in ucc_geth_startup()
2718 if (ug_info->largestexternallookupkeysize == in ucc_geth_startup()
2722 if (ug_info->largestexternallookupkeysize == in ucc_geth_startup()
2728 if ((ret_val = fill_init_enet_entries(ugeth, &(ugeth-> in ucc_geth_startup()
2729 p_init_enet_param_shadow->rxthread[0]), in ucc_geth_startup()
2733 ug_info->riscRx, 1)) != 0) { in ucc_geth_startup()
2739 ugeth->p_init_enet_param_shadow->txglobal = in ucc_geth_startup()
2740 tx_glbl_pram_offset | ug_info->riscTx; in ucc_geth_startup()
2743 &(ugeth->p_init_enet_param_shadow-> in ucc_geth_startup()
2747 ug_info->riscTx, 0)) != 0) { in ucc_geth_startup()
2767 return -ENOMEM; in ucc_geth_startup()
2773 out_8(&p_init_enet_pram->resinit1, in ucc_geth_startup()
2774 ugeth->p_init_enet_param_shadow->resinit1); in ucc_geth_startup()
2775 out_8(&p_init_enet_pram->resinit2, in ucc_geth_startup()
2776 ugeth->p_init_enet_param_shadow->resinit2); in ucc_geth_startup()
2777 out_8(&p_init_enet_pram->resinit3, in ucc_geth_startup()
2778 ugeth->p_init_enet_param_shadow->resinit3); in ucc_geth_startup()
2779 out_8(&p_init_enet_pram->resinit4, in ucc_geth_startup()
2780 ugeth->p_init_enet_param_shadow->resinit4); in ucc_geth_startup()
2781 out_be16(&p_init_enet_pram->resinit5, in ucc_geth_startup()
2782 ugeth->p_init_enet_param_shadow->resinit5); in ucc_geth_startup()
2783 out_8(&p_init_enet_pram->largestexternallookupkeysize, in ucc_geth_startup()
2784 ugeth->p_init_enet_param_shadow->largestexternallookupkeysize); in ucc_geth_startup()
2785 out_be32(&p_init_enet_pram->rgftgfrxglobal, in ucc_geth_startup()
2786 ugeth->p_init_enet_param_shadow->rgftgfrxglobal); in ucc_geth_startup()
2788 out_be32(&p_init_enet_pram->rxthread[i], in ucc_geth_startup()
2789 ugeth->p_init_enet_param_shadow->rxthread[i]); in ucc_geth_startup()
2790 out_be32(&p_init_enet_pram->txglobal, in ucc_geth_startup()
2791 ugeth->p_init_enet_param_shadow->txglobal); in ucc_geth_startup()
2793 out_be32(&p_init_enet_pram->txthread[i], in ucc_geth_startup()
2794 ugeth->p_init_enet_param_shadow->txthread[i]); in ucc_geth_startup()
2798 ucc_fast_get_qe_cr_subblock(ugeth->ug_info->uf_info.ucc_num); in ucc_geth_startup()
2809 /* It is pointed to by the dev->hard_start_xmit function pointer */
2817 u8 __iomem *bd; /* BD pointer */ in ucc_geth_start_xmit() local
2824 netdev_sent_queue(dev, skb->len); in ucc_geth_start_xmit()
2825 spin_lock_irqsave(&ugeth->lock, flags); in ucc_geth_start_xmit()
2827 dev->stats.tx_bytes += skb->len; in ucc_geth_start_xmit()
2829 /* Start from the next BD that should be filled */ in ucc_geth_start_xmit()
2830 bd = ugeth->txBd[txQ]; in ucc_geth_start_xmit()
2831 bd_status = in_be32((u32 __iomem *)bd); in ucc_geth_start_xmit()
2833 ugeth->tx_skbuff[txQ][ugeth->skb_curtx[txQ]] = skb; in ucc_geth_start_xmit()
2836 ugeth->skb_curtx[txQ] = in ucc_geth_start_xmit()
2837 (ugeth->skb_curtx[txQ] + in ucc_geth_start_xmit()
2838 1) & TX_RING_MOD_MASK(ugeth->ug_info->bdRingLenTx[txQ]); in ucc_geth_start_xmit()
2841 out_be32(&((struct qe_bd __iomem *)bd)->buf, in ucc_geth_start_xmit()
2842 dma_map_single(ugeth->dev, skb->data, in ucc_geth_start_xmit()
2843 skb->len, DMA_TO_DEVICE)); in ucc_geth_start_xmit()
2845 /* printk(KERN_DEBUG"skb->data is 0x%x\n",skb->data); */ in ucc_geth_start_xmit()
2847 bd_status = (bd_status & T_W) | T_R | T_I | T_L | skb->len; in ucc_geth_start_xmit()
2849 /* set bd status and length */ in ucc_geth_start_xmit()
2850 out_be32((u32 __iomem *)bd, bd_status); in ucc_geth_start_xmit()
2852 /* Move to next BD in the ring */ in ucc_geth_start_xmit()
2854 bd += sizeof(struct qe_bd); in ucc_geth_start_xmit()
2856 bd = ugeth->p_tx_bd_ring[txQ]; in ucc_geth_start_xmit()
2858 /* If the next BD still needs to be cleaned up, then the bds in ucc_geth_start_xmit()
2860 if (bd == ugeth->confBd[txQ]) { in ucc_geth_start_xmit()
2865 ugeth->txBd[txQ] = bd; in ucc_geth_start_xmit()
2869 if (ugeth->p_scheduler) { in ucc_geth_start_xmit()
2870 ugeth->cpucount[txQ]++; in ucc_geth_start_xmit()
2873 /* This is done by writing a running counter of the bd in ucc_geth_start_xmit()
2875 out_be16(ugeth->p_cpucount[txQ], ugeth->cpucount[txQ]); in ucc_geth_start_xmit()
2879 uccf = ugeth->uccf; in ucc_geth_start_xmit()
2880 out_be16(uccf->p_utodr, UCC_FAST_TOD); in ucc_geth_start_xmit()
2882 spin_unlock_irqrestore(&ugeth->lock, flags); in ucc_geth_start_xmit()
2890 u8 __iomem *bd; in ucc_geth_rx() local
2898 dev = ugeth->ndev; in ucc_geth_rx()
2901 bd = ugeth->rxBd[rxQ]; in ucc_geth_rx()
2903 bd_status = in_be32((u32 __iomem *)bd); in ucc_geth_rx()
2905 /* while there are received buffers and BD is full (~R_E) */ in ucc_geth_rx()
2906 while (!((bd_status & (R_E)) || (--rx_work_limit < 0))) { in ucc_geth_rx()
2907 bdBuffer = (u8 *) in_be32(&((struct qe_bd __iomem *)bd)->buf); in ucc_geth_rx()
2908 length = (u16) ((bd_status & BD_LENGTH_MASK) - 4); in ucc_geth_rx()
2909 skb = ugeth->rx_skbuff[rxQ][ugeth->skb_currx[rxQ]]; in ucc_geth_rx()
2917 pr_err("%d: ERROR!!! skb - 0x%08x\n", in ucc_geth_rx()
2921 ugeth->rx_skbuff[rxQ][ugeth->skb_currx[rxQ]] = NULL; in ucc_geth_rx()
2922 dev->stats.rx_dropped++; in ucc_geth_rx()
2924 dev->stats.rx_packets++; in ucc_geth_rx()
2931 skb->protocol = eth_type_trans(skb, ugeth->ndev); in ucc_geth_rx()
2933 dev->stats.rx_bytes += length; in ucc_geth_rx()
2938 skb = get_new_skb(ugeth, bd); in ucc_geth_rx()
2942 dev->stats.rx_dropped++; in ucc_geth_rx()
2946 ugeth->rx_skbuff[rxQ][ugeth->skb_currx[rxQ]] = skb; in ucc_geth_rx()
2949 ugeth->skb_currx[rxQ] = in ucc_geth_rx()
2950 (ugeth->skb_currx[rxQ] + in ucc_geth_rx()
2951 1) & RX_RING_MOD_MASK(ugeth->ug_info->bdRingLenRx[rxQ]); in ucc_geth_rx()
2954 bd = ugeth->p_rx_bd_ring[rxQ]; in ucc_geth_rx()
2956 bd += sizeof(struct qe_bd); in ucc_geth_rx()
2958 bd_status = in_be32((u32 __iomem *)bd); in ucc_geth_rx()
2961 ugeth->rxBd[rxQ] = bd; in ucc_geth_rx()
2967 /* Start from the next BD that should be filled */ in ucc_geth_tx()
2971 u8 __iomem *bd; /* BD pointer */ in ucc_geth_tx() local
2974 bd = ugeth->confBd[txQ]; in ucc_geth_tx()
2975 bd_status = in_be32((u32 __iomem *)bd); in ucc_geth_tx()
2981 /* BD contains already transmitted buffer. */ in ucc_geth_tx()
2983 /* the BD to be used with the current frame */ in ucc_geth_tx()
2985 skb = ugeth->tx_skbuff[txQ][ugeth->skb_dirtytx[txQ]]; in ucc_geth_tx()
2989 bytes_sent += skb->len; in ucc_geth_tx()
2990 dev->stats.tx_packets++; in ucc_geth_tx()
2994 ugeth->tx_skbuff[txQ][ugeth->skb_dirtytx[txQ]] = NULL; in ucc_geth_tx()
2995 ugeth->skb_dirtytx[txQ] = in ucc_geth_tx()
2996 (ugeth->skb_dirtytx[txQ] + in ucc_geth_tx()
2997 1) & TX_RING_MOD_MASK(ugeth->ug_info->bdRingLenTx[txQ]); in ucc_geth_tx()
3003 /* Advance the confirmation BD pointer */ in ucc_geth_tx()
3005 bd += sizeof(struct qe_bd); in ucc_geth_tx()
3007 bd = ugeth->p_tx_bd_ring[txQ]; in ucc_geth_tx()
3008 bd_status = in_be32((u32 __iomem *)bd); in ucc_geth_tx()
3010 ugeth->confBd[txQ] = bd; in ucc_geth_tx()
3021 ug_info = ugeth->ug_info; in ucc_geth_poll()
3024 spin_lock(&ugeth->lock); in ucc_geth_poll()
3026 ucc_geth_tx(ugeth->ndev, i); in ucc_geth_poll()
3027 spin_unlock(&ugeth->lock); in ucc_geth_poll()
3031 howmany += ucc_geth_rx(ugeth, i, budget - howmany); in ucc_geth_poll()
3035 setbits32(ugeth->uccf->p_uccm, UCCE_RX_EVENTS | UCCE_TX_EVENTS); in ucc_geth_poll()
3052 uccf = ugeth->uccf; in ucc_geth_irq_handler()
3053 ug_info = ugeth->ug_info; in ucc_geth_irq_handler()
3056 ucce = (u32) in_be32(uccf->p_ucce); in ucc_geth_irq_handler()
3057 uccm = (u32) in_be32(uccf->p_uccm); in ucc_geth_irq_handler()
3059 out_be32(uccf->p_ucce, ucce); in ucc_geth_irq_handler()
3063 if (napi_schedule_prep(&ugeth->napi)) { in ucc_geth_irq_handler()
3065 out_be32(uccf->p_uccm, uccm); in ucc_geth_irq_handler()
3066 __napi_schedule(&ugeth->napi); in ucc_geth_irq_handler()
3073 dev->stats.rx_errors++; in ucc_geth_irq_handler()
3075 dev->stats.tx_errors++; in ucc_geth_irq_handler()
3083 * Polling 'interrupt' - used by things like netconsole to send skbs
3084 * without having to re-enable interrupts. It's not called while
3090 int irq = ugeth->ug_info->uf_info.irq; in ucc_netpoll()
3103 if (!is_valid_ether_addr(addr->sa_data)) in ucc_geth_set_mac_addr()
3104 return -EADDRNOTAVAIL; in ucc_geth_set_mac_addr()
3106 eth_hw_addr_set(dev, addr->sa_data); in ucc_geth_set_mac_addr()
3115 spin_lock_irq(&ugeth->lock); in ucc_geth_set_mac_addr()
3116 init_mac_station_addr_regs(dev->dev_addr[0], in ucc_geth_set_mac_addr()
3117 dev->dev_addr[1], in ucc_geth_set_mac_addr()
3118 dev->dev_addr[2], in ucc_geth_set_mac_addr()
3119 dev->dev_addr[3], in ucc_geth_set_mac_addr()
3120 dev->dev_addr[4], in ucc_geth_set_mac_addr()
3121 dev->dev_addr[5], in ucc_geth_set_mac_addr()
3122 &ugeth->ug_regs->macstnaddr1, in ucc_geth_set_mac_addr()
3123 &ugeth->ug_regs->macstnaddr2); in ucc_geth_set_mac_addr()
3124 spin_unlock_irq(&ugeth->lock); in ucc_geth_set_mac_addr()
3131 struct net_device *dev = ugeth->ndev; in ucc_geth_init_mac()
3148 init_mac_station_addr_regs(dev->dev_addr[0], in ucc_geth_init_mac()
3149 dev->dev_addr[1], in ucc_geth_init_mac()
3150 dev->dev_addr[2], in ucc_geth_init_mac()
3151 dev->dev_addr[3], in ucc_geth_init_mac()
3152 dev->dev_addr[4], in ucc_geth_init_mac()
3153 dev->dev_addr[5], in ucc_geth_init_mac()
3154 &ugeth->ug_regs->macstnaddr1, in ucc_geth_init_mac()
3155 &ugeth->ug_regs->macstnaddr2); in ucc_geth_init_mac()
3172 /* Test station address */ in ucc_geth_open()
3173 if (dev->dev_addr[0] & ENET_GROUP_ADDR) { in ucc_geth_open()
3175 "Multicast address used for station address - is this what you wanted?\n"); in ucc_geth_open()
3176 return -EINVAL; in ucc_geth_open()
3179 err = phylink_of_phy_connect(ugeth->phylink, ugeth->dev->of_node, 0); in ucc_geth_open()
3181 dev_err(&dev->dev, "Could not attach to PHY\n"); in ucc_geth_open()
3182 return -ENODEV; in ucc_geth_open()
3191 err = request_irq(ugeth->ug_info->uf_info.irq, ucc_geth_irq_handler, in ucc_geth_open()
3198 phylink_start(ugeth->phylink); in ucc_geth_open()
3199 napi_enable(&ugeth->napi); in ucc_geth_open()
3203 device_set_wakeup_capable(&dev->dev, in ucc_geth_open()
3204 qe_alive_during_sleep() || dev->phydev->irq); in ucc_geth_open()
3205 device_set_wakeup_enable(&dev->dev, ugeth->wol_en); in ucc_geth_open()
3221 napi_disable(&ugeth->napi); in ucc_geth_close()
3223 cancel_work_sync(&ugeth->timeout_work); in ucc_geth_close()
3225 phylink_disconnect_phy(ugeth->phylink); in ucc_geth_close()
3227 free_irq(ugeth->ug_info->uf_info.irq, ugeth->ndev); in ucc_geth_close()
3242 dev = ugeth->ndev; in ucc_geth_timeout_work()
3246 dev->stats.tx_errors++; in ucc_geth_timeout_work()
3250 if (dev->flags & IFF_UP) { in ucc_geth_timeout_work()
3259 phylink_start(ugeth->phylink); in ucc_geth_timeout_work()
3274 schedule_work(&ugeth->timeout_work); in ucc_geth_timeout()
3290 napi_disable(&ugeth->napi); in ucc_geth_suspend()
3298 if (ugeth->wol_en & WAKE_MAGIC && !ugeth->phy_wol_en) { in ucc_geth_suspend()
3299 setbits32(ugeth->uccf->p_uccm, UCC_GETH_UCCE_MPD); in ucc_geth_suspend()
3300 setbits32(&ugeth->ug_regs->maccfg2, MACCFG2_MPE); in ucc_geth_suspend()
3301 ucc_fast_enable(ugeth->uccf, COMM_DIR_RX_AND_TX); in ucc_geth_suspend()
3306 phylink_suspend(ugeth->phylink, mac_wol); in ucc_geth_suspend()
3322 if (ugeth->wol_en & WAKE_MAGIC) { in ucc_geth_resume()
3323 ucc_fast_disable(ugeth->uccf, COMM_DIR_RX_AND_TX); in ucc_geth_resume()
3324 clrbits32(&ugeth->ug_regs->maccfg2, MACCFG2_MPE); in ucc_geth_resume()
3325 clrbits32(ugeth->uccf->p_uccm, UCC_GETH_UCCE_MPD); in ucc_geth_resume()
3343 phylink_resume(ugeth->phylink); in ucc_geth_resume()
3346 napi_enable(&ugeth->napi); in ucc_geth_resume()
3362 return -EINVAL; in ucc_geth_ioctl()
3364 return phylink_mii_ioctl(ugeth->phylink, rq, cmd); in ucc_geth_ioctl()
3387 snprintf(buf, sizeof(buf), "%s-clock-name", which); in ucc_geth_parse_clock()
3394 snprintf(buf, sizeof(buf), "%s-clock", which); in ucc_geth_parse_clock()
3396 /* If both *-clock-name and *-clock are missing, in ucc_geth_parse_clock()
3397 * we want to tell people to use *-clock-name. in ucc_geth_parse_clock()
3399 pr_err("missing %s-clock-name property\n", buf); in ucc_geth_parse_clock()
3400 return -EINVAL; in ucc_geth_parse_clock()
3406 return -EINVAL; in ucc_geth_parse_clock()
3419 struct device *device = &ofdev->dev; in ucc_geth_probe()
3420 struct device_node *np = ofdev->dev.of_node; in ucc_geth_probe()
3433 prop = of_get_property(np, "cell-index", NULL); in ucc_geth_probe()
3435 prop = of_get_property(np, "device-id", NULL); in ucc_geth_probe()
3437 return -ENODEV; in ucc_geth_probe()
3440 ucc_num = *prop - 1; in ucc_geth_probe()
3442 return -ENODEV; in ucc_geth_probe()
3444 ug_info = devm_kmemdup(&ofdev->dev, &ugeth_primary_info, in ucc_geth_probe()
3447 return -ENOMEM; in ucc_geth_probe()
3449 ug_info->uf_info.ucc_num = ucc_num; in ucc_geth_probe()
3451 err = ucc_geth_parse_clock(np, "rx", &ug_info->uf_info.rx_clock); in ucc_geth_probe()
3454 err = ucc_geth_parse_clock(np, "tx", &ug_info->uf_info.tx_clock); in ucc_geth_probe()
3462 ug_info->uf_info.regs = res.start; in ucc_geth_probe()
3463 ug_info->uf_info.irq = irq_of_parse_and_map(np, 0); in ucc_geth_probe()
3466 ug_info->tbi_node = of_parse_phandle(np, "tbi-handle", 0); in ucc_geth_probe()
3468 phy_node = of_parse_phandle(np, "phy-handle", 0); in ucc_geth_probe()
3472 dev_err(&ofdev->dev, in ucc_geth_probe()
3473 …"Device-tree property 'interface' is no longer supported. Please use 'phy-connection-type' instead… in ucc_geth_probe()
3475 err = -EINVAL; in ucc_geth_probe()
3483 dev_err(&ofdev->dev, "Invalid phy-connection-type"); in ucc_geth_probe()
3494 ug_info->uf_info.urfs = UCC_GETH_URFS_GIGA_INIT; in ucc_geth_probe()
3495 ug_info->uf_info.urfet = UCC_GETH_URFET_GIGA_INIT; in ucc_geth_probe()
3496 ug_info->uf_info.urfset = UCC_GETH_URFSET_GIGA_INIT; in ucc_geth_probe()
3497 ug_info->uf_info.utfs = UCC_GETH_UTFS_GIGA_INIT; in ucc_geth_probe()
3498 ug_info->uf_info.utfet = UCC_GETH_UTFET_GIGA_INIT; in ucc_geth_probe()
3499 ug_info->uf_info.utftt = UCC_GETH_UTFTT_GIGA_INIT; in ucc_geth_probe()
3500 ug_info->numThreadsTx = UCC_GETH_NUM_OF_THREADS_4; in ucc_geth_probe()
3503 * 4 UECs at 1000Base-T simultaneously, we need to allocate in ucc_geth_probe()
3507 ug_info->numThreadsRx = UCC_GETH_NUM_OF_THREADS_6; in ucc_geth_probe()
3509 ug_info->numThreadsRx = UCC_GETH_NUM_OF_THREADS_4; in ucc_geth_probe()
3514 ug_info->uf_info.ucc_num + 1, in ucc_geth_probe()
3515 (u64)ug_info->uf_info.regs, in ucc_geth_probe()
3516 ug_info->uf_info.irq); in ucc_geth_probe()
3519 dev = devm_alloc_etherdev(&ofdev->dev, sizeof(*ugeth)); in ucc_geth_probe()
3521 err = -ENOMEM; in ucc_geth_probe()
3526 spin_lock_init(&ugeth->lock); in ucc_geth_probe()
3529 INIT_LIST_HEAD(&ugeth->group_hash_q); in ucc_geth_probe()
3530 INIT_LIST_HEAD(&ugeth->ind_hash_q); in ucc_geth_probe()
3534 /* Set the dev->base_addr to the gfar reg region */ in ucc_geth_probe()
3535 dev->base_addr = (unsigned long)(ug_info->uf_info.regs); in ucc_geth_probe()
3541 dev->netdev_ops = &ucc_geth_netdev_ops; in ucc_geth_probe()
3542 dev->watchdog_timeo = TX_TIMEOUT; in ucc_geth_probe()
3543 INIT_WORK(&ugeth->timeout_work, ucc_geth_timeout_work); in ucc_geth_probe()
3544 netif_napi_add(dev, &ugeth->napi, ucc_geth_poll); in ucc_geth_probe()
3545 dev->mtu = 1500; in ucc_geth_probe()
3546 dev->max_mtu = 1518; in ucc_geth_probe()
3548 ugeth->msg_enable = netif_msg_init(debug.msg_enable, UGETH_MSG_DEFAULT); in ucc_geth_probe()
3550 ugeth->phylink_config.dev = &dev->dev; in ucc_geth_probe()
3551 ugeth->phylink_config.type = PHYLINK_NETDEV; in ucc_geth_probe()
3553 ugeth->phylink_config.mac_capabilities = in ucc_geth_probe()
3557 ugeth->phylink_config.supported_interfaces); in ucc_geth_probe()
3559 ugeth->phylink_config.supported_interfaces); in ucc_geth_probe()
3561 ugeth->phylink_config.supported_interfaces); in ucc_geth_probe()
3562 phy_interface_set_rgmii(ugeth->phylink_config.supported_interfaces); in ucc_geth_probe()
3564 if (ug_info->tbi_node) { in ucc_geth_probe()
3566 ugeth->phylink_config.supported_interfaces); in ucc_geth_probe()
3568 ugeth->phylink_config.supported_interfaces); in ucc_geth_probe()
3570 ugeth->phylink_config.supported_interfaces); in ucc_geth_probe()
3573 phylink = phylink_create(&ugeth->phylink_config, dev_fwnode(&dev->dev), in ucc_geth_probe()
3580 ugeth->phylink = phylink; in ucc_geth_probe()
3582 err = devm_register_netdev(&ofdev->dev, dev); in ucc_geth_probe()
3586 dev->name); in ucc_geth_probe()
3591 if (err == -EPROBE_DEFER) in ucc_geth_probe()
3594 ugeth->ug_info = ug_info; in ucc_geth_probe()
3595 ugeth->dev = device; in ucc_geth_probe()
3596 ugeth->ndev = dev; in ucc_geth_probe()
3597 ugeth->node = np; in ucc_geth_probe()
3604 of_node_put(ug_info->tbi_node); in ucc_geth_probe()
3615 phylink_destroy(ugeth->phylink); in ucc_geth_remove()
3616 of_node_put(ugeth->ug_info->tbi_node); in ucc_geth_remove()