~ubuntu-branches/ubuntu/trusty/linux-armadaxp/trusty

« back to all changes in this revision

Viewing changes to arch/arm/plat-armada/mv_drivers_lsp/mv_neta/net_dev/mv_netdev.c

  • Committer: Package Import Robot
  • Author(s): Michael Casadevall, Bryan Wu, Dann Frazier, Michael Casadeall
  • Date: 2012-03-10 15:00:54 UTC
  • mfrom: (1.1.1)
  • Revision ID: package-import@ubuntu.com-20120310150054-flugb39zon8vvgwe
Tags: 3.2.0-1600.1
[ Bryan Wu ]
* UBUNTU: import debian/debian.env and debian.armadaxp

[ Dann Frazier ]
* ARM: Armada XP: remove trailing '/' in dirnames in mvRules.mk

[ Michael Casadeall ]
* tools: add some tools for Marvell Armada XP processor
* kernel: timer tick hacking from Marvell
* kernel: Sheeva Errata: add delay on Sheeva when powering down
* net: add Marvell NFP netfilter
* net: socket and skb modifications made by Marvell
* miscdevice: add minor IDs for some Marvell Armada drivers
* fs: introduce memory pool for splice()
* video: EDID detection updates from Marvell Armada XP patchset
* video: backlight: add Marvell Dove LCD backlight driver
* video: display: add THS8200 display driver
* video: framebuffer: add Marvell Dove and Armada XP processor onchip LCD controller driver
* usbtest: add Interrupt transfer testing by Marvell Armada XP code
* usb: ehci: add support for Marvell EHCI controler
* tty/serial: 8250: add support for Marvell Armada XP processor and DeviceTree work
* rtc: add support for Marvell Armada XP onchip RTC controller
* net: pppoe: add Marvell ethernet NFP hook in PPPoE networking driver
* mtd: nand: add support for Marvell Armada XP Nand Flash Controller
* mtd: maps: add Marvell Armada XP specific map driver
* mmc: add support for Marvell Armada XP MMC/SD host controller
* i2c: add support for Marvell Armada XP onchip i2c bus controller
* hwmon: add Kconfig option for Armada XP onchip thermal sensor driver
* dmaengine: add Net DMA support for splice and update Marvell XOR DMA engine driver
* ata: add support for Marvell Armada XP SATA controller and update some quirks
* ARM: add Marvell Armada XP machine to mach-types
* ARM: oprofile: add support for Marvell PJ4B core
* ARM: mm: more ARMv6 switches for Marvell Armada XP
* ARM: remove static declaration to allow compilation
* ARM: alignment access fault trick
* ARM: mm: skip some fault fixing when run on NONE SMP ARMv6 mode during early abort event
* ARM: mm: add Marvell Sheeva CPU Architecture for PJ4B
* ARM: introduce optimized copy operation for Marvell Armada XP
* ARM: SAUCE: hardware breakpoint trick for Marvell Armada XP
* ARM: big endian and little endian tricks for Marvell Armada XP
* ARM: SAUCE: Add Marvell Armada XP build rules to arch/arm/kernel/Makefile
* ARM: vfp: add special handling for Marvell Armada XP
* ARM: add support for Marvell U-Boot
* ARM: add mv_controller_num for ARM PCI drivers
* ARM: add support for local PMUs, general SMP tweaks and cache flushing
* ARM: add Marvell device identifies in glue-proc.h
* ARM: add IPC driver support for Marvell platforms
* ARM: add DMA mapping for Marvell platforms
* ARM: add Sheeva errata and PJ4B code for booting
* ARM: update Kconfig and Makefile to include Marvell Armada XP platforms
* ARM: Armada XP: import LSP from Marvell for Armada XP 3.2 kernel enablement

Show diffs side-by-side

added added

removed removed

Lines of Context:
36
36
#include <linux/mv_neta.h>
37
37
#include <net/ip.h>
38
38
#include <net/ipv6.h>
39
 
 
 
39
#include <linux/module.h>
40
40
#include "mvOs.h"
41
41
#include "mvDebug.h"
42
42
#include "dbg-trace.h"
73
73
 
74
74
void handle_group_affinity(int port);
75
75
void set_rxq_affinity(struct eth_port *pp, MV_U32 rxqAffinity, int group);
76
 
 
 
76
static inline int mv_eth_tx_policy(struct eth_port *pp, struct sk_buff *skb);
77
77
 
