Changeset 27297


Ignore:
Timestamp:
2011-06-28T08:54:20+02:00 (7 years ago)
Author:
kaloz
Message:

[cns3xxx]: ethernet cleanup and sata fix - thanks, Chris

Location:
trunk/target/linux/cns3xxx
Files:
1 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/cns3xxx/config-default

    r27030 r27297  
    1313CONFIG_ARM_GIC=y 
    1414CONFIG_ARM_L1_CACHE_SHIFT=5 
    15 # CONFIG_ARM_PATCH_PHYS_VIRT is not set 
    1615CONFIG_ARM_THUMB=y 
    1716CONFIG_ATA=y 
    1817# CONFIG_ATA_SFF is not set 
     18CONFIG_ATA_VERBOSE_ERROR=y 
    1919CONFIG_BLK_DEV_RAM=y 
    2020CONFIG_BLK_DEV_RAM_COUNT=2 
     
    4848CONFIG_FRAME_POINTER=y 
    4949# CONFIG_FSNOTIFY is not set 
    50 # CONFIG_FTMAC100 is not set 
    5150CONFIG_GENERIC_ATOMIC64=y 
    5251CONFIG_GENERIC_CLOCKEVENTS=y 
     
    102101CONFIG_MACH_CNS3420VB=y 
    103102CONFIG_MACH_GW2388=y 
    104 # CONFIG_MFD_MAX8997 is not set 
    105103CONFIG_MIGHT_HAVE_PCI=y 
    106104CONFIG_MMC=y 
     
    135133CONFIG_RTC_DRV_DS1672=y 
    136134CONFIG_SATA_AHCI=y 
     135CONFIG_SATA_AHCI_CNS3XXX=y 
    137136CONFIG_SATA_AHCI_PLATFORM=y 
    138137CONFIG_SCSI=y 
  • trunk/target/linux/cns3xxx/patches/051-cns3xxx_gigabit.patch

    r27030 r27297  
    2828--- /dev/null 
    2929+++ b/drivers/net/cns3xxx_eth.c 
    30 @@ -0,0 +1,1233 @@ 
     30@@ -0,0 +1,1269 @@ 
    3131+/* 
    3232+ * Cavium CNS3xxx Gigabit driver for Linux 
     
    5252+#include <mach/hardware.h> 
    5353+ 
    54 +#define DRV_NAME               "cns3xxx_eth" 
    55 + 
    56 +#define RX_DESCS               512 
    57 +#define TX_DESCS               512 
    58 +#define SKB_DMA_REALIGN   ((PAGE_SIZE - NET_SKB_PAD) % SMP_CACHE_BYTES) 
     54+#define DRV_NAME "cns3xxx_eth" 
     55+ 
     56+#define RX_DESCS 512 
     57+#define TX_DESCS 512 
     58+#define SKB_DMA_REALIGN ((PAGE_SIZE - NET_SKB_PAD) % SMP_CACHE_BYTES) 
    5959+ 
    6060+#define RX_POOL_ALLOC_SIZE (sizeof(struct rx_desc) * RX_DESCS) 
    6161+#define TX_POOL_ALLOC_SIZE (sizeof(struct tx_desc) * TX_DESCS) 
    62 +#define REGS_SIZE              0x150 
    63 +#define MAX_MRU                        9500 
    64 + 
    65 +#define NAPI_WEIGHT            64 
     62+#define REGS_SIZE 336 
     63+#define MAX_MRU        9500 
     64+ 
     65+#define NAPI_WEIGHT 64 
     66+ 
     67+/* MDIO Defines */ 
     68+#define MDIO_CMD_COMPLETE 0x00008000 
     69+#define MDIO_WRITE_COMMAND 0x00002000 
     70+#define MDIO_READ_COMMAND 0x00004000 
     71+#define MDIO_REG_OFFSET 8 
     72+#define MDIO_VALUE_OFFSET 16 
     73+ 
     74+/* Descritor Defines */ 
     75+#define END_OF_RING 0x40000000 
     76+#define FIRST_SEGMENT 0x20000000 
     77+#define LAST_SEGMENT 0x10000000 
     78+#define FORCE_ROUTE 0x04000000 
     79+#define IP_CHECKSUM 0x00040000 
     80+#define UDP_CHECKSUM 0x00020000 
     81+#define TCP_CHECKSUM 0x00010000 
    6682+ 
    6783+/* Port Config Defines */ 
    68 +#define PORT_DISABLE (1 << 18) 
     84+#define PORT_DISABLE 0x00040000 
     85+#define PROMISC_OFFSET 29 
     86+ 
     87+/* Global Config Defines */ 
     88+#define UNKNOWN_VLAN_TO_CPU 0x02000000 
     89+#define ACCEPT_CRC_PACKET 0x00200000 
     90+#define CRC_STRIPPING 0x00100000 
     91+ 
     92+/* VLAN Config Defines */ 
     93+#define NIC_MODE 0x00008000 
     94+#define VLAN_UNAWARE 0x00000001 
    6995+ 
    7096+/* DMA AUTO Poll Defines */ 
    71 +#define TS_POLL_EN (1 << 5) 
    72 +#define TS_SUSPEND (1 << 4) 
    73 +#define FS_POLL_EN (1 << 1) 
    74 +#define FS_SUSPEND (1 << 0) 
     97+#define TS_POLL_EN 0x00000020 
     98+#define TS_SUSPEND 0x00000010 
     99+#define FS_POLL_EN 0x00000002 
     100+#define FS_SUSPEND 0x00000001 
     101+ 
     102+/* DMA Ring Control Defines */ 
     103+#define QUEUE_THRESHOLD 0x000000f0 
     104+#define CLR_FS_STATE 0x80000000 
    75105+ 
    76106+struct tx_desc 
    77107+{ 
    78 +       u32 sdp; // segment data pointer 
     108+       u32 sdp; /* segment data pointer */ 
    79109+ 
    80110+       union { 
    81111+               struct { 
    82 +                       u32 sdl:16; // segment data length 
     112+                       u32 sdl:16; /* segment data length */ 
    83113+                       u32 tco:1; 
    84114+                       u32 uco:1; 
    85115+                       u32 ico:1; 
    86 +                       u32 rsv_1:3; // reserve 
     116+                       u32 rsv_1:3; /* reserve */ 
    87117+                       u32 pri:3; 
    88 +                       u32 fp:1; // force priority 
     118+                       u32 fp:1; /* force priority */ 
    89119+                       u32 fr:1; 
    90120+                       u32 interrupt:1; 
     
    126156+       }; 
    127157+ 
    128 +       u8 alignment[16]; // for alignment 32 byte 
     158+       u8 alignment[16]; /* for 32 byte */ 
    129159+}; 
    130160+ 
    131161+struct rx_desc 
    132162+{ 
    133 +       u32 sdp; // segment data pointer 
     163+       u32 sdp; /* segment data pointer */ 
    134164+ 
    135165+       union { 
    136166+               struct { 
    137 +                       u32 sdl:16; // segment data length 
     167+                       u32 sdl:16; /* segment data length */ 
    138168+                       u32 l4f:1; 
    139169+                       u32 ipf:1; 
     
    180210+       }; 
    181211+ 
    182 +       u8 alignment[16]; // for alignment 32 byte 
     212+       u8 alignment[16]; /* for 32 byte alignment */ 
    183213+}; 
    184214+ 
    185215+ 
    186216+struct switch_regs { 
    187 +       u32 phy_control;                /* 000 */ 
     217+       u32 phy_control; 
    188218+       u32 phy_auto_addr; 
    189219+       u32 mac_glob_cfg; 
     
    290320+ 
    291321+       temp = __raw_readl(&mdio_regs->phy_control); 
    292 +       temp |= (1 << 15);  /* Clear Command Complete bit */ 
     322+       temp |= MDIO_CMD_COMPLETE; 
    293323+       __raw_writel(temp, &mdio_regs->phy_control); 
    294324+       udelay(10); 
    295325+ 
    296326+       if (write) { 
    297 +               temp = (cmd << 16); 
    298 +               temp |= (1 << 13);      /* Write Command */ 
     327+               temp = (cmd << MDIO_VALUE_OFFSET); 
     328+               temp |= MDIO_WRITE_COMMAND; 
    299329+       } else { 
    300 +               temp = (1 << 14);  /* Read Command */ 
    301 +       } 
    302 +       temp |= ((location & 0x1f) << 8); 
     330+               temp = MDIO_READ_COMMAND; 
     331+       } 
     332+       temp |= ((location & 0x1f) << MDIO_REG_OFFSET); 
    303333+       temp |= (phy_id & 0x1f); 
    304334+ 
    305335+       __raw_writel(temp, &mdio_regs->phy_control); 
    306336+ 
    307 +       while (((__raw_readl(&mdio_regs->phy_control) & 0x8000) == 0) 
     337+       while (((__raw_readl(&mdio_regs->phy_control) & MDIO_CMD_COMPLETE) == 0) 
    308338+                       && cycles < 5000) { 
    309339+               udelay(1); 
     
    318348+ 
    319349+       temp = __raw_readl(&mdio_regs->phy_control); 
    320 +       temp |= (1 << 15);  /* Clear Command Complete bit */ 
     350+       temp |= MDIO_CMD_COMPLETE; 
    321351+       __raw_writel(temp, &mdio_regs->phy_control); 
    322352+ 
     
    324354+               return 0; 
    325355+ 
    326 +       return ((temp >> 16) & 0xFFFF); 
     356+       return ((temp >> MDIO_VALUE_OFFSET) & 0xFFFF); 
    327357+} 
    328358+ 
     
    431461+                                   mtu, DMA_FROM_DEVICE); 
    432462+                       if (dma_mapping_error(NULL, desc->sdp)) { 
    433 +                               printk("failed to map\n"); 
    434463+                               dev_kfree_skb(skb); 
    435464+                               /* Failed to map, better luck next time */ 
     
    437466+                       } 
    438467+               } else { 
    439 +                       printk("failed to alloc\n"); 
    440468+                       /* Failed to allocate skb, try again next time */ 
    441469+                       goto out; 
     
    447475+               if (++i == RX_DESCS) { 
    448476+                       i = 0; 
    449 +                       desc->config0 = 0x70000000 | mtu; 
     477+                       desc->config0 = END_OF_RING | FIRST_SEGMENT | 
     478+                                       LAST_SEGMENT | mtu; 
    450479+               } else { 
    451 +                       desc->config0 = 0x30000000 | mtu; 
     480+                       desc->config0 = FIRST_SEGMENT | LAST_SEGMENT | mtu; 
    452481+               } 
    453482+       } 
     
    556585+               next_desc = &(rx_ring)->desc[i]; 
    557586+               prefetch(next_desc); 
    558 +               prefetch(next_desc + 4); 
    559 +               prefetch(next_desc + 8); 
    560587+ 
    561588+               port_id = desc->sp; 
     
    667694+ 
    668695+       if (index == TX_DESCS - 1) { 
    669 +               tx_desc->config0 = 0x74070000 | len; 
     696+               tx_desc->config0 = END_OF_RING | FIRST_SEGMENT | LAST_SEGMENT | 
     697+                                  FORCE_ROUTE | IP_CHECKSUM | UDP_CHECKSUM | 
     698+                                  TCP_CHECKSUM | len; 
    670699+       } else { 
    671 +               tx_desc->config0 = 0x34070000 | len; 
     700+               tx_desc->config0 = FIRST_SEGMENT | LAST_SEGMENT | 
     701+                                  FORCE_ROUTE | IP_CHECKSUM | UDP_CHECKSUM | 
     702+                                  TCP_CHECKSUM | len; 
    672703+       } 
    673704+ 
     
    726757+       struct _tx_ring *tx_ring = sw->tx_ring; 
    727758+ 
    728 +       __raw_writel(0x0, &sw->regs->fs_dma_ctrl0); 
    729 +       __raw_writel(0x11, &sw->regs->dma_auto_poll_cfg); 
    730 +       __raw_writel(0x000000f0, &sw->regs->dma_ring_ctrl); 
    731 +       __raw_writel(0x800000f0, &sw->regs->dma_ring_ctrl); 
    732 + 
    733 +       __raw_writel(0x000000f0, &sw->regs->dma_ring_ctrl); 
    734 + 
    735 +       if (!(rx_dma_pool = dma_pool_create(DRV_NAME, NULL, RX_POOL_ALLOC_SIZE, 32, 0))) 
     759+       __raw_writel(0, &sw->regs->fs_dma_ctrl0); 
     760+       __raw_writel(TS_SUSPEND | FS_SUSPEND, &sw->regs->dma_auto_poll_cfg); 
     761+       __raw_writel(QUEUE_THRESHOLD, &sw->regs->dma_ring_ctrl); 
     762+       __raw_writel(CLR_FS_STATE | QUEUE_THRESHOLD, &sw->regs->dma_ring_ctrl); 
     763+ 
     764+       __raw_writel(QUEUE_THRESHOLD, &sw->regs->dma_ring_ctrl); 
     765+ 
     766+       if (!(rx_dma_pool = dma_pool_create(DRV_NAME, NULL, 
     767+                                           RX_POOL_ALLOC_SIZE, 32, 0))) 
    736768+               return -ENOMEM; 
    737769+ 
     
    767799+       __raw_writel(rx_ring->phys_addr, &sw->regs->fs_desc_base_addr0); 
    768800+ 
    769 +       if (!(tx_dma_pool = dma_pool_create(DRV_NAME, NULL, TX_POOL_ALLOC_SIZE, 32, 0))) 
     801+       if (!(tx_dma_pool = dma_pool_create(DRV_NAME, NULL, 
     802+                                           TX_POOL_ALLOC_SIZE, 32, 0))) 
    770803+               return -ENOMEM; 
    771804+ 
     
    850883+ 
    851884+               temp = __raw_readl(&sw->regs->dma_auto_poll_cfg); 
    852 +               temp &= ~(0x11); 
     885+               temp &= ~(TS_SUSPEND | FS_SUSPEND); 
    853886+               __raw_writel(temp, &sw->regs->dma_auto_poll_cfg); 
    854887+ 
     
    890923+               __raw_writel(temp, &sw->regs->mac_cfg[2]); 
    891924+ 
    892 +               temp = 0x11; 
    893 +               __raw_writel(temp, &sw->regs->dma_auto_poll_cfg); 
     925+               __raw_writel(TS_SUSPEND | FS_SUSPEND, 
     926+                           &sw->regs->dma_auto_poll_cfg); 
    894927+       } 
    895928+ 
     
    908941+       if (dev->flags & IFF_PROMISC) { 
    909942+               if (port->id == 3) 
    910 +                       temp |= ((1 << 2) << 29); 
     943+                       temp |= ((1 << 2) << PROMISC_OFFSET); 
    911944+               else 
    912 +                       temp |= ((1 << port->id) << 29); 
     945+                       temp |= ((1 << port->id) << PROMISC_OFFSET); 
    913946+       } else { 
    914947+               if (port->id == 3) 
    915 +                       temp &= ~((1 << 2) << 29); 
     948+                       temp &= ~((1 << 2) << PROMISC_OFFSET); 
    916949+               else 
    917 +                       temp &= ~((1 << port->id) << 29); 
     950+                       temp &= ~((1 << port->id) << PROMISC_OFFSET); 
    918951+       } 
    919952+       __raw_writel(temp, &sw->regs->mac_glob_cfg); 
     
    10081041+ 
    10091042+       /* Disable DMA */ 
    1010 +       temp = 0x11; 
    1011 +       __raw_writel(temp, &sw->regs->dma_auto_poll_cfg); 
     1043+       __raw_writel(TS_SUSPEND | FS_SUSPEND, &sw->regs->dma_auto_poll_cfg); 
    10121044+ 
    10131045+       for (i = 0; i < RX_DESCS; i++) { 
    10141046+               desc = &(rx_ring)->desc[i]; 
    1015 +               /* Check if we own it, if we do, it will get set correctly when it is re-used */ 
     1047+               /* Check if we own it, if we do, it will get set correctly 
     1048+                * when it is re-used */ 
    10161049+               if (!desc->cown) { 
    10171050+                       skb = rx_ring->buff_tab[i]; 
    1018 +                       dma_unmap_single(NULL, desc->sdp, desc->sdl, DMA_FROM_DEVICE); 
     1051+                       dma_unmap_single(NULL, desc->sdp, desc->sdl, 
     1052+                                        DMA_FROM_DEVICE); 
    10191053+                       dev_kfree_skb(skb); 
    10201054+ 
     
    10351069+ 
    10361070+                       if (i == RX_DESCS - 1) 
    1037 +                               desc->config0 = 0x70000000 | new_mtu; 
     1071+                               desc->config0 = END_OF_RING | FIRST_SEGMENT | 
     1072+                                               LAST_SEGMENT | new_mtu; 
    10381073+                       else 
    1039 +                               desc->config0 = 0x30000000 | new_mtu; 
     1074+                               desc->config0 = FIRST_SEGMENT | 
     1075+                                               LAST_SEGMENT | new_mtu; 
    10401076+               } 
    10411077+       } 
     
    10431079+       /* Re-ENABLE DMA */ 
    10441080+       temp = __raw_readl(&sw->regs->dma_auto_poll_cfg); 
    1045 +       temp &= ~(0x11); 
     1081+       temp &= ~(TS_SUSPEND | FS_SUSPEND); 
    10461082+       __raw_writel(temp, &sw->regs->dma_auto_poll_cfg); 
    10471083+ 
     
    11061142+ 
    11071143+       temp = __raw_readl(&sw->regs->vlan_cfg); 
    1108 +       temp |= ((1 << 15) | (1 << 0)); 
     1144+       temp |= NIC_MODE | VLAN_UNAWARE; 
    11091145+       __raw_writel(temp, &sw->regs->vlan_cfg); 
    11101146+ 
    1111 +       temp = 0x02300000; 
    1112 +       __raw_writel(temp, &sw->regs->mac_glob_cfg); 
     1147+       __raw_writel(UNKNOWN_VLAN_TO_CPU | ACCEPT_CRC_PACKET | 
     1148+                    CRC_STRIPPING, &sw->regs->mac_glob_cfg); 
    11131149+ 
    11141150+       if (!(sw->rx_ring = kmalloc(sizeof(struct _rx_ring), GFP_KERNEL))) { 
  • trunk/target/linux/cns3xxx/patches/100-laguna_support.patch

    r27078 r27297  
    11--- /dev/null 
    22+++ b/arch/arm/mach-cns3xxx/laguna.c 
    3 @@ -0,0 +1,671 @@ 
     3@@ -0,0 +1,761 @@ 
    44+/* 
    55+ * Gateworks Corporation Laguna Platform 
     
    202202+               .gpio = 114, 
    203203+               .active_low = 1, 
     204+       },{ 
     205+               .name = "pwr1", /* Green Led */ 
     206+               .gpio = 116, 
     207+               .active_low = 1, 
     208+       },{ 
     209+               .name = "pwr2", /* Yellow Led */ 
     210+               .gpio = 117, 
     211+               .active_low = 1, 
     212+       },{ 
     213+               .name = "txd1", /* Green Led */ 
     214+               .gpio = 118, 
     215+               .active_low = 1, 
     216+       },{ 
     217+               .name = "txd2", /* Yellow Led */ 
     218+               .gpio = 119, 
     219+               .active_low = 1, 
     220+       },{ 
     221+               .name = "rxd1", /* Green Led */ 
     222+               .gpio = 120, 
     223+               .active_low = 1, 
     224+       },{ 
     225+               .name = "rxd2", /* Yellow Led */ 
     226+               .gpio = 121, 
     227+               .active_low = 1, 
     228+       },{ 
     229+               .name = "ser1", /* Green Led */ 
     230+               .gpio = 122, 
     231+               .active_low = 1, 
     232+       },{ 
     233+               .name = "ser2", /* Yellow Led */ 
     234+               .gpio = 123, 
     235+               .active_low = 1, 
     236+       },{ 
     237+               .name = "enet1", /* Green Led */ 
     238+               .gpio = 124, 
     239+               .active_low = 1, 
     240+       },{ 
     241+               .name = "enet2", /* Yellow Led */ 
     242+               .gpio = 125, 
     243+               .active_low = 1, 
     244+       },{ 
     245+               .name = "sig1_1", /* Green Led */ 
     246+               .gpio = 126, 
     247+               .active_low = 1, 
     248+       },{ 
     249+               .name = "sig1_2", /* Yellow Led */ 
     250+               .gpio = 127, 
     251+               .active_low = 1, 
     252+       },{ 
     253+               .name = "sig2_1", /* Green Led */ 
     254+               .gpio = 128, 
     255+               .active_low = 1, 
     256+       },{ 
     257+               .name = "sig2_2", /* Yellow Led */ 
     258+               .gpio = 129, 
     259+               .active_low = 1, 
     260+       },{ 
     261+               .name = "sig3_1", /* Green Led */ 
     262+               .gpio = 130, 
     263+               .active_low = 1, 
     264+       },{ 
     265+               .name = "sig3_2", /* Yellow Led */ 
     266+               .gpio = 131, 
     267+               .active_low = 1, 
     268+       },{ 
     269+               .name = "net1", /*Green Led */ 
     270+               .gpio = 109, 
     271+               .active_low = 1, 
     272+       },{ 
     273+               .name = "net2", /* Red Led */ 
     274+               .gpio = 110, 
     275+               .active_low = 1, 
     276+       },{ 
     277+               .name = "mod1", /* Green Led */ 
     278+               .gpio = 111, 
     279+               .active_low = 1, 
     280+       },{ 
     281+               .name = "mod2", /* Red Led */ 
     282+               .gpio = 112, 
     283+               .active_low = 1, 
    204284+       }, 
    205285+}; 
    206286+ 
    207287+static struct gpio_led_platform_data laguna_gpio_leds_data = { 
    208 +       .num_leds = 2, 
     288+       .num_leds = 22, 
    209289+       .leds = laguna_gpio_leds, 
    210290+}; 
     
    447527+static struct pca953x_platform_data laguna_pca_data = { 
    448528+       .gpio_base = 100, 
     529+       .irq_base = -1, 
     530+}; 
     531+ 
     532+static struct pca953x_platform_data laguna_pca2_data = { 
     533+       .gpio_base = 116, 
     534+       .irq_base = -1, 
    449535+}; 
    450536+ 
     
    453539+               I2C_BOARD_INFO("pca9555", 0x23), 
    454540+               .platform_data = &laguna_pca_data, 
     541+       },{ 
     542+               I2C_BOARD_INFO("pca9555", 0x27), 
     543+               .platform_data = &laguna_pca2_data, 
    455544+       },{ 
    456545+               I2C_BOARD_INFO("gsp", 0x29), 
     
    549638+                       platform_device_register(&laguna_net_device); 
    550639+ 
    551 +               if (laguna_info.config_bitmap & (SATA0_LOAD | SATA1_LOAD)) 
     640+               if ((laguna_info.config_bitmap & SATA0_LOAD) || 
     641+                   (laguna_info.config_bitmap & SATA1_LOAD)) 
    552642+                       cns3xxx_ahci_init(); 
    553643+ 
     
    641731+               } 
    642732+ 
    643 +               if (laguna_info.config_bitmap & (SPI0_LOAD | SPI1_LOAD)) { 
     733+               if ((laguna_info.config_bitmap & SPI0_LOAD) || 
     734+                   (laguna_info.config_bitmap & SPI1_LOAD)) 
    644735+                       platform_device_register(&laguna_spi_controller); 
    645 +               } 
    646736+ 
    647737+               /* 
     
    651741+ 
    652742+               if (strncmp(laguna_info.model, "GW2388", 6) == 0) { 
    653 +                       platform_device_register(&laguna_gpio_leds_device); 
     743+                       laguna_gpio_leds_data.num_leds = 2; 
    654744+               } else if (strncmp(laguna_info.model, "GW2380", 6) == 0) { 
    655745+                       laguna_gpio_leds[0].gpio = 107; 
    656746+                       laguna_gpio_leds[1].gpio = 106; 
    657747+                       laguna_gpio_leds_data.num_leds = 2; 
    658 +                       platform_device_register(&laguna_gpio_leds_device); 
    659748+               } 
     749+               platform_device_register(&laguna_gpio_leds_device); 
    660750+       } else { 
    661751+               // Do some defaults here, not sure what yet 
Note: See TracChangeset for help on using the changeset viewer.