OpenWrt – Diff between revs 2 and 3
?pathlinks?
Rev 2 | Rev 3 | |||
---|---|---|---|---|
Line 323... | Line 323... | |||
323 | temp = (cmd << MDIO_VALUE_OFFSET); |
323 | temp = (cmd << MDIO_VALUE_OFFSET); |
|
324 | temp |= MDIO_WRITE_COMMAND; |
324 | temp |= MDIO_WRITE_COMMAND; |
|
325 | } else { |
325 | } else { |
|
326 | temp = MDIO_READ_COMMAND; |
326 | temp = MDIO_READ_COMMAND; |
|
327 | } |
327 | } |
|
328 | |
- | ||
329 | temp |= ((location & 0x1f) << MDIO_REG_OFFSET); |
328 | temp |= ((location & 0x1f) << MDIO_REG_OFFSET); |
|
330 | temp |= (phy_id & 0x1f); |
329 | temp |= (phy_id & 0x1f); |
|
Line 331... | Line 330... | |||
331 | |
330 | |
|
Line 336... | Line 335... | |||
336 | udelay(1); |
335 | udelay(1); |
|
337 | cycles++; |
336 | cycles++; |
|
338 | } |
337 | } |
|
Line 339... | Line 338... | |||
339 | |
338 | |
|
340 | if (cycles == 5000) { |
339 | if (cycles == 5000) { |
|
- | 340 | printk(KERN_ERR "%s #%i: MII transaction failed\n", bus->name, |
||
341 | printk(KERN_ERR "%s #%i: MII transaction failed\n", bus->name, phy_id); |
341 | phy_id); |
|
342 | return -1; |
342 | return -1; |
|
Line 343... | Line 343... | |||
343 | } |
343 | } |
|
344 | |
344 | |
|
Line 361... | Line 361... | |||
361 | ret = cns3xxx_mdio_cmd(bus, phy_id, location, 0, 0); |
361 | ret = cns3xxx_mdio_cmd(bus, phy_id, location, 0, 0); |
|
362 | spin_unlock_irqrestore(&mdio_lock, flags); |
362 | spin_unlock_irqrestore(&mdio_lock, flags); |
|
363 | return ret; |
363 | return ret; |
|
364 | } |
364 | } |
|
Line 365... | Line 365... | |||
365 | |
365 | |
|
- | 366 | static int cns3xxx_mdio_write(struct mii_bus *bus, int phy_id, int location, |
||
366 | static int cns3xxx_mdio_write(struct mii_bus *bus, int phy_id, int location, u16 val) |
367 | u16 val) |
|
367 | { |
368 | { |
|
368 | unsigned long flags; |
369 | unsigned long flags; |
|
Line 369... | Line 370... | |||
369 | int ret; |
370 | int ret; |
|
Line 389... | Line 390... | |||
389 | mdio_bus->write = &cns3xxx_mdio_write; |
390 | mdio_bus->write = &cns3xxx_mdio_write; |
|
390 | strcpy(mdio_bus->id, "0"); |
391 | strcpy(mdio_bus->id, "0"); |
|
Line 391... | Line 392... | |||
391 | |
392 | |
|
392 | if ((err = mdiobus_register(mdio_bus))) |
393 | if ((err = mdiobus_register(mdio_bus))) |
|
393 | mdiobus_free(mdio_bus); |
- | ||
394 | |
394 | mdiobus_free(mdio_bus); |
|
395 | return err; |
395 | return err; |
|
Line 396... | Line 396... | |||
396 | } |
396 | } |
|
397 | |
397 | |
|
Line 535... | Line 535... | |||
535 | wmb(); |
535 | wmb(); |
|
Line 536... | Line 536... | |||
536 | |
536 | |
|
537 | /* put the new buffer on RX-free queue */ |
537 | /* put the new buffer on RX-free queue */ |
|
538 | rx_ring->buff_tab[i] = buf; |
538 | rx_ring->buff_tab[i] = buf; |
|
539 | rx_ring->phys_tab[i] = phys; |
- | ||
540 | |
539 | rx_ring->phys_tab[i] = phys; |
|
541 | if (i == RX_DESCS - 1) { |
- | ||
542 | desc->config0 = FIRST_SEGMENT | LAST_SEGMENT | RX_SEGMENT_MRU | END_OF_RING; |
540 | if (i == RX_DESCS - 1) { |
|
- | 541 | i = 0; |
||
- | 542 | desc->config0 = END_OF_RING | FIRST_SEGMENT | |
||
543 | i = 0; |
543 | LAST_SEGMENT | RX_SEGMENT_MRU; |
|
544 | desc = &(rx_ring)->desc[i]; |
544 | desc = &(rx_ring)->desc[i]; |
|
545 | } else { |
545 | } else { |
|
- | 546 | desc->config0 = FIRST_SEGMENT | LAST_SEGMENT | |
||
546 | desc->config0 = FIRST_SEGMENT | LAST_SEGMENT | RX_SEGMENT_MRU; |
547 | RX_SEGMENT_MRU; |
|
547 | i++; |
548 | i++; |
|
548 | desc++; |
549 | desc++; |
|
549 | } |
550 | } |
|
Line 563... | Line 564... | |||
563 | |
564 | |
|
564 | if (tx_ring->stopped == stop) |
565 | if (tx_ring->stopped == stop) |
|
Line 565... | Line 566... | |||
565 | return; |
566 | return; |
|
566 | |
- | ||
567 | tx_ring->stopped = stop; |
567 | |
|
568 | |
568 | tx_ring->stopped = stop; |
|
569 | for (i = 0; i < 4; i++) { |
569 | for (i = 0; i < 4; i++) { |
|
Line 570... | Line 570... | |||
570 | struct port *port = switch_port_tab[i]; |
570 | struct port *port = switch_port_tab[i]; |
|
571 | struct net_device *dev; |
571 | struct net_device *dev; |
|
Line 572... | Line 572... | |||
572 | |
572 | |
|
573 | if (!port) |
- | ||
574 | continue; |
573 | if (!port) |
|
575 | |
574 | continue; |
|
576 | dev = port->netdev; |
575 | |
|
577 | |
576 | dev = port->netdev; |
|
578 | if (stop) |
577 | if (stop) |
|
Line 591... | Line 590... | |||
591 | int num_used = tx_ring->num_used; |
590 | int num_used = tx_ring->num_used; |
|
592 | struct sk_buff *skb; |
591 | struct sk_buff *skb; |
|
Line 593... | Line 592... | |||
593 | |
592 | |
|
594 | index = tx_ring->free_index; |
593 | index = tx_ring->free_index; |
|
595 | desc = &(tx_ring)->desc[index]; |
- | ||
596 | |
594 | desc = &(tx_ring)->desc[index]; |
|
597 | for (i = 0; i < num_used; i++) { |
595 | for (i = 0; i < num_used; i++) { |
|
598 | if (!desc->cown) |
- | ||
599 | break; |
- | ||
600 | |
596 | if (desc->cown) { |
|
601 | skb = tx_ring->buff_tab[index]; |
597 | skb = tx_ring->buff_tab[index]; |
|
602 | tx_ring->buff_tab[index] = 0; |
- | ||
603 | |
598 | tx_ring->buff_tab[index] = 0; |
|
604 | if (skb) |
599 | if (skb) |
|
605 | dev_kfree_skb_any(skb); |
- | ||
606 | |
600 | dev_kfree_skb_any(skb); |
|
607 | dma_unmap_single(sw->dev, tx_ring->phys_tab[index], desc->sdl, DMA_TO_DEVICE); |
- | ||
- | 601 | dma_unmap_single(sw->dev, tx_ring->phys_tab[index], |
||
608 | |
602 | desc->sdl, DMA_TO_DEVICE); |
|
609 | if (index == TX_DESCS - 1) { |
603 | if (++index == TX_DESCS) { |
|
610 | index = 0; |
604 | index = 0; |
|
- | 605 | desc = &(tx_ring)->desc[index]; |
||
- | 606 | } else { |
||
- | 607 | desc++; |
||
611 | desc = &(tx_ring)->desc[index]; |
608 | } |
|
612 | } else { |
609 | } else { |
|
613 | index++; |
- | ||
614 | desc++; |
610 | break; |
|
615 | } |
611 | } |
|
616 | } |
- | ||
617 | |
612 | } |
|
618 | tx_ring->free_index = index; |
613 | tx_ring->free_index = index; |
|
619 | tx_ring->num_used -= i; |
614 | tx_ring->num_used -= i; |
|
620 | eth_check_num_used(tx_ring); |
615 | eth_check_num_used(tx_ring); |
|
Line 636... | Line 631... | |||
636 | |
631 | |
|
637 | if (received >= budget) |
632 | if (received >= budget) |
|
Line 638... | Line 633... | |||
638 | break; |
633 | break; |
|
639 | |
634 | |
|
- | 635 | /* process received frame */ |
||
Line 640... | Line 636... | |||
640 | /* process received frame */ |
636 | dma_unmap_single(sw->dev, rx_ring->phys_tab[i], |
|
641 | dma_unmap_single(sw->dev, rx_ring->phys_tab[i], RX_SEGMENT_MRU, DMA_FROM_DEVICE); |
637 | RX_SEGMENT_MRU, DMA_FROM_DEVICE); |
|
642 | |
638 | |
|
Line 705... | Line 701... | |||
705 | sw->frag_first = NULL; |
701 | sw->frag_first = NULL; |
|
706 | sw->frag_last = NULL; |
702 | sw->frag_last = NULL; |
|
707 | } |
703 | } |
|
Line 708... | Line 704... | |||
708 | |
704 | |
|
709 | received++; |
705 | received++; |
|
710 | if (i == RX_DESCS - 1) { |
706 | if (++i == RX_DESCS) { |
|
711 | i = 0; |
707 | i = 0; |
|
712 | desc = &(rx_ring)->desc[i]; |
708 | desc = &(rx_ring)->desc[i]; |
|
713 | } else { |
- | ||
714 | i++; |
709 | } else { |
|
715 | desc++; |
710 | desc++; |
|
716 | } |
711 | } |
|
Line 717... | Line 712... | |||
717 | } |
712 | } |
|
Line 744... | Line 739... | |||
744 | tx_desc->sdp = phys; |
739 | tx_desc->sdp = phys; |
|
745 | tx_desc->pmap = pmap; |
740 | tx_desc->pmap = pmap; |
|
746 | tx_ring->phys_tab[index] = phys; |
741 | tx_ring->phys_tab[index] = phys; |
|
Line 747... | Line 742... | |||
747 | |
742 | |
|
748 | config0 |= len; |
- | ||
749 | |
743 | config0 |= len; |
|
750 | if (index == TX_DESCS - 1) |
744 | if (index == TX_DESCS - 1) |
|
751 | config0 |= END_OF_RING; |
- | ||
752 | |
745 | config0 |= END_OF_RING; |
|
753 | if (index == index_last) |
746 | if (index == index_last) |
|
Line 754... | Line 747... | |||
754 | config0 |= LAST_SEGMENT; |
747 | config0 |= LAST_SEGMENT; |
|
755 | |
748 | |
|
Line 766... | Line 759... | |||
766 | char pmap = (1 << port->id); |
759 | char pmap = (1 << port->id); |
|
767 | int nr_frags = skb_shinfo(skb)->nr_frags; |
760 | int nr_frags = skb_shinfo(skb)->nr_frags; |
|
768 | int nr_desc = nr_frags; |
761 | int nr_desc = nr_frags; |
|
769 | int index0, index, index_last; |
762 | int index0, index, index_last; |
|
770 | int len0; |
763 | int len0; |
|
771 | int i; |
764 | unsigned int i; |
|
772 | u32 config0; |
765 | u32 config0; |
|
Line 773... | Line 766... | |||
773 | |
766 | |
|
774 | if (pmap == 8) |
767 | if (pmap == 8) |
|
Line 775... | Line 768... | |||
775 | pmap = (1 << 4); |
768 | pmap = (1 << 4); |
|
776 | |
769 | |
|
Line 777... | Line 770... | |||
777 | skb_walk_frags(skb, skb1) |
770 | skb_walk_frags(skb, skb1) |
|
778 | nr_desc++; |
771 | nr_desc++; |
|
779 | |
- | ||
780 | eth_schedule_poll(sw); |
772 | |
|
781 | spin_lock_bh(&tx_lock); |
773 | eth_schedule_poll(sw); |
|
782 | |
774 | spin_lock_bh(&tx_lock); |
|
783 | if ((tx_ring->num_used + nr_desc + 1) >= TX_DESCS) { |
775 | if ((tx_ring->num_used + nr_desc + 1) >= TX_DESCS) { |
|
Line 881... | Line 873... | |||
881 | |
873 | |
|
882 | __raw_writel(0, &sw->regs->fs_dma_ctrl0); |
874 | __raw_writel(0, &sw->regs->fs_dma_ctrl0); |
|
883 | __raw_writel(TS_SUSPEND | FS_SUSPEND, &sw->regs->dma_auto_poll_cfg); |
875 | __raw_writel(TS_SUSPEND | FS_SUSPEND, &sw->regs->dma_auto_poll_cfg); |
|
884 | __raw_writel(QUEUE_THRESHOLD, &sw->regs->dma_ring_ctrl); |
876 | __raw_writel(QUEUE_THRESHOLD, &sw->regs->dma_ring_ctrl); |
|
- | 877 | __raw_writel(CLR_FS_STATE | QUEUE_THRESHOLD, &sw->regs->dma_ring_ctrl); |
||
885 | __raw_writel(CLR_FS_STATE | QUEUE_THRESHOLD, &sw->regs->dma_ring_ctrl); |
878 | |
|
Line 886... | Line 879... | |||
886 | __raw_writel(QUEUE_THRESHOLD, &sw->regs->dma_ring_ctrl); |
879 | __raw_writel(QUEUE_THRESHOLD, &sw->regs->dma_ring_ctrl); |
|
887 | |
880 | |
|
888 | rx_ring->desc = dmam_alloc_coherent(sw->dev, RX_POOL_ALLOC_SIZE, |
881 | rx_ring->desc = dmam_alloc_coherent(sw->dev, RX_POOL_ALLOC_SIZE, |
|
889 | &rx_ring->phys_addr, GFP_KERNEL); |
882 | &rx_ring->phys_addr, GFP_KERNEL); |
|
Line 890... | Line 883... | |||
890 | if (!rx_ring->desc) |
883 | if (!rx_ring->desc) |
|
891 | return -ENOMEM; |
884 | return -ENOMEM; |
|
892 | |
- | ||
893 | /* Setup RX buffers */ |
885 | |
|
894 | memset(rx_ring->desc, 0, RX_POOL_ALLOC_SIZE); |
886 | /* Setup RX buffers */ |
|
895 | |
887 | memset(rx_ring->desc, 0, RX_POOL_ALLOC_SIZE); |
|
Line 896... | Line 888... | |||
896 | for (i = 0; i < RX_DESCS; i++) { |
888 | for (i = 0; i < RX_DESCS; i++) { |
|
897 | struct rx_desc *desc = &(rx_ring)->desc[i]; |
889 | struct rx_desc *desc = &(rx_ring)->desc[i]; |
|
898 | void *buf; |
890 | void *buf; |
|
Line 899... | Line 891... | |||
899 | |
891 | |
|
900 | buf = netdev_alloc_frag(RX_SEGMENT_ALLOC_SIZE); |
- | ||
901 | if (!buf) |
892 | buf = netdev_alloc_frag(RX_SEGMENT_ALLOC_SIZE); |
|
902 | return -ENOMEM; |
893 | if (!buf) |
|
903 | |
- | ||
904 | desc->sdl = RX_SEGMENT_MRU; |
894 | return -ENOMEM; |
|
905 | |
895 | |
|
Line 906... | Line 896... | |||
906 | if (i == (RX_DESCS - 1)) |
896 | desc->sdl = RX_SEGMENT_MRU; |
|
907 | desc->eor = 1; |
897 | if (i == (RX_DESCS - 1)) |
|
908 | |
- | ||
909 | desc->fsd = 1; |
898 | desc->eor = 1; |
|
910 | desc->lsd = 1; |
899 | desc->fsd = 1; |
|
Line 911... | Line 900... | |||
911 | |
900 | desc->lsd = 1; |
|
912 | desc->sdp = dma_map_single(sw->dev, buf + SKB_HEAD_ALIGN, |
901 | |
|
Line 927... | Line 916... | |||
927 | if (!tx_ring->desc) |
916 | if (!tx_ring->desc) |
|
928 | return -ENOMEM; |
917 | return -ENOMEM; |
|
Line 929... | Line 918... | |||
929 | |
918 | |
|
930 | /* Setup TX buffers */ |
919 | /* Setup TX buffers */ |
|
931 | memset(tx_ring->desc, 0, TX_POOL_ALLOC_SIZE); |
- | ||
932 | |
920 | memset(tx_ring->desc, 0, TX_POOL_ALLOC_SIZE); |
|
933 | for (i = 0; i < TX_DESCS; i++) { |
921 | for (i = 0; i < TX_DESCS; i++) { |
|
934 | struct tx_desc *desc = &(tx_ring)->desc[i]; |
922 | struct tx_desc *desc = &(tx_ring)->desc[i]; |
|
Line 935... | Line 923... | |||
935 | tx_ring->buff_tab[i] = 0; |
923 | tx_ring->buff_tab[i] = 0; |
|
936 | |
924 | |
|
937 | if (i == (TX_DESCS - 1)) |
- | ||
938 | desc->eor = 1; |
925 | if (i == (TX_DESCS - 1)) |
|
939 | |
926 | desc->eor = 1; |
|
940 | desc->cown = 1; |
927 | desc->cown = 1; |
|
941 | } |
928 | } |
|
Line 955... | Line 942... | |||
955 | void *buf = sw->rx_ring.buff_tab[i]; |
942 | void *buf = sw->rx_ring.buff_tab[i]; |
|
Line 956... | Line 943... | |||
956 | |
943 | |
|
957 | if (!buf) |
944 | if (!buf) |
|
Line 958... | Line 945... | |||
958 | continue; |
945 | continue; |
|
- | 946 | |
||
959 | |
947 | dma_unmap_single(sw->dev, desc->sdp, RX_SEGMENT_MRU, |
|
960 | dma_unmap_single(sw->dev, desc->sdp, RX_SEGMENT_MRU, DMA_FROM_DEVICE); |
948 | DMA_FROM_DEVICE); |
|
Line 961... | Line 949... | |||
961 | skb_free_frag(buf); |
949 | skb_free_frag(buf); |
|
962 | } |
950 | } |
|
Line 1122... | Line 1110... | |||
1122 | cycles++; |
1110 | cycles++; |
|
1123 | } |
1111 | } |
|
1124 | return 0; |
1112 | return 0; |
|
1125 | } |
1113 | } |
|
Line -... | Line 1114... | |||
- | 1114 | |
||
- | 1115 | static int cns3xxx_change_mtu(struct net_device *dev, int new_mtu) |
||
- | 1116 | { |
||
- | 1117 | if (new_mtu > MAX_MTU) |
||
- | 1118 | return -EINVAL; |
||
- | 1119 | |
||
- | 1120 | dev->mtu = new_mtu; |
||
- | 1121 | return 0; |
||
- | 1122 | } |
||
1126 | |
1123 | |
|
1127 | static const struct net_device_ops cns3xxx_netdev_ops = { |
1124 | static const struct net_device_ops cns3xxx_netdev_ops = { |
|
1128 | .ndo_open = eth_open, |
1125 | .ndo_open = eth_open, |
|
1129 | .ndo_stop = eth_close, |
1126 | .ndo_stop = eth_close, |
|
1130 | .ndo_start_xmit = eth_xmit, |
1127 | .ndo_start_xmit = eth_xmit, |
|
1131 | .ndo_set_rx_mode = eth_rx_mode, |
1128 | .ndo_set_rx_mode = eth_rx_mode, |
|
- | 1129 | .ndo_do_ioctl = eth_ioctl, |
||
1132 | .ndo_do_ioctl = eth_ioctl, |
1130 | .ndo_change_mtu = cns3xxx_change_mtu, |
|
1133 | .ndo_set_mac_address = eth_set_mac, |
1131 | .ndo_set_mac_address = eth_set_mac, |
|
1134 | .ndo_validate_addr = eth_validate_addr, |
1132 | .ndo_validate_addr = eth_validate_addr, |
|
Line 1135... | Line 1133... | |||
1135 | }; |
1133 | }; |
|
Line 1224... | Line 1222... | |||
1224 | |
1222 | |
|
1225 | SET_NETDEV_DEV(dev, &pdev->dev); |
1223 | SET_NETDEV_DEV(dev, &pdev->dev); |
|
1226 | dev->netdev_ops = &cns3xxx_netdev_ops; |
1224 | dev->netdev_ops = &cns3xxx_netdev_ops; |
|
1227 | dev->ethtool_ops = &cns3xxx_ethtool_ops; |
1225 | dev->ethtool_ops = &cns3xxx_ethtool_ops; |
|
1228 | dev->tx_queue_len = 1000; |
- | ||
1229 | dev->max_mtu = MAX_MTU; |
1226 | dev->tx_queue_len = 1000; |
|
Line 1230... | Line 1227... | |||
1230 | dev->features = NETIF_F_IP_CSUM | NETIF_F_SG | NETIF_F_FRAGLIST; |
1227 | dev->features = NETIF_F_IP_CSUM | NETIF_F_SG | NETIF_F_FRAGLIST; |
|
1231 | |
1228 | |