78
78
/* uncomment if you want to debug the SKB recycle feature */
79
79
/* #define ETH_SKB_DEBUG */
760
760
}
761
761
#endif /* CONFIG_MV_ETH_RX_SPECIAL */
762
762
 
 
763
static inline u16 mv_eth_select_txq(struct net_device *dev,
 
764
                                                                        struct sk_buff *skb)
 
765
{
 
766
        struct eth_port *pp = MV_ETH_PRIV(dev);
 
767
        return mv_eth_tx_policy(pp, skb);
 
768
}
 
769
 
763
770
static const struct net_device_ops mv_eth_netdev_ops = {
764
771
        .ndo_open = mv_eth_open,
765
772
        .ndo_stop = mv_eth_stop,
766
773
        .ndo_start_xmit = mv_eth_tx,
767
 
        .ndo_set_multicast_list = mv_eth_set_multicast_list,
 
774
        /*TODO - this is a hack by Seif M. need to fix this to properly move to linux 3.2!!!
 
775
        .ndo_set_multicast_list = mv_eth_set_multicast_list,*/
768
776
        .ndo_set_mac_address = mv_eth_set_mac_addr,
769
777
        .ndo_change_mtu = mv_eth_change_mtu,
770
778
        .ndo_tx_timeout = mv_eth_tx_timeout,
 
779
        .ndo_select_queue = mv_eth_select_txq,
771
780
};
772
781
 
773
782
#ifdef CONFIG_MV_ETH_SWITCH
1872
1881
 
1873
1882
                /* Move to next segment */
1874
1883
                frag_size = skb_frag_ptr->size;
1875
 
                frag_ptr = page_address(skb_frag_ptr->page) + skb_frag_ptr->page_offset;
 
1884
                frag_ptr = page_address(skb_frag_ptr->page.p) + skb_frag_ptr->page_offset;
1876
1885
                frag++;
1877
1886
        }
1878
1887
        totalDescNum = 0;
1934
1943
 
1935
1944
                                /* Move to next segment */
1936
1945
                                frag_size = skb_frag_ptr->size;
1937
 
                                frag_ptr = page_address(skb_frag_ptr->page) + skb_frag_ptr->page_offset;
 
1946
                                frag_ptr = page_address(skb_frag_ptr->page.p) + skb_frag_ptr->page_offset;
1938
1947
                                frag++;
1939
1948
                        }
1940
1949
                }               /* of while data_left > 0 */
2099
2108
                /* NETA_TX_BM_ENABLE_MASK = 0 */
2100
2109
                /* NETA_TX_PKT_OFFSET_MASK = 0 */
2101
2110
                tx_desc->dataSize = frag->size;
2102
 
                tx_desc->bufPhysAddr = mvOsCacheFlush(NULL, page_address(frag->page) + frag->page_offset,
 
2111
                tx_desc->bufPhysAddr = mvOsCacheFlush(NULL, page_address(frag->page.p) + frag->page_offset,
2103
2112
                                                      tx_desc->dataSize);
2104
2113
 
2105
2114
                if (i == (skb_shinfo(skb)->nr_frags - 1)) {
2781
2790
 
2782
2791
                        /* set this port to be in promiscuous mode. MAC filtering is performed by the Switch */
2783
2792
                        mv_eth_port_promisc_set(pp->port, queue);
 
2793
                        handle_group_affinity(port);
2784
2794
 
2785
2795
                        continue;
2786
2796
                }
2829
2839
#endif
2830
2840
 
2831
2841
        if (!mv_eth_initialized) {
2832
 
                mvSysNetaInit(port_mask, cpu_mask); /* init MAC Unit */
 
2842
                mvSysNetaInit(); /* init MAC Unit */
2833
2843
 
2834
2844
                mv_eth_ports_num = mvCtrlEthMaxPortGet();
2835
2845
                if (mv_eth_ports_num > CONFIG_MV_ETH_PORTS_NUM)
3033
3043
        struct net_device *dev;
3034
3044
        struct eth_dev_priv *dev_priv;
3035
3045
 
3036
 
        dev = alloc_etherdev(sizeof(struct eth_dev_priv));
 
3046
 
 
3047
        dev = alloc_etherdev_mq(sizeof(struct eth_dev_priv), CONFIG_MV_ETH_TXQ);
3037
3048
        if (!dev)
3038
3049
                return NULL;
3039
3050
 
3099
3110
        pp->tx_done_timer.data = (unsigned long)dev;
3100
3111
        pp->cleanup_timer.data = (unsigned long)dev;
3101
3112
 
3102
 
        mv_eth_netdev_set_features(dev);
3103
 
 
3104
3113
        if (pp->flags & MV_ETH_F_CONNECT_LINUX) {
3105
3114
                if (register_netdev(dev)) {
3106
3115
                        printk(KERN_ERR "failed to register %s\n", dev->name);
3107
3116
                        free_netdev(dev);
3108
3117
                        return NULL;
3109
3118
                } else {
 
3119
                        mv_eth_netdev_set_features(dev);
 
3120
 
3110
3121
                        printk(KERN_ERR "    o %s, ifindex = %d, GbE port = %d", dev->name, dev->ifindex, pp->port);
3111
3122
#ifdef CONFIG_MV_ETH_SWITCH
3112
3123
                        if (!(pp->flags & MV_ETH_F_SWITCH))
3858
3869
                                err = -ENOMEM;
3859
3870
                                goto out;
3860
3871
                        }
 
3872
                        mvNetaBmPoolBufSizeSet(pp->port, pp->pool_short->pool, RX_BUF_SIZE(pp->pool_short->pkt_size));
 
3873
                } else {
 
3874
                        int dummy_short_pool = (pp->pool_short->pool + 1) % MV_BM_POOLS;
 
3875
 
 
3876
                        /* To disable short pool we choose unused pool and set pkt size to 0 (buffer size = pkt offset) */
 
3877
                        mvNetaBmPoolBufSizeSet(pp->port, dummy_short_pool, NET_SKB_PAD);
3861
3878
                }
3862
 
                mvNetaBmPoolBufSizeSet(pp->port, pp->pool_short->pool, RX_BUF_SIZE(pp->pool_short->pkt_size));
3863
3879
        }
3864
3880
#endif /* CONFIG_MV_ETH_BM_CPU */
3865
3881
 
3883
3899
 
3884
3900
#if defined(CONFIG_MV_ETH_BM_CPU)
3885
3901
                /* Enable / Disable - BM support */
3886
 
                mvNetaRxqBmEnable(pp->port, rxq, pp->pool_short->pool, pp->pool_long->pool);
 
3902
                if (pp->pool_short->pool == pp->pool_long->pool) {
 
3903
                        int dummy_short_pool = (pp->pool_short->pool + 1) % MV_BM_POOLS;
 
3904
 
 
3905
                        /* To disable short pool we choose unused pool and set pkt size to 0 (buffer size = pkt offset) */
 
3906
                        mvNetaRxqBmEnable(pp->port, rxq, dummy_short_pool, pp->pool_long->pool);
 
3907
                } else
 
3908
                        mvNetaRxqBmEnable(pp->port, rxq, pp->pool_short->pool, pp->pool_long->pool);
3887
3909
#else
3888
3910
                /* Fill RXQ with buffers from RX pool */
3889
3911
                mvNetaRxqBufSizeSet(pp->port, rxq, RX_BUF_SIZE(pkt_size));
4030
4052
int mv_eth_check_mtu_valid(struct net_device *dev, int mtu)
4031
4053
{
4032
4054
        if (mtu < 68) {
4033
 
                printk(KERN_INFO "MTU must be at least 64, change mtu failed\n");
 
4055
                printk(KERN_INFO "MTU must be at least 68, change mtu failed\n");
4034
4056
                return -EINVAL;
4035
4057
        }
4036
4058
        if (mtu > 9676 /* 9700 - 20 and rounding to 8 */) {
4276
4298
        else
4277
4299
                mvOsPrintf("%s: PNC control is disabled\n", __func__);
4278
4300
#else /* Legacy parser */
 
4301
        status = mvNetaVprioToRxqSet(port, prio, rxq);
4279
4302
#endif /* CONFIG_MV_ETH_PNC */
4280
4303
 
4281
4304
        return status;
4324
4347
        int cpu, i;
4325
4348
        u8      *ext_buf;
4326
4349
 
4327
 
        TRC_INIT(0, 0, 0, 0);
4328
 
        TRC_START();
4329
 
 
4330
4350
        memset(pp, 0, sizeof(struct eth_port));
4331
4351
 
4332
4352
        pp->port = port;
4652
4672
        int i;
4653
4673
#endif
4654
4674
 
4655
 
        TRC_OUTPUT();
4656
4675
 
4657
4676
        if (pp == NULL) {
4658
4677
                printk(KERN_ERR "eth_stats_print: wrong port number %d\n", port);