OpenWrt – Diff between revs 2 and 3

Subversion Repositories:
Rev:
Show entire fileIgnore whitespace
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