uboot/board/Marvell/db64460/mv_eth.c
<<
>>
Prefs
   1/*
   2 * (C) Copyright 2003
   3 * Ingo Assmus <ingo.assmus@keymile.com>
   4 *
   5 * based on - Driver for MV64460X ethernet ports
   6 * Copyright (C) 2002 rabeeh@galileo.co.il
   7 *
   8 * See file CREDITS for list of people who contributed to this
   9 * project.
  10 *
  11 * This program is free software; you can redistribute it and/or
  12 * modify it under the terms of the GNU General Public License as
  13 * published by the Free Software Foundation; either version 2 of
  14 * the License, or (at your option) any later version.
  15 *
  16 * This program is distributed in the hope that it will be useful,
  17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19 * GNU General Public License for more details.
  20 *
  21 * You should have received a copy of the GNU General Public License
  22 * along with this program; if not, write to the Free Software
  23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  24 * MA 02111-1307 USA
  25 */
  26
  27/*
  28 * mv_eth.c - header file for the polled mode GT ethernet driver
  29 */
  30#include <common.h>
  31#include <net.h>
  32#include <malloc.h>
  33
  34#include "mv_eth.h"
  35
  36/* enable Debug outputs */
  37
  38#undef DEBUG_MV_ETH
  39
  40#ifdef DEBUG_MV_ETH
  41#define DEBUG
  42#define DP(x) x
  43#else
  44#define DP(x)
  45#endif
  46
  47#undef MV64460_CHECKSUM_OFFLOAD
  48/*************************************************************************
  49**************************************************************************
  50**************************************************************************
  51*  The first part is the high level driver of the gigE ethernet ports.   *
  52**************************************************************************
  53**************************************************************************
  54*************************************************************************/
  55
  56/* Definition for configuring driver */
  57/* #define UPDATE_STATS_BY_SOFTWARE */
  58#undef MV64460_RX_QUEUE_FILL_ON_TASK
  59
  60
  61/* Constants */
  62#define MAGIC_ETH_RUNNING               8031971
  63#define MV64460_INTERNAL_SRAM_SIZE                      _256K
  64#define EXTRA_BYTES 32
  65#define WRAP       ETH_HLEN + 2 + 4 + 16
  66#define BUFFER_MTU dev->mtu + WRAP
  67#define INT_CAUSE_UNMASK_ALL            0x0007ffff
  68#define INT_CAUSE_UNMASK_ALL_EXT        0x0011ffff
  69#ifdef MV64460_RX_FILL_ON_TASK
  70#define INT_CAUSE_MASK_ALL              0x00000000
  71#define INT_CAUSE_CHECK_BITS            INT_CAUSE_UNMASK_ALL
  72#define INT_CAUSE_CHECK_BITS_EXT        INT_CAUSE_UNMASK_ALL_EXT
  73#endif
  74
  75/* Read/Write to/from MV64460 internal registers */
  76#define MV_REG_READ(offset) my_le32_to_cpu(* (volatile unsigned int *) (INTERNAL_REG_BASE_ADDR + offset))
  77#define MV_REG_WRITE(offset,data) *(volatile unsigned int *) (INTERNAL_REG_BASE_ADDR + offset) = my_cpu_to_le32 (data)
  78#define MV_SET_REG_BITS(regOffset,bits) ((*((volatile unsigned int*)((INTERNAL_REG_BASE_ADDR) + (regOffset)))) |= ((unsigned int)my_cpu_to_le32(bits)))
  79#define MV_RESET_REG_BITS(regOffset,bits) ((*((volatile unsigned int*)((INTERNAL_REG_BASE_ADDR) + (regOffset)))) &= ~((unsigned int)my_cpu_to_le32(bits)))
  80
  81/* Static function declarations */
  82static int mv64460_eth_real_open (struct eth_device *eth);
  83static int mv64460_eth_real_stop (struct eth_device *eth);
  84static struct net_device_stats *mv64460_eth_get_stats (struct eth_device
  85                                                       *dev);
  86static void eth_port_init_mac_tables (ETH_PORT eth_port_num);
  87static void mv64460_eth_update_stat (struct eth_device *dev);
  88bool db64460_eth_start (struct eth_device *eth);
  89unsigned int eth_read_mib_counter (ETH_PORT eth_port_num,
  90                                   unsigned int mib_offset);
  91int mv64460_eth_receive (struct eth_device *dev);
  92
  93int mv64460_eth_xmit (struct eth_device *, volatile void *packet, int length);
  94
  95#ifndef  UPDATE_STATS_BY_SOFTWARE
  96static void mv64460_eth_print_stat (struct eth_device *dev);
  97#endif
  98/* Processes a received packet */
  99extern void NetReceive (volatile uchar *, int);
 100
 101extern unsigned int INTERNAL_REG_BASE_ADDR;
 102
 103/*************************************************
 104 *Helper functions - used inside the driver only *
 105 *************************************************/
 106#ifdef DEBUG_MV_ETH
 107void print_globals (struct eth_device *dev)
 108{
 109        printf ("Ethernet PRINT_Globals-Debug function\n");
 110        printf ("Base Address for ETH_PORT_INFO:        %08x\n",
 111                (unsigned int) dev->priv);
 112        printf ("Base Address for mv64460_eth_priv:     %08x\n",
 113                (unsigned int) &(((ETH_PORT_INFO *) dev->priv)->
 114                                 port_private));
 115
 116        printf ("GT Internal Base Address:      %08x\n",
 117                INTERNAL_REG_BASE_ADDR);
 118        printf ("Base Address for TX-DESCs:     %08x    Number of allocated Buffers %d\n", (unsigned int) ((ETH_PORT_INFO *) dev->priv)->p_tx_desc_area_base[0], MV64460_TX_QUEUE_SIZE);
 119        printf ("Base Address for RX-DESCs:     %08x    Number of allocated Buffers %d\n", (unsigned int) ((ETH_PORT_INFO *) dev->priv)->p_rx_desc_area_base[0], MV64460_RX_QUEUE_SIZE);
 120        printf ("Base Address for RX-Buffer:    %08x    allocated Bytes %d\n",
 121                (unsigned int) ((ETH_PORT_INFO *) dev->priv)->
 122                p_rx_buffer_base[0],
 123                (MV64460_RX_QUEUE_SIZE * MV64460_RX_BUFFER_SIZE) + 32);
 124        printf ("Base Address for TX-Buffer:    %08x    allocated Bytes %d\n",
 125                (unsigned int) ((ETH_PORT_INFO *) dev->priv)->
 126                p_tx_buffer_base[0],
 127                (MV64460_TX_QUEUE_SIZE * MV64460_TX_BUFFER_SIZE) + 32);
 128}
 129#endif
 130
 131#define my_cpu_to_le32(x) my_le32_to_cpu((x))
 132
 133unsigned long my_le32_to_cpu (unsigned long x)
 134{
 135        return (((x & 0x000000ffU) << 24) |
 136                ((x & 0x0000ff00U) << 8) |
 137                ((x & 0x00ff0000U) >> 8) | ((x & 0xff000000U) >> 24));
 138}
 139
 140
 141/**********************************************************************
 142 * mv64460_eth_print_phy_status
 143 *
 144 * Prints gigabit ethenret phy status
 145 *
 146 * Input : pointer to ethernet interface network device structure
 147 * Output : N/A
 148 **********************************************************************/
 149
 150static void mv64460_eth_print_phy_status (struct eth_device *dev)
 151{
 152        struct mv64460_eth_priv *port_private;
 153        unsigned int port_num;
 154        ETH_PORT_INFO *ethernet_private = (ETH_PORT_INFO *) dev->priv;
 155        unsigned int port_status, phy_reg_data;
 156
 157        port_private =
 158                (struct mv64460_eth_priv *) ethernet_private->port_private;
 159        port_num = port_private->port_num;
 160
 161        /* Check Link status on phy */
 162        eth_port_read_smi_reg (port_num, 1, &phy_reg_data);
 163        if (!(phy_reg_data & 0x20)) {
 164                printf ("Ethernet port changed link status to DOWN\n");
 165        } else {
 166                port_status =
 167                        MV_REG_READ (MV64460_ETH_PORT_STATUS_REG (port_num));
 168                printf ("Ethernet status port %d: Link up", port_num);
 169                printf (", %s",
 170                        (port_status & BIT2) ? "Full Duplex" : "Half Duplex");
 171                if (port_status & BIT4)
 172                        printf (", Speed 1 Gbps");
 173                else
 174                        printf (", %s",
 175                                (port_status & BIT5) ? "Speed 100 Mbps" :
 176                                "Speed 10 Mbps");
 177                printf ("\n");
 178        }
 179}
 180
 181/**********************************************************************
 182 * u-boot entry functions for mv64460_eth
 183 *
 184 **********************************************************************/
 185int db64460_eth_probe (struct eth_device *dev)
 186{
 187        return ((int) db64460_eth_start (dev));
 188}
 189
 190int db64460_eth_poll (struct eth_device *dev)
 191{
 192        return mv64460_eth_receive (dev);
 193}
 194
 195int db64460_eth_transmit (struct eth_device *dev, volatile void *packet,
 196                          int length)
 197{
 198        mv64460_eth_xmit (dev, packet, length);
 199        return 0;
 200}
 201
 202void db64460_eth_disable (struct eth_device *dev)
 203{
 204        mv64460_eth_stop (dev);
 205}
 206
 207
 208void mv6446x_eth_initialize (bd_t * bis)
 209{
 210        struct eth_device *dev;
 211        ETH_PORT_INFO *ethernet_private;
 212        struct mv64460_eth_priv *port_private;
 213        int devnum, x, temp;
 214        char *s, *e, buf[64];
 215
 216        for (devnum = 0; devnum < MV_ETH_DEVS; devnum++) {
 217                dev = calloc (sizeof (*dev), 1);
 218                if (!dev) {
 219                        printf ("%s: mv_enet%d allocation failure, %s\n",
 220                                __FUNCTION__, devnum, "eth_device structure");
 221                        return;
 222                }
 223
 224                /* must be less than sizeof(dev->name) */
 225                sprintf (dev->name, "mv_enet%d", devnum);
 226
 227#ifdef DEBUG
 228                printf ("Initializing %s\n", dev->name);
 229#endif
 230
 231                /* Extract the MAC address from the environment */
 232                switch (devnum) {
 233                case 0:
 234                        s = "ethaddr";
 235                        break;
 236
 237                case 1:
 238                        s = "eth1addr";
 239                        break;
 240
 241                case 2:
 242                        s = "eth2addr";
 243                        break;
 244
 245                default:        /* this should never happen */
 246                        printf ("%s: Invalid device number %d\n",
 247                                __FUNCTION__, devnum);
 248                        return;
 249                }
 250
 251                temp = getenv_f(s, buf, sizeof (buf));
 252                s = (temp > 0) ? buf : NULL;
 253
 254#ifdef DEBUG
 255                printf ("Setting MAC %d to %s\n", devnum, s);
 256#endif
 257                for (x = 0; x < 6; ++x) {
 258                        dev->enetaddr[x] = s ? simple_strtoul (s, &e, 16) : 0;
 259                        if (s)
 260                                s = (*e) ? e + 1 : e;
 261                }
 262                /* ronen - set the MAC addr in the HW */
 263                eth_port_uc_addr_set (devnum, dev->enetaddr, 0);
 264
 265                dev->init = (void *) db64460_eth_probe;
 266                dev->halt = (void *) ethernet_phy_reset;
 267                dev->send = (void *) db64460_eth_transmit;
 268                dev->recv = (void *) db64460_eth_poll;
 269
 270                ethernet_private = calloc (sizeof (*ethernet_private), 1);
 271                dev->priv = (void *)ethernet_private;
 272                if (!ethernet_private) {
 273                        printf ("%s: %s allocation failure, %s\n",
 274                                __FUNCTION__, dev->name,
 275                                "Private Device Structure");
 276                        free (dev);
 277                        return;
 278                }
 279                /* start with an zeroed ETH_PORT_INFO */
 280                memset (ethernet_private, 0, sizeof (ETH_PORT_INFO));
 281                memcpy (ethernet_private->port_mac_addr, dev->enetaddr, 6);
 282
 283                /* set pointer to memory for stats data structure etc... */
 284                port_private = calloc (sizeof (*ethernet_private), 1);
 285                ethernet_private->port_private = (void *)port_private;
 286                if (!port_private) {
 287                        printf ("%s: %s allocation failure, %s\n",
 288                                __FUNCTION__, dev->name,
 289                                "Port Private Device Structure");
 290
 291                        free (ethernet_private);
 292                        free (dev);
 293                        return;
 294                }
 295
 296                port_private->stats =
 297                        calloc (sizeof (struct net_device_stats), 1);
 298                if (!port_private->stats) {
 299                        printf ("%s: %s allocation failure, %s\n",
 300                                __FUNCTION__, dev->name,
 301                                "Net stat Structure");
 302
 303                        free (port_private);
 304                        free (ethernet_private);
 305                        free (dev);
 306                        return;
 307                }
 308                memset (ethernet_private->port_private, 0,
 309                        sizeof (struct mv64460_eth_priv));
 310                switch (devnum) {
 311                case 0:
 312                        ethernet_private->port_num = ETH_0;
 313                        break;
 314                case 1:
 315                        ethernet_private->port_num = ETH_1;
 316                        break;
 317                case 2:
 318                        ethernet_private->port_num = ETH_2;
 319                        break;
 320                default:
 321                        printf ("Invalid device number %d\n", devnum);
 322                        break;
 323                };
 324
 325                port_private->port_num = devnum;
 326                /*
 327                 * Read MIB counter on the GT in order to reset them,
 328                 * then zero all the stats fields in memory
 329                 */
 330                mv64460_eth_update_stat (dev);
 331                memset (port_private->stats, 0,
 332                        sizeof (struct net_device_stats));
 333                /* Extract the MAC address from the environment */
 334                switch (devnum) {
 335                case 0:
 336                        s = "ethaddr";
 337                        break;
 338
 339                case 1:
 340                        s = "eth1addr";
 341                        break;
 342
 343                case 2:
 344                        s = "eth2addr";
 345                        break;
 346
 347                default:        /* this should never happen */
 348                        printf ("%s: Invalid device number %d\n",
 349                                __FUNCTION__, devnum);
 350                        return;
 351                }
 352
 353                temp = getenv_f(s, buf, sizeof (buf));
 354                s = (temp > 0) ? buf : NULL;
 355
 356#ifdef DEBUG
 357                printf ("Setting MAC %d to %s\n", devnum, s);
 358#endif
 359                for (x = 0; x < 6; ++x) {
 360                        dev->enetaddr[x] = s ? simple_strtoul (s, &e, 16) : 0;
 361                        if (s)
 362                                s = (*e) ? e + 1 : e;
 363                }
 364
 365                DP (printf ("Allocating descriptor and buffer rings\n"));
 366
 367                ethernet_private->p_rx_desc_area_base[0] =
 368                        (ETH_RX_DESC *) memalign (16,
 369                                                  RX_DESC_ALIGNED_SIZE *
 370                                                  MV64460_RX_QUEUE_SIZE + 1);
 371                ethernet_private->p_tx_desc_area_base[0] =
 372                        (ETH_TX_DESC *) memalign (16,
 373                                                  TX_DESC_ALIGNED_SIZE *
 374                                                  MV64460_TX_QUEUE_SIZE + 1);
 375
 376                ethernet_private->p_rx_buffer_base[0] =
 377                        (char *) memalign (16,
 378                                           MV64460_RX_QUEUE_SIZE *
 379                                           MV64460_TX_BUFFER_SIZE + 1);
 380                ethernet_private->p_tx_buffer_base[0] =
 381                        (char *) memalign (16,
 382                                           MV64460_RX_QUEUE_SIZE *
 383                                           MV64460_TX_BUFFER_SIZE + 1);
 384
 385#ifdef DEBUG_MV_ETH
 386                /* DEBUG OUTPUT prints adresses of globals */
 387                print_globals (dev);
 388#endif
 389                eth_register (dev);
 390
 391        }
 392        DP (printf ("%s: exit\n", __FUNCTION__));
 393
 394}
 395
 396/**********************************************************************
 397 * mv64460_eth_open
 398 *
 399 * This function is called when openning the network device. The function
 400 * should initialize all the hardware, initialize cyclic Rx/Tx
 401 * descriptors chain and buffers and allocate an IRQ to the network
 402 * device.
 403 *
 404 * Input : a pointer to the network device structure
 405 * / / ronen - changed the output to match  net/eth.c needs
 406 * Output : nonzero of success , zero if fails.
 407 * under construction
 408 **********************************************************************/
 409
 410int mv64460_eth_open (struct eth_device *dev)
 411{
 412        return (mv64460_eth_real_open (dev));
 413}
 414
 415/* Helper function for mv64460_eth_open */
 416static int mv64460_eth_real_open (struct eth_device *dev)
 417{
 418
 419        unsigned int queue;
 420        ETH_PORT_INFO *ethernet_private;
 421        struct mv64460_eth_priv *port_private;
 422        unsigned int port_num;
 423        u32 phy_reg_data;
 424
 425        ethernet_private = (ETH_PORT_INFO *) dev->priv;
 426        /* ronen - when we update the MAC env params we only update dev->enetaddr
 427           see ./net/eth.c eth_set_enetaddr() */
 428        memcpy (ethernet_private->port_mac_addr, dev->enetaddr, 6);
 429
 430        port_private =
 431                (struct mv64460_eth_priv *) ethernet_private->port_private;
 432        port_num = port_private->port_num;
 433
 434        /* Stop RX Queues */
 435        MV_REG_WRITE (MV64460_ETH_RECEIVE_QUEUE_COMMAND_REG (port_num),
 436                      0x0000ff00);
 437
 438        /* Clear the ethernet port interrupts */
 439        MV_REG_WRITE (MV64460_ETH_INTERRUPT_CAUSE_REG (port_num), 0);
 440        MV_REG_WRITE (MV64460_ETH_INTERRUPT_CAUSE_EXTEND_REG (port_num), 0);
 441
 442        /* Unmask RX buffer and TX end interrupt */
 443        MV_REG_WRITE (MV64460_ETH_INTERRUPT_MASK_REG (port_num),
 444                      INT_CAUSE_UNMASK_ALL);
 445
 446        /* Unmask phy and link status changes interrupts */
 447        MV_REG_WRITE (MV64460_ETH_INTERRUPT_EXTEND_MASK_REG (port_num),
 448                      INT_CAUSE_UNMASK_ALL_EXT);
 449
 450        /* Set phy address of the port */
 451        ethernet_private->port_phy_addr = 0x8 + port_num;
 452
 453        /* Activate the DMA channels etc */
 454        eth_port_init (ethernet_private);
 455
 456
 457        /* "Allocate" setup TX rings */
 458
 459        for (queue = 0; queue < MV64460_TX_QUEUE_NUM; queue++) {
 460                unsigned int size;
 461
 462                port_private->tx_ring_size[queue] = MV64460_TX_QUEUE_SIZE;
 463                size = (port_private->tx_ring_size[queue] * TX_DESC_ALIGNED_SIZE);      /*size = no of DESCs times DESC-size */
 464                ethernet_private->tx_desc_area_size[queue] = size;
 465
 466                /* first clear desc area completely */
 467                memset ((void *) ethernet_private->p_tx_desc_area_base[queue],
 468                        0, ethernet_private->tx_desc_area_size[queue]);
 469
 470                /* initialize tx desc ring with low level driver */
 471                if (ether_init_tx_desc_ring
 472                    (ethernet_private, ETH_Q0,
 473                     port_private->tx_ring_size[queue],
 474                     MV64460_TX_BUFFER_SIZE /* Each Buffer is 1600 Byte */ ,
 475                     (unsigned int) ethernet_private->
 476                     p_tx_desc_area_base[queue],
 477                     (unsigned int) ethernet_private->
 478                     p_tx_buffer_base[queue]) == false)
 479                        printf ("### Error initializing TX Ring\n");
 480        }
 481
 482        /* "Allocate" setup RX rings */
 483        for (queue = 0; queue < MV64460_RX_QUEUE_NUM; queue++) {
 484                unsigned int size;
 485
 486                /* Meantime RX Ring are fixed - but must be configurable by user */
 487                port_private->rx_ring_size[queue] = MV64460_RX_QUEUE_SIZE;
 488                size = (port_private->rx_ring_size[queue] *
 489                        RX_DESC_ALIGNED_SIZE);
 490                ethernet_private->rx_desc_area_size[queue] = size;
 491
 492                /* first clear desc area completely */
 493                memset ((void *) ethernet_private->p_rx_desc_area_base[queue],
 494                        0, ethernet_private->rx_desc_area_size[queue]);
 495                if ((ether_init_rx_desc_ring
 496                     (ethernet_private, ETH_Q0,
 497                      port_private->rx_ring_size[queue],
 498                      MV64460_RX_BUFFER_SIZE /* Each Buffer is 1600 Byte */ ,
 499                      (unsigned int) ethernet_private->
 500                      p_rx_desc_area_base[queue],
 501                      (unsigned int) ethernet_private->
 502                      p_rx_buffer_base[queue])) == false)
 503                        printf ("### Error initializing RX Ring\n");
 504        }
 505
 506        eth_port_start (ethernet_private);
 507
 508        /* Set maximum receive buffer to 9700 bytes */
 509        MV_REG_WRITE (MV64460_ETH_PORT_SERIAL_CONTROL_REG (port_num),
 510                      (0x5 << 17) |
 511                      (MV_REG_READ
 512                       (MV64460_ETH_PORT_SERIAL_CONTROL_REG (port_num))
 513                       & 0xfff1ffff));
 514
 515        /*
 516         * Set ethernet MTU for leaky bucket mechanism to 0 - this will
 517         * disable the leaky bucket mechanism .
 518         */
 519
 520        MV_REG_WRITE (MV64460_ETH_MAXIMUM_TRANSMIT_UNIT (port_num), 0);
 521        MV_REG_READ (MV64460_ETH_PORT_STATUS_REG (port_num));
 522
 523        /* Check Link status on phy */
 524        eth_port_read_smi_reg (port_num, 1, &phy_reg_data);
 525        if (!(phy_reg_data & 0x20)) {
 526                /* Reset PHY */
 527                if ((ethernet_phy_reset (port_num)) != true) {
 528                        printf ("$$ Warnning: No link on port %d \n",
 529                                port_num);
 530                        return 0;
 531                } else {
 532                        eth_port_read_smi_reg (port_num, 1, &phy_reg_data);
 533                        if (!(phy_reg_data & 0x20)) {
 534                                printf ("### Error: Phy is not active\n");
 535                                return 0;
 536                        }
 537                }
 538        } else {
 539                mv64460_eth_print_phy_status (dev);
 540        }
 541        port_private->eth_running = MAGIC_ETH_RUNNING;
 542        return 1;
 543}
 544
 545
 546static int mv64460_eth_free_tx_rings (struct eth_device *dev)
 547{
 548        unsigned int queue;
 549        ETH_PORT_INFO *ethernet_private;
 550        struct mv64460_eth_priv *port_private;
 551        unsigned int port_num;
 552        volatile ETH_TX_DESC *p_tx_curr_desc;
 553
 554        ethernet_private = (ETH_PORT_INFO *) dev->priv;
 555        port_private =
 556                (struct mv64460_eth_priv *) ethernet_private->port_private;
 557        port_num = port_private->port_num;
 558
 559        /* Stop Tx Queues */
 560        MV_REG_WRITE (MV64460_ETH_TRANSMIT_QUEUE_COMMAND_REG (port_num),
 561                      0x0000ff00);
 562
 563        /* Free TX rings */
 564        DP (printf ("Clearing previously allocated TX queues... "));
 565        for (queue = 0; queue < MV64460_TX_QUEUE_NUM; queue++) {
 566                /* Free on TX rings */
 567                for (p_tx_curr_desc =
 568                     ethernet_private->p_tx_desc_area_base[queue];
 569                     ((unsigned int) p_tx_curr_desc <= (unsigned int)
 570                      ethernet_private->p_tx_desc_area_base[queue] +
 571                      ethernet_private->tx_desc_area_size[queue]);
 572                     p_tx_curr_desc =
 573                     (ETH_TX_DESC *) ((unsigned int) p_tx_curr_desc +
 574                                      TX_DESC_ALIGNED_SIZE)) {
 575                        /* this is inside for loop */
 576                        if (p_tx_curr_desc->return_info != 0) {
 577                                p_tx_curr_desc->return_info = 0;
 578                                DP (printf ("freed\n"));
 579                        }
 580                }
 581                DP (printf ("Done\n"));
 582        }
 583        return 0;
 584}
 585
 586static int mv64460_eth_free_rx_rings (struct eth_device *dev)
 587{
 588        unsigned int queue;
 589        ETH_PORT_INFO *ethernet_private;
 590        struct mv64460_eth_priv *port_private;
 591        unsigned int port_num;
 592        volatile ETH_RX_DESC *p_rx_curr_desc;
 593
 594        ethernet_private = (ETH_PORT_INFO *) dev->priv;
 595        port_private =
 596                (struct mv64460_eth_priv *) ethernet_private->port_private;
 597        port_num = port_private->port_num;
 598
 599
 600        /* Stop RX Queues */
 601        MV_REG_WRITE (MV64460_ETH_RECEIVE_QUEUE_COMMAND_REG (port_num),
 602                      0x0000ff00);
 603
 604        /* Free RX rings */
 605        DP (printf ("Clearing previously allocated RX queues... "));
 606        for (queue = 0; queue < MV64460_RX_QUEUE_NUM; queue++) {
 607                /* Free preallocated skb's on RX rings */
 608                for (p_rx_curr_desc =
 609                     ethernet_private->p_rx_desc_area_base[queue];
 610                     (((unsigned int) p_rx_curr_desc <
 611                       ((unsigned int) ethernet_private->
 612                        p_rx_desc_area_base[queue] +
 613                        ethernet_private->rx_desc_area_size[queue])));
 614                     p_rx_curr_desc =
 615                     (ETH_RX_DESC *) ((unsigned int) p_rx_curr_desc +
 616                                      RX_DESC_ALIGNED_SIZE)) {
 617                        if (p_rx_curr_desc->return_info != 0) {
 618                                p_rx_curr_desc->return_info = 0;
 619                                DP (printf ("freed\n"));
 620                        }
 621                }
 622                DP (printf ("Done\n"));
 623        }
 624        return 0;
 625}
 626
 627/**********************************************************************
 628 * mv64460_eth_stop
 629 *
 630 * This function is used when closing the network device.
 631 * It updates the hardware,
 632 * release all memory that holds buffers and descriptors and release the IRQ.
 633 * Input : a pointer to the device structure
 634 * Output : zero if success , nonzero if fails
 635 *********************************************************************/
 636
 637int mv64460_eth_stop (struct eth_device *dev)
 638{
 639        /* Disable all gigE address decoder */
 640        MV_REG_WRITE (MV64460_ETH_BASE_ADDR_ENABLE_REG, 0x3f);
 641        DP (printf ("%s Ethernet stop called ... \n", __FUNCTION__));
 642        mv64460_eth_real_stop (dev);
 643
 644        return 0;
 645};
 646
 647/* Helper function for mv64460_eth_stop */
 648
 649static int mv64460_eth_real_stop (struct eth_device *dev)
 650{
 651        ETH_PORT_INFO *ethernet_private;
 652        struct mv64460_eth_priv *port_private;
 653        unsigned int port_num;
 654
 655        ethernet_private = (ETH_PORT_INFO *) dev->priv;
 656        port_private =
 657                (struct mv64460_eth_priv *) ethernet_private->port_private;
 658        port_num = port_private->port_num;
 659
 660
 661        mv64460_eth_free_tx_rings (dev);
 662        mv64460_eth_free_rx_rings (dev);
 663
 664        eth_port_reset (ethernet_private->port_num);
 665        /* Disable ethernet port interrupts */
 666        MV_REG_WRITE (MV64460_ETH_INTERRUPT_CAUSE_REG (port_num), 0);
 667        MV_REG_WRITE (MV64460_ETH_INTERRUPT_CAUSE_EXTEND_REG (port_num), 0);
 668        /* Mask RX buffer and TX end interrupt */
 669        MV_REG_WRITE (MV64460_ETH_INTERRUPT_MASK_REG (port_num), 0);
 670        /* Mask phy and link status changes interrupts */
 671        MV_REG_WRITE (MV64460_ETH_INTERRUPT_EXTEND_MASK_REG (port_num), 0);
 672        MV_RESET_REG_BITS (MV64460_CPU_INTERRUPT0_MASK_HIGH,
 673                           BIT0 << port_num);
 674        /* Print Network statistics */
 675#ifndef  UPDATE_STATS_BY_SOFTWARE
 676        /*
 677         * Print statistics (only if ethernet is running),
 678         * then zero all the stats fields in memory
 679         */
 680        if (port_private->eth_running == MAGIC_ETH_RUNNING) {
 681                port_private->eth_running = 0;
 682                mv64460_eth_print_stat (dev);
 683        }
 684        memset (port_private->stats, 0, sizeof (struct net_device_stats));
 685#endif
 686        DP (printf ("\nEthernet stopped ... \n"));
 687        return 0;
 688}
 689
 690
 691/**********************************************************************
 692 * mv64460_eth_start_xmit
 693 *
 694 * This function is queues a packet in the Tx descriptor for
 695 * required port.
 696 *
 697 * Input : skb - a pointer to socket buffer
 698 *         dev - a pointer to the required port
 699 *
 700 * Output : zero upon success
 701 **********************************************************************/
 702
 703int mv64460_eth_xmit (struct eth_device *dev, volatile void *dataPtr,
 704                      int dataSize)
 705{
 706        ETH_PORT_INFO *ethernet_private;
 707        struct mv64460_eth_priv *port_private;
 708        PKT_INFO pkt_info;
 709        ETH_FUNC_RET_STATUS status;
 710        struct net_device_stats *stats;
 711        ETH_FUNC_RET_STATUS release_result;
 712
 713        ethernet_private = (ETH_PORT_INFO *) dev->priv;
 714        port_private =
 715                (struct mv64460_eth_priv *) ethernet_private->port_private;
 716
 717        stats = port_private->stats;
 718
 719        /* Update packet info data structure */
 720        pkt_info.cmd_sts = ETH_TX_FIRST_DESC | ETH_TX_LAST_DESC;        /* DMA owned, first last */
 721        pkt_info.byte_cnt = dataSize;
 722        pkt_info.buf_ptr = (unsigned int) dataPtr;
 723        pkt_info.return_info = 0;
 724
 725        status = eth_port_send (ethernet_private, ETH_Q0, &pkt_info);
 726        if ((status == ETH_ERROR) || (status == ETH_QUEUE_FULL)) {
 727                printf ("Error on transmitting packet ..");
 728                if (status == ETH_QUEUE_FULL)
 729                        printf ("ETH Queue is full. \n");
 730                if (status == ETH_QUEUE_LAST_RESOURCE)
 731                        printf ("ETH Queue: using last available resource. \n");
 732                goto error;
 733        }
 734
 735        /* Update statistics and start of transmittion time */
 736        stats->tx_bytes += dataSize;
 737        stats->tx_packets++;
 738
 739        /* Check if packet(s) is(are) transmitted correctly (release everything) */
 740        do {
 741                release_result =
 742                        eth_tx_return_desc (ethernet_private, ETH_Q0,
 743                                            &pkt_info);
 744                switch (release_result) {
 745                case ETH_OK:
 746                        DP (printf ("descriptor released\n"));
 747                        if (pkt_info.cmd_sts & BIT0) {
 748                                printf ("Error in TX\n");
 749                                stats->tx_errors++;
 750
 751                        }
 752                        break;
 753                case ETH_RETRY:
 754                        DP (printf ("transmission still in process\n"));
 755                        break;
 756
 757                case ETH_ERROR:
 758                        printf ("routine can not access Tx desc ring\n");
 759                        break;
 760
 761                case ETH_END_OF_JOB:
 762                        DP (printf ("the routine has nothing to release\n"));
 763                        break;
 764                default:        /* should not happen */
 765                        break;
 766                }
 767        } while (release_result == ETH_OK);
 768
 769
 770        return 0;               /* success */
 771      error:
 772        return 1;               /* Failed - higher layers will free the skb */
 773}
 774
 775/**********************************************************************
 776 * mv64460_eth_receive
 777 *
 778 * This function is forward packets that are received from the port's
 779 * queues toward kernel core or FastRoute them to another interface.
 780 *
 781 * Input : dev - a pointer to the required interface
 782 *         max - maximum number to receive (0 means unlimted)
 783 *
 784 * Output : number of served packets
 785 **********************************************************************/
 786
 787int mv64460_eth_receive (struct eth_device *dev)
 788{
 789        ETH_PORT_INFO *ethernet_private;
 790        struct mv64460_eth_priv *port_private;
 791        PKT_INFO pkt_info;
 792        struct net_device_stats *stats;
 793
 794        ethernet_private = (ETH_PORT_INFO *) dev->priv;
 795        port_private =
 796                (struct mv64460_eth_priv *) ethernet_private->port_private;
 797        stats = port_private->stats;
 798
 799        while ((eth_port_receive (ethernet_private, ETH_Q0, &pkt_info) ==
 800                ETH_OK)) {
 801
 802#ifdef DEBUG_MV_ETH
 803                if (pkt_info.byte_cnt != 0) {
 804                        printf ("%s: Received %d byte Packet @ 0x%x\n",
 805                                __FUNCTION__, pkt_info.byte_cnt,
 806                                pkt_info.buf_ptr);
 807                }
 808#endif
 809                /* Update statistics. Note byte count includes 4 byte CRC count */
 810                stats->rx_packets++;
 811                stats->rx_bytes += pkt_info.byte_cnt;
 812
 813                /*
 814                 * In case received a packet without first / last bits on OR the error
 815                 * summary bit is on, the packets needs to be dropeed.
 816                 */
 817                if (((pkt_info.
 818                      cmd_sts & (ETH_RX_FIRST_DESC | ETH_RX_LAST_DESC)) !=
 819                     (ETH_RX_FIRST_DESC | ETH_RX_LAST_DESC))
 820                    || (pkt_info.cmd_sts & ETH_ERROR_SUMMARY)) {
 821                        stats->rx_dropped++;
 822
 823                        printf ("Received packet spread on multiple descriptors\n");
 824
 825                        /* Is this caused by an error ? */
 826                        if (pkt_info.cmd_sts & ETH_ERROR_SUMMARY) {
 827                                stats->rx_errors++;
 828                        }
 829
 830                        /* free these descriptors again without forwarding them to the higher layers */
 831                        pkt_info.buf_ptr &= ~0x7;       /* realign buffer again */
 832                        pkt_info.byte_cnt = 0x0000;     /* Reset Byte count */
 833
 834                        if (eth_rx_return_buff
 835                            (ethernet_private, ETH_Q0, &pkt_info) != ETH_OK) {
 836                                printf ("Error while returning the RX Desc to Ring\n");
 837                        } else {
 838                                DP (printf ("RX Desc returned to Ring\n"));
 839                        }
 840                        /* /free these descriptors again */
 841                } else {
 842
 843/* !!! call higher layer processing */
 844#ifdef DEBUG_MV_ETH
 845                        printf ("\nNow send it to upper layer protocols (NetReceive) ...\n");
 846#endif
 847                        /* let the upper layer handle the packet */
 848                        NetReceive ((uchar *) pkt_info.buf_ptr,
 849                                    (int) pkt_info.byte_cnt);
 850
 851/* **************************************************************** */
 852/* free descriptor  */
 853                        pkt_info.buf_ptr &= ~0x7;       /* realign buffer again */
 854                        pkt_info.byte_cnt = 0x0000;     /* Reset Byte count */
 855                        DP (printf
 856                            ("RX: pkt_info.buf_ptr =    %x\n",
 857                             pkt_info.buf_ptr));
 858                        if (eth_rx_return_buff
 859                            (ethernet_private, ETH_Q0, &pkt_info) != ETH_OK) {
 860                                printf ("Error while returning the RX Desc to Ring\n");
 861                        } else {
 862                                DP (printf ("RX Desc returned to Ring\n"));
 863                        }
 864
 865/* **************************************************************** */
 866
 867                }
 868        }
 869        mv64460_eth_get_stats (dev);    /* update statistics */
 870        return 1;
 871}
 872
 873/**********************************************************************
 874 * mv64460_eth_get_stats
 875 *
 876 * Returns a pointer to the interface statistics.
 877 *
 878 * Input : dev - a pointer to the required interface
 879 *
 880 * Output : a pointer to the interface's statistics
 881 **********************************************************************/
 882
 883static struct net_device_stats *mv64460_eth_get_stats (struct eth_device *dev)
 884{
 885        ETH_PORT_INFO *ethernet_private;
 886        struct mv64460_eth_priv *port_private;
 887
 888        ethernet_private = (ETH_PORT_INFO *) dev->priv;
 889        port_private =
 890                (struct mv64460_eth_priv *) ethernet_private->port_private;
 891
 892        mv64460_eth_update_stat (dev);
 893
 894        return port_private->stats;
 895}
 896
 897
 898/**********************************************************************
 899 * mv64460_eth_update_stat
 900 *
 901 * Update the statistics structure in the private data structure
 902 *
 903 * Input : pointer to ethernet interface network device structure
 904 * Output : N/A
 905 **********************************************************************/
 906
 907static void mv64460_eth_update_stat (struct eth_device *dev)
 908{
 909        ETH_PORT_INFO *ethernet_private;
 910        struct mv64460_eth_priv *port_private;
 911        struct net_device_stats *stats;
 912
 913        ethernet_private = (ETH_PORT_INFO *) dev->priv;
 914        port_private =
 915                (struct mv64460_eth_priv *) ethernet_private->port_private;
 916        stats = port_private->stats;
 917
 918        /* These are false updates */
 919        stats->rx_packets += (unsigned long)
 920                eth_read_mib_counter (ethernet_private->port_num,
 921                                      ETH_MIB_GOOD_FRAMES_RECEIVED);
 922        stats->tx_packets += (unsigned long)
 923                eth_read_mib_counter (ethernet_private->port_num,
 924                                      ETH_MIB_GOOD_FRAMES_SENT);
 925        stats->rx_bytes += (unsigned long)
 926                eth_read_mib_counter (ethernet_private->port_num,
 927                                      ETH_MIB_GOOD_OCTETS_RECEIVED_LOW);
 928        /*
 929         * Ideally this should be as follows -
 930         *
 931         *   stats->rx_bytes   += stats->rx_bytes +
 932         * ((unsigned long) ethReadMibCounter (ethernet_private->port_num ,
 933         * ETH_MIB_GOOD_OCTETS_RECEIVED_HIGH) << 32);
 934         *
 935         * But the unsigned long in PowerPC and MIPS are 32bit. So the next read
 936         * is just a dummy read for proper work of the GigE port
 937         */
 938        eth_read_mib_counter (ethernet_private->port_num,
 939                                      ETH_MIB_GOOD_OCTETS_RECEIVED_HIGH);
 940        stats->tx_bytes += (unsigned long)
 941                eth_read_mib_counter (ethernet_private->port_num,
 942                                      ETH_MIB_GOOD_OCTETS_SENT_LOW);
 943        eth_read_mib_counter (ethernet_private->port_num,
 944                                      ETH_MIB_GOOD_OCTETS_SENT_HIGH);
 945        stats->rx_errors += (unsigned long)
 946                eth_read_mib_counter (ethernet_private->port_num,
 947                                      ETH_MIB_MAC_RECEIVE_ERROR);
 948
 949        /* Rx dropped is for received packet with CRC error */
 950        stats->rx_dropped +=
 951                (unsigned long) eth_read_mib_counter (ethernet_private->
 952                                                      port_num,
 953                                                      ETH_MIB_BAD_CRC_EVENT);
 954        stats->multicast += (unsigned long)
 955                eth_read_mib_counter (ethernet_private->port_num,
 956                                      ETH_MIB_MULTICAST_FRAMES_RECEIVED);
 957        stats->collisions +=
 958                (unsigned long) eth_read_mib_counter (ethernet_private->
 959                                                      port_num,
 960                                                      ETH_MIB_COLLISION) +
 961                (unsigned long) eth_read_mib_counter (ethernet_private->
 962                                                      port_num,
 963                                                      ETH_MIB_LATE_COLLISION);
 964        /* detailed rx errors */
 965        stats->rx_length_errors +=
 966                (unsigned long) eth_read_mib_counter (ethernet_private->
 967                                                      port_num,
 968                                                      ETH_MIB_UNDERSIZE_RECEIVED)
 969                +
 970                (unsigned long) eth_read_mib_counter (ethernet_private->
 971                                                      port_num,
 972                                                      ETH_MIB_OVERSIZE_RECEIVED);
 973        /* detailed tx errors */
 974}
 975
 976#ifndef  UPDATE_STATS_BY_SOFTWARE
 977/**********************************************************************
 978 * mv64460_eth_print_stat
 979 *
 980 * Update the statistics structure in the private data structure
 981 *
 982 * Input : pointer to ethernet interface network device structure
 983 * Output : N/A
 984 **********************************************************************/
 985
 986static void mv64460_eth_print_stat (struct eth_device *dev)
 987{
 988        ETH_PORT_INFO *ethernet_private;
 989        struct mv64460_eth_priv *port_private;
 990        struct net_device_stats *stats;
 991
 992        ethernet_private = (ETH_PORT_INFO *) dev->priv;
 993        port_private =
 994                (struct mv64460_eth_priv *) ethernet_private->port_private;
 995        stats = port_private->stats;
 996
 997        /* These are false updates */
 998        printf ("\n### Network statistics: ###\n");
 999        printf ("--------------------------\n");
1000        printf (" Packets received:             %ld\n", stats->rx_packets);
1001        printf (" Packets send:                 %ld\n", stats->tx_packets);
1002        printf (" Received bytes:               %ld\n", stats->rx_bytes);
1003        printf (" Send bytes:                   %ld\n", stats->tx_bytes);
1004        if (stats->rx_errors != 0)
1005                printf (" Rx Errors:                    %ld\n",
1006                        stats->rx_errors);
1007        if (stats->rx_dropped != 0)
1008                printf (" Rx dropped (CRC Errors):      %ld\n",
1009                        stats->rx_dropped);
1010        if (stats->multicast != 0)
1011                printf (" Rx mulicast frames:           %ld\n",
1012                        stats->multicast);
1013        if (stats->collisions != 0)
1014                printf (" No. of collisions:            %ld\n",
1015                        stats->collisions);
1016        if (stats->rx_length_errors != 0)
1017                printf (" Rx length errors:             %ld\n",
1018                        stats->rx_length_errors);
1019}
1020#endif
1021
1022/**************************************************************************
1023 *network_start - Network Kick Off Routine UBoot
1024 *Inputs :
1025 *Outputs :
1026 **************************************************************************/
1027
1028bool db64460_eth_start (struct eth_device *dev)
1029{
1030        return (mv64460_eth_open (dev));        /* calls real open */
1031}
1032
1033/*************************************************************************
1034**************************************************************************
1035**************************************************************************
1036*  The second part is the low level driver of the gigE ethernet ports.   *
1037**************************************************************************
1038**************************************************************************
1039*************************************************************************/
1040/*
1041 * based on Linux code
1042 * arch/powerpc/galileo/EVB64460/mv64460_eth.c - Driver for MV64460X ethernet ports
1043 * Copyright (C) 2002 rabeeh@galileo.co.il
1044
1045 * This program is free software; you can redistribute it and/or
1046 * modify it under the terms of the GNU General Public License
1047 * as published by the Free Software Foundation; either version 2
1048 * of the License, or (at your option) any later version.
1049
1050 * This program is distributed in the hope that it will be useful,
1051 * but WITHOUT ANY WARRANTY; without even the implied warranty of
1052 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1053 * GNU General Public License for more details.
1054
1055 * You should have received a copy of the GNU General Public License
1056 * along with this program; if not, write to the Free Software
1057 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
1058 *
1059 */
1060
1061/********************************************************************************
1062 * Marvell's Gigabit Ethernet controller low level driver
1063 *
1064 * DESCRIPTION:
1065 *       This file introduce low level API to Marvell's Gigabit Ethernet
1066 *              controller. This Gigabit Ethernet Controller driver API controls
1067 *              1) Operations (i.e. port init, start, reset etc').
1068 *              2) Data flow (i.e. port send, receive etc').
1069 *              Each Gigabit Ethernet port is controlled via ETH_PORT_INFO
1070 *              struct.
1071 *              This struct includes user configuration information as well as
1072 *              driver internal data needed for its operations.
1073 *
1074 *              Supported Features:
1075 *              - This low level driver is OS independent. Allocating memory for
1076 *                the descriptor rings and buffers are not within the scope of
1077 *                this driver.
1078 *              - The user is free from Rx/Tx queue managing.
1079 *              - This low level driver introduce functionality API that enable
1080 *                the to operate Marvell's Gigabit Ethernet Controller in a
1081 *                convenient way.
1082 *              - Simple Gigabit Ethernet port operation API.
1083 *              - Simple Gigabit Ethernet port data flow API.
1084 *              - Data flow and operation API support per queue functionality.
1085 *              - Support cached descriptors for better performance.
1086 *              - Enable access to all four DRAM banks and internal SRAM memory
1087 *                spaces.
1088 *              - PHY access and control API.
1089 *              - Port control register configuration API.
1090 *              - Full control over Unicast and Multicast MAC configurations.
1091 *
1092 *              Operation flow:
1093 *
1094 *              Initialization phase
1095 *              This phase complete the initialization of the ETH_PORT_INFO
1096 *              struct.
1097 *              User information regarding port configuration has to be set
1098 *              prior to calling the port initialization routine. For example,
1099 *              the user has to assign the port_phy_addr field which is board
1100 *              depended parameter.
1101 *              In this phase any port Tx/Rx activity is halted, MIB counters
1102 *              are cleared, PHY address is set according to user parameter and
1103 *              access to DRAM and internal SRAM memory spaces.
1104 *
1105 *              Driver ring initialization
1106 *              Allocating memory for the descriptor rings and buffers is not
1107 *              within the scope of this driver. Thus, the user is required to
1108 *              allocate memory for the descriptors ring and buffers. Those
1109 *              memory parameters are used by the Rx and Tx ring initialization
1110 *              routines in order to curve the descriptor linked list in a form
1111 *              of a ring.
1112 *              Note: Pay special attention to alignment issues when using
1113 *              cached descriptors/buffers. In this phase the driver store
1114 *              information in the ETH_PORT_INFO struct regarding each queue
1115 *              ring.
1116 *
1117 *              Driver start
1118 *              This phase prepares the Ethernet port for Rx and Tx activity.
1119 *              It uses the information stored in the ETH_PORT_INFO struct to
1120 *              initialize the various port registers.
1121 *
1122 *              Data flow:
1123 *              All packet references to/from the driver are done using PKT_INFO
1124 *              struct.
1125 *              This struct is a unified struct used with Rx and Tx operations.
1126 *              This way the user is not required to be familiar with neither
1127 *              Tx nor Rx descriptors structures.
1128 *              The driver's descriptors rings are management by indexes.
1129 *              Those indexes controls the ring resources and used to indicate
1130 *              a SW resource error:
1131 *              'current'
1132 *              This index points to the current available resource for use. For
1133 *              example in Rx process this index will point to the descriptor
1134 *              that will be passed to the user upon calling the receive routine.
1135 *              In Tx process, this index will point to the descriptor
1136 *              that will be assigned with the user packet info and transmitted.
1137 *              'used'
1138 *              This index points to the descriptor that need to restore its
1139 *              resources. For example in Rx process, using the Rx buffer return
1140 *              API will attach the buffer returned in packet info to the
1141 *              descriptor pointed by 'used'. In Tx process, using the Tx
1142 *              descriptor return will merely return the user packet info with
1143 *              the command status of  the transmitted buffer pointed by the
1144 *              'used' index. Nevertheless, it is essential to use this routine
1145 *              to update the 'used' index.
1146 *              'first'
1147 *              This index supports Tx Scatter-Gather. It points to the first
1148 *              descriptor of a packet assembled of multiple buffers. For example
1149 *              when in middle of Such packet we have a Tx resource error the
1150 *              'curr' index get the value of 'first' to indicate that the ring
1151 *              returned to its state before trying to transmit this packet.
1152 *
1153 *              Receive operation:
1154 *              The eth_port_receive API set the packet information struct,
1155 *              passed by the caller, with received information from the
1156 *              'current' SDMA descriptor.
1157 *              It is the user responsibility to return this resource back
1158 *              to the Rx descriptor ring to enable the reuse of this source.
1159 *              Return Rx resource is done using the eth_rx_return_buff API.
1160 *
1161 *              Transmit operation:
1162 *              The eth_port_send API supports Scatter-Gather which enables to
1163 *              send a packet spanned over multiple buffers. This means that
1164 *              for each packet info structure given by the user and put into
1165 *              the Tx descriptors ring, will be transmitted only if the 'LAST'
1166 *              bit will be set in the packet info command status field. This
1167 *              API also consider restriction regarding buffer alignments and
1168 *              sizes.
1169 *              The user must return a Tx resource after ensuring the buffer
1170 *              has been transmitted to enable the Tx ring indexes to update.
1171 *
1172 *              BOARD LAYOUT
1173 *              This device is on-board.  No jumper diagram is necessary.
1174 *
1175 *              EXTERNAL INTERFACE
1176 *
1177 *       Prior to calling the initialization routine eth_port_init() the user
1178 *       must set the following fields under ETH_PORT_INFO struct:
1179 *       port_num             User Ethernet port number.
1180 *       port_phy_addr              User PHY address of Ethernet port.
1181 *       port_mac_addr[6]           User defined port MAC address.
1182 *       port_config          User port configuration value.
1183 *       port_config_extend    User port config extend value.
1184 *       port_sdma_config      User port SDMA config value.
1185 *       port_serial_control   User port serial control value.
1186 *       *port_virt_to_phys ()  User function to cast virtual addr to CPU bus addr.
1187 *       *port_private        User scratch pad for user specific data structures.
1188 *
1189 *       This driver introduce a set of default values:
1190 *       PORT_CONFIG_VALUE           Default port configuration value
1191 *       PORT_CONFIG_EXTEND_VALUE    Default port extend configuration value
1192 *       PORT_SDMA_CONFIG_VALUE      Default sdma control value
1193 *       PORT_SERIAL_CONTROL_VALUE   Default port serial control value
1194 *
1195 *              This driver data flow is done using the PKT_INFO struct which is
1196 *              a unified struct for Rx and Tx operations:
1197 *              byte_cnt        Tx/Rx descriptor buffer byte count.
1198 *              l4i_chk         CPU provided TCP Checksum. For Tx operation only.
1199 *              cmd_sts         Tx/Rx descriptor command status.
1200 *              buf_ptr         Tx/Rx descriptor buffer pointer.
1201 *              return_info     Tx/Rx user resource return information.
1202 *
1203 *
1204 *              EXTERNAL SUPPORT REQUIREMENTS
1205 *
1206 *              This driver requires the following external support:
1207 *
1208 *              D_CACHE_FLUSH_LINE (address, address offset)
1209 *
1210 *              This macro applies assembly code to flush and invalidate cache
1211 *              line.
1212 *              address        - address base.
1213 *              address offset - address offset
1214 *
1215 *
1216 *              CPU_PIPE_FLUSH
1217 *
1218 *              This macro applies assembly code to flush the CPU pipeline.
1219 *
1220 *******************************************************************************/
1221/* includes */
1222
1223/* defines */
1224/* SDMA command macros */
1225#define ETH_ENABLE_TX_QUEUE(tx_queue, eth_port) \
1226 MV_REG_WRITE(MV64460_ETH_TRANSMIT_QUEUE_COMMAND_REG(eth_port), (1 << tx_queue))
1227
1228#define ETH_DISABLE_TX_QUEUE(tx_queue, eth_port) \
1229 MV_REG_WRITE(MV64460_ETH_TRANSMIT_QUEUE_COMMAND_REG(eth_port),\
1230 (1 << (8 + tx_queue)))
1231
1232#define ETH_ENABLE_RX_QUEUE(rx_queue, eth_port) \
1233MV_REG_WRITE(MV64460_ETH_RECEIVE_QUEUE_COMMAND_REG(eth_port), (1 << rx_queue))
1234
1235#define ETH_DISABLE_RX_QUEUE(rx_queue, eth_port) \
1236MV_REG_WRITE(MV64460_ETH_RECEIVE_QUEUE_COMMAND_REG(eth_port), (1 << (8 + rx_queue)))
1237
1238#define CURR_RFD_GET(p_curr_desc, queue) \
1239 ((p_curr_desc) = p_eth_port_ctrl->p_rx_curr_desc_q[queue])
1240
1241#define CURR_RFD_SET(p_curr_desc, queue) \
1242 (p_eth_port_ctrl->p_rx_curr_desc_q[queue] = (p_curr_desc))
1243
1244#define USED_RFD_GET(p_used_desc, queue) \
1245 ((p_used_desc) = p_eth_port_ctrl->p_rx_used_desc_q[queue])
1246
1247#define USED_RFD_SET(p_used_desc, queue)\
1248(p_eth_port_ctrl->p_rx_used_desc_q[queue] = (p_used_desc))
1249
1250
1251#define CURR_TFD_GET(p_curr_desc, queue) \
1252 ((p_curr_desc) = p_eth_port_ctrl->p_tx_curr_desc_q[queue])
1253
1254#define CURR_TFD_SET(p_curr_desc, queue) \
1255 (p_eth_port_ctrl->p_tx_curr_desc_q[queue] = (p_curr_desc))
1256
1257#define USED_TFD_GET(p_used_desc, queue) \
1258 ((p_used_desc) = p_eth_port_ctrl->p_tx_used_desc_q[queue])
1259
1260#define USED_TFD_SET(p_used_desc, queue) \
1261 (p_eth_port_ctrl->p_tx_used_desc_q[queue] = (p_used_desc))
1262
1263#define FIRST_TFD_GET(p_first_desc, queue) \
1264 ((p_first_desc) = p_eth_port_ctrl->p_tx_first_desc_q[queue])
1265
1266#define FIRST_TFD_SET(p_first_desc, queue) \
1267 (p_eth_port_ctrl->p_tx_first_desc_q[queue] = (p_first_desc))
1268
1269
1270/* Macros that save access to desc in order to find next desc pointer  */
1271#define RX_NEXT_DESC_PTR(p_rx_desc, queue) (ETH_RX_DESC*)(((((unsigned int)p_rx_desc - (unsigned int)p_eth_port_ctrl->p_rx_desc_area_base[queue]) + RX_DESC_ALIGNED_SIZE) % p_eth_port_ctrl->rx_desc_area_size[queue]) + (unsigned int)p_eth_port_ctrl->p_rx_desc_area_base[queue])
1272
1273#define TX_NEXT_DESC_PTR(p_tx_desc, queue) (ETH_TX_DESC*)(((((unsigned int)p_tx_desc - (unsigned int)p_eth_port_ctrl->p_tx_desc_area_base[queue]) + TX_DESC_ALIGNED_SIZE) % p_eth_port_ctrl->tx_desc_area_size[queue]) + (unsigned int)p_eth_port_ctrl->p_tx_desc_area_base[queue])
1274
1275#define LINK_UP_TIMEOUT         100000
1276#define PHY_BUSY_TIMEOUT    10000000
1277
1278/* locals */
1279
1280/* PHY routines */
1281static void ethernet_phy_set (ETH_PORT eth_port_num, int phy_addr);
1282static int ethernet_phy_get (ETH_PORT eth_port_num);
1283
1284/* Ethernet Port routines */
1285static void eth_set_access_control (ETH_PORT eth_port_num,
1286                                    ETH_WIN_PARAM * param);
1287static bool eth_port_uc_addr (ETH_PORT eth_port_num, unsigned char uc_nibble,
1288                              ETH_QUEUE queue, int option);
1289#if 0                           /* FIXME */
1290static bool eth_port_smc_addr (ETH_PORT eth_port_num,
1291                               unsigned char mc_byte,
1292                               ETH_QUEUE queue, int option);
1293static bool eth_port_omc_addr (ETH_PORT eth_port_num,
1294                               unsigned char crc8,
1295                               ETH_QUEUE queue, int option);
1296#endif
1297
1298static void eth_b_copy (unsigned int src_addr, unsigned int dst_addr,
1299                        int byte_count);
1300
1301void eth_dbg (ETH_PORT_INFO * p_eth_port_ctrl);
1302
1303
1304typedef enum _memory_bank { BANK0, BANK1, BANK2, BANK3 } MEMORY_BANK;
1305u32 mv_get_dram_bank_base_addr (MEMORY_BANK bank)
1306{
1307        u32 result = 0;
1308        u32 enable = MV_REG_READ (MV64460_BASE_ADDR_ENABLE);
1309
1310        if (enable & (1 << bank))
1311                return 0;
1312        if (bank == BANK0)
1313                result = MV_REG_READ (MV64460_CS_0_BASE_ADDR);
1314        if (bank == BANK1)
1315                result = MV_REG_READ (MV64460_CS_1_BASE_ADDR);
1316        if (bank == BANK2)
1317                result = MV_REG_READ (MV64460_CS_2_BASE_ADDR);
1318        if (bank == BANK3)
1319                result = MV_REG_READ (MV64460_CS_3_BASE_ADDR);
1320        result &= 0x0000ffff;
1321        result = result << 16;
1322        return result;
1323}
1324
1325u32 mv_get_dram_bank_size (MEMORY_BANK bank)
1326{
1327        u32 result = 0;
1328        u32 enable = MV_REG_READ (MV64460_BASE_ADDR_ENABLE);
1329
1330        if (enable & (1 << bank))
1331                return 0;
1332        if (bank == BANK0)
1333                result = MV_REG_READ (MV64460_CS_0_SIZE);
1334        if (bank == BANK1)
1335                result = MV_REG_READ (MV64460_CS_1_SIZE);
1336        if (bank == BANK2)
1337                result = MV_REG_READ (MV64460_CS_2_SIZE);
1338        if (bank == BANK3)
1339                result = MV_REG_READ (MV64460_CS_3_SIZE);
1340        result += 1;
1341        result &= 0x0000ffff;
1342        result = result << 16;
1343        return result;
1344}
1345
1346u32 mv_get_internal_sram_base (void)
1347{
1348        u32 result;
1349
1350        result = MV_REG_READ (MV64460_INTEGRATED_SRAM_BASE_ADDR);
1351        result &= 0x0000ffff;
1352        result = result << 16;
1353        return result;
1354}
1355
1356/*******************************************************************************
1357* eth_port_init - Initialize the Ethernet port driver
1358*
1359* DESCRIPTION:
1360*       This function prepares the ethernet port to start its activity:
1361*       1) Completes the ethernet port driver struct initialization toward port
1362*           start routine.
1363*       2) Resets the device to a quiescent state in case of warm reboot.
1364*       3) Enable SDMA access to all four DRAM banks as well as internal SRAM.
1365*       4) Clean MAC tables. The reset status of those tables is unknown.
1366*       5) Set PHY address.
1367*       Note: Call this routine prior to eth_port_start routine and after setting
1368*       user values in the user fields of Ethernet port control struct (i.e.
1369*       port_phy_addr).
1370*
1371* INPUT:
1372*       ETH_PORT_INFO   *p_eth_port_ctrl       Ethernet port control struct
1373*
1374* OUTPUT:
1375*       See description.
1376*
1377* RETURN:
1378*       None.
1379*
1380*******************************************************************************/
1381static void eth_port_init (ETH_PORT_INFO * p_eth_port_ctrl)
1382{
1383        int queue;
1384        ETH_WIN_PARAM win_param;
1385
1386        p_eth_port_ctrl->port_config = PORT_CONFIG_VALUE;
1387        p_eth_port_ctrl->port_config_extend = PORT_CONFIG_EXTEND_VALUE;
1388        p_eth_port_ctrl->port_sdma_config = PORT_SDMA_CONFIG_VALUE;
1389        p_eth_port_ctrl->port_serial_control = PORT_SERIAL_CONTROL_VALUE;
1390
1391        p_eth_port_ctrl->port_rx_queue_command = 0;
1392        p_eth_port_ctrl->port_tx_queue_command = 0;
1393
1394        /* Zero out SW structs */
1395        for (queue = 0; queue < MAX_RX_QUEUE_NUM; queue++) {
1396                CURR_RFD_SET ((ETH_RX_DESC *) 0x00000000, queue);
1397                USED_RFD_SET ((ETH_RX_DESC *) 0x00000000, queue);
1398                p_eth_port_ctrl->rx_resource_err[queue] = false;
1399        }
1400
1401        for (queue = 0; queue < MAX_TX_QUEUE_NUM; queue++) {
1402                CURR_TFD_SET ((ETH_TX_DESC *) 0x00000000, queue);
1403                USED_TFD_SET ((ETH_TX_DESC *) 0x00000000, queue);
1404                FIRST_TFD_SET ((ETH_TX_DESC *) 0x00000000, queue);
1405                p_eth_port_ctrl->tx_resource_err[queue] = false;
1406        }
1407
1408        eth_port_reset (p_eth_port_ctrl->port_num);
1409
1410        /* Set access parameters for DRAM bank 0 */
1411        win_param.win = ETH_WIN0;       /* Use Ethernet window 0 */
1412        win_param.target = ETH_TARGET_DRAM;     /* Window target - DDR  */
1413        win_param.attributes = EBAR_ATTR_DRAM_CS0;      /* Enable DRAM bank   */
1414#ifndef CONFIG_NOT_COHERENT_CACHE
1415        win_param.attributes |= EBAR_ATTR_DRAM_CACHE_COHERENCY_WB;
1416#endif
1417        win_param.high_addr = 0;
1418        /* Get bank base */
1419        win_param.base_addr = mv_get_dram_bank_base_addr (BANK0);
1420        win_param.size = mv_get_dram_bank_size (BANK0); /* Get bank size */
1421        if (win_param.size == 0)
1422                win_param.enable = 0;
1423        else
1424                win_param.enable = 1;   /* Enable the access */
1425        win_param.access_ctrl = EWIN_ACCESS_FULL;       /* Enable full access */
1426
1427        /* Set the access control for address window (EPAPR) READ & WRITE */
1428        eth_set_access_control (p_eth_port_ctrl->port_num, &win_param);
1429
1430        /* Set access parameters for DRAM bank 1 */
1431        win_param.win = ETH_WIN1;       /* Use Ethernet window 1 */
1432        win_param.target = ETH_TARGET_DRAM;     /* Window target - DDR */
1433        win_param.attributes = EBAR_ATTR_DRAM_CS1;      /* Enable DRAM bank */
1434#ifndef CONFIG_NOT_COHERENT_CACHE
1435        win_param.attributes |= EBAR_ATTR_DRAM_CACHE_COHERENCY_WB;
1436#endif
1437        win_param.high_addr = 0;
1438        /* Get bank base */
1439        win_param.base_addr = mv_get_dram_bank_base_addr (BANK1);
1440        win_param.size = mv_get_dram_bank_size (BANK1); /* Get bank size */
1441        if (win_param.size == 0)
1442                win_param.enable = 0;
1443        else
1444                win_param.enable = 1;   /* Enable the access */
1445        win_param.access_ctrl = EWIN_ACCESS_FULL;       /* Enable full access */
1446
1447        /* Set the access control for address window (EPAPR) READ & WRITE */
1448        eth_set_access_control (p_eth_port_ctrl->port_num, &win_param);
1449
1450        /* Set access parameters for DRAM bank 2 */
1451        win_param.win = ETH_WIN2;       /* Use Ethernet window 2 */
1452        win_param.target = ETH_TARGET_DRAM;     /* Window target - DDR */
1453        win_param.attributes = EBAR_ATTR_DRAM_CS2;      /* Enable DRAM bank */
1454#ifndef CONFIG_NOT_COHERENT_CACHE
1455        win_param.attributes |= EBAR_ATTR_DRAM_CACHE_COHERENCY_WB;
1456#endif
1457        win_param.high_addr = 0;
1458        /* Get bank base */
1459        win_param.base_addr = mv_get_dram_bank_base_addr (BANK2);
1460        win_param.size = mv_get_dram_bank_size (BANK2); /* Get bank size */
1461        if (win_param.size == 0)
1462                win_param.enable = 0;
1463        else
1464                win_param.enable = 1;   /* Enable the access */
1465        win_param.access_ctrl = EWIN_ACCESS_FULL;       /* Enable full access */
1466
1467        /* Set the access control for address window (EPAPR) READ & WRITE */
1468        eth_set_access_control (p_eth_port_ctrl->port_num, &win_param);
1469
1470        /* Set access parameters for DRAM bank 3 */
1471        win_param.win = ETH_WIN3;       /* Use Ethernet window 3 */
1472        win_param.target = ETH_TARGET_DRAM;     /* Window target - DDR */
1473        win_param.attributes = EBAR_ATTR_DRAM_CS3;      /* Enable DRAM bank */
1474#ifndef CONFIG_NOT_COHERENT_CACHE
1475        win_param.attributes |= EBAR_ATTR_DRAM_CACHE_COHERENCY_WB;
1476#endif
1477        win_param.high_addr = 0;
1478        /* Get bank base */
1479        win_param.base_addr = mv_get_dram_bank_base_addr (BANK3);
1480        win_param.size = mv_get_dram_bank_size (BANK3); /* Get bank size */
1481        if (win_param.size == 0)
1482                win_param.enable = 0;
1483        else
1484                win_param.enable = 1;   /* Enable the access */
1485        win_param.access_ctrl = EWIN_ACCESS_FULL;       /* Enable full access */
1486
1487        /* Set the access control for address window (EPAPR) READ & WRITE */
1488        eth_set_access_control (p_eth_port_ctrl->port_num, &win_param);
1489
1490        /* Set access parameters for Internal SRAM */
1491        win_param.win = ETH_WIN4;       /* Use Ethernet window 0 */
1492        win_param.target = EBAR_TARGET_CBS;     /* Target - Internal SRAM */
1493        win_param.attributes = EBAR_ATTR_CBS_SRAM | EBAR_ATTR_CBS_SRAM_BLOCK0;
1494        win_param.high_addr = 0;
1495        win_param.base_addr = mv_get_internal_sram_base ();     /* Get base addr */
1496        win_param.size = MV64460_INTERNAL_SRAM_SIZE;    /* Get bank size */
1497        win_param.enable = 1;   /* Enable the access */
1498        win_param.access_ctrl = EWIN_ACCESS_FULL;       /* Enable full access */
1499
1500        /* Set the access control for address window (EPAPR) READ & WRITE */
1501        eth_set_access_control (p_eth_port_ctrl->port_num, &win_param);
1502
1503        eth_port_init_mac_tables (p_eth_port_ctrl->port_num);
1504
1505        ethernet_phy_set (p_eth_port_ctrl->port_num,
1506                          p_eth_port_ctrl->port_phy_addr);
1507
1508        return;
1509
1510}
1511
1512/*******************************************************************************
1513* eth_port_start - Start the Ethernet port activity.
1514*
1515* DESCRIPTION:
1516*       This routine prepares the Ethernet port for Rx and Tx activity:
1517*       1. Initialize Tx and Rx Current Descriptor Pointer for each queue that
1518*           has been initialized a descriptor's ring (using ether_init_tx_desc_ring
1519*           for Tx and ether_init_rx_desc_ring for Rx)
1520*       2. Initialize and enable the Ethernet configuration port by writing to
1521*           the port's configuration and command registers.
1522*       3. Initialize and enable the SDMA by writing to the SDMA's
1523*    configuration and command registers.
1524*       After completing these steps, the ethernet port SDMA can starts to
1525*       perform Rx and Tx activities.
1526*
1527*       Note: Each Rx and Tx queue descriptor's list must be initialized prior
1528*       to calling this function (use ether_init_tx_desc_ring for Tx queues and
1529*       ether_init_rx_desc_ring for Rx queues).
1530*
1531* INPUT:
1532*       ETH_PORT_INFO   *p_eth_port_ctrl       Ethernet port control struct
1533*
1534* OUTPUT:
1535*       Ethernet port is ready to receive and transmit.
1536*
1537* RETURN:
1538*       false if the port PHY is not up.
1539*       true otherwise.
1540*
1541*******************************************************************************/
1542static bool eth_port_start (ETH_PORT_INFO * p_eth_port_ctrl)
1543{
1544        int queue;
1545        volatile ETH_TX_DESC *p_tx_curr_desc;
1546        volatile ETH_RX_DESC *p_rx_curr_desc;
1547        unsigned int phy_reg_data;
1548        ETH_PORT eth_port_num = p_eth_port_ctrl->port_num;
1549
1550
1551        /* Assignment of Tx CTRP of given queue */
1552        for (queue = 0; queue < MAX_TX_QUEUE_NUM; queue++) {
1553                CURR_TFD_GET (p_tx_curr_desc, queue);
1554                MV_REG_WRITE ((MV64460_ETH_TX_CURRENT_QUEUE_DESC_PTR_0
1555                               (eth_port_num)
1556                               + (4 * queue)),
1557                              ((unsigned int) p_tx_curr_desc));
1558
1559        }
1560
1561        /* Assignment of Rx CRDP of given queue */
1562        for (queue = 0; queue < MAX_RX_QUEUE_NUM; queue++) {
1563                CURR_RFD_GET (p_rx_curr_desc, queue);
1564                MV_REG_WRITE ((MV64460_ETH_RX_CURRENT_QUEUE_DESC_PTR_0
1565                               (eth_port_num)
1566                               + (4 * queue)),
1567                              ((unsigned int) p_rx_curr_desc));
1568
1569                if (p_rx_curr_desc != NULL)
1570                        /* Add the assigned Ethernet address to the port's address table */
1571                        eth_port_uc_addr_set (p_eth_port_ctrl->port_num,
1572                                              p_eth_port_ctrl->port_mac_addr,
1573                                              queue);
1574        }
1575
1576        /* Assign port configuration and command. */
1577        MV_REG_WRITE (MV64460_ETH_PORT_CONFIG_REG (eth_port_num),
1578                      p_eth_port_ctrl->port_config);
1579
1580        MV_REG_WRITE (MV64460_ETH_PORT_CONFIG_EXTEND_REG (eth_port_num),
1581                      p_eth_port_ctrl->port_config_extend);
1582
1583        MV_REG_WRITE (MV64460_ETH_PORT_SERIAL_CONTROL_REG (eth_port_num),
1584                      p_eth_port_ctrl->port_serial_control);
1585
1586        MV_SET_REG_BITS (MV64460_ETH_PORT_SERIAL_CONTROL_REG (eth_port_num),
1587                         ETH_SERIAL_PORT_ENABLE);
1588
1589        /* Assign port SDMA configuration */
1590        MV_REG_WRITE (MV64460_ETH_SDMA_CONFIG_REG (eth_port_num),
1591                      p_eth_port_ctrl->port_sdma_config);
1592
1593        MV_REG_WRITE (MV64460_ETH_TX_QUEUE_0_TOKEN_BUCKET_COUNT
1594                      (eth_port_num), 0x3fffffff);
1595        MV_REG_WRITE (MV64460_ETH_TX_QUEUE_0_TOKEN_BUCKET_CONFIG
1596                      (eth_port_num), 0x03fffcff);
1597        /* Turn off the port/queue bandwidth limitation */
1598        MV_REG_WRITE (MV64460_ETH_MAXIMUM_TRANSMIT_UNIT (eth_port_num), 0x0);
1599
1600        /* Enable port Rx. */
1601        MV_REG_WRITE (MV64460_ETH_RECEIVE_QUEUE_COMMAND_REG (eth_port_num),
1602                      p_eth_port_ctrl->port_rx_queue_command);
1603
1604        /* Check if link is up */
1605        eth_port_read_smi_reg (eth_port_num, 1, &phy_reg_data);
1606
1607        if (!(phy_reg_data & 0x20))
1608                return false;
1609
1610        return true;
1611}
1612
1613/*******************************************************************************
1614* eth_port_uc_addr_set - This function Set the port Unicast address.
1615*
1616* DESCRIPTION:
1617*               This function Set the port Ethernet MAC address.
1618*
1619* INPUT:
1620*       ETH_PORT eth_port_num     Port number.
1621*       char *        p_addr            Address to be set
1622*       ETH_QUEUE         queue         Rx queue number for this MAC address.
1623*
1624* OUTPUT:
1625*       Set MAC address low and high registers. also calls eth_port_uc_addr()
1626*       To set the unicast table with the proper information.
1627*
1628* RETURN:
1629*       N/A.
1630*
1631*******************************************************************************/
1632static void eth_port_uc_addr_set (ETH_PORT eth_port_num,
1633                                  unsigned char *p_addr, ETH_QUEUE queue)
1634{
1635        unsigned int mac_h;
1636        unsigned int mac_l;
1637
1638        mac_l = (p_addr[4] << 8) | (p_addr[5]);
1639        mac_h = (p_addr[0] << 24) | (p_addr[1] << 16) |
1640                (p_addr[2] << 8) | (p_addr[3] << 0);
1641
1642        MV_REG_WRITE (MV64460_ETH_MAC_ADDR_LOW (eth_port_num), mac_l);
1643        MV_REG_WRITE (MV64460_ETH_MAC_ADDR_HIGH (eth_port_num), mac_h);
1644
1645        /* Accept frames of this address */
1646        eth_port_uc_addr (eth_port_num, p_addr[5], queue, ACCEPT_MAC_ADDR);
1647
1648        return;
1649}
1650
1651/*******************************************************************************
1652* eth_port_uc_addr - This function Set the port unicast address table
1653*
1654* DESCRIPTION:
1655*       This function locates the proper entry in the Unicast table for the
1656*       specified MAC nibble and sets its properties according to function
1657*       parameters.
1658*
1659* INPUT:
1660*       ETH_PORT        eth_port_num      Port number.
1661*       unsigned char uc_nibble         Unicast MAC Address last nibble.
1662*       ETH_QUEUE                queue          Rx queue number for this MAC address.
1663*       int                     option      0 = Add, 1 = remove address.
1664*
1665* OUTPUT:
1666*       This function add/removes MAC addresses from the port unicast address
1667*       table.
1668*
1669* RETURN:
1670*       true is output succeeded.
1671*       false if option parameter is invalid.
1672*
1673*******************************************************************************/
1674static bool eth_port_uc_addr (ETH_PORT eth_port_num,
1675                              unsigned char uc_nibble,
1676                              ETH_QUEUE queue, int option)
1677{
1678        unsigned int unicast_reg;
1679        unsigned int tbl_offset;
1680        unsigned int reg_offset;
1681
1682        /* Locate the Unicast table entry */
1683        uc_nibble = (0xf & uc_nibble);
1684        tbl_offset = (uc_nibble / 4) * 4;       /* Register offset from unicast table base */
1685        reg_offset = uc_nibble % 4;     /* Entry offset within the above register */
1686
1687        switch (option) {
1688        case REJECT_MAC_ADDR:
1689                /* Clear accepts frame bit at specified unicast DA table entry */
1690                unicast_reg =
1691                        MV_REG_READ ((MV64460_ETH_DA_FILTER_UNICAST_TABLE_BASE
1692                                      (eth_port_num)
1693                                      + tbl_offset));
1694
1695                unicast_reg &= (0x0E << (8 * reg_offset));
1696
1697                MV_REG_WRITE ((MV64460_ETH_DA_FILTER_UNICAST_TABLE_BASE
1698                               (eth_port_num)
1699                               + tbl_offset), unicast_reg);
1700                break;
1701
1702        case ACCEPT_MAC_ADDR:
1703                /* Set accepts frame bit at unicast DA filter table entry */
1704                unicast_reg =
1705                        MV_REG_READ ((MV64460_ETH_DA_FILTER_UNICAST_TABLE_BASE
1706                                      (eth_port_num)
1707                                      + tbl_offset));
1708
1709                unicast_reg |= ((0x01 | queue) << (8 * reg_offset));
1710
1711                MV_REG_WRITE ((MV64460_ETH_DA_FILTER_UNICAST_TABLE_BASE
1712                               (eth_port_num)
1713                               + tbl_offset), unicast_reg);
1714
1715                break;
1716
1717        default:
1718                return false;
1719        }
1720        return true;
1721}
1722
1723#if 0                           /* FIXME */
1724/*******************************************************************************
1725* eth_port_mc_addr - Multicast address settings.
1726*
1727* DESCRIPTION:
1728*       This API controls the MV device MAC multicast support.
1729*       The MV device supports multicast using two tables:
1730*       1) Special Multicast Table for MAC addresses of the form
1731*          0x01-00-5E-00-00-XX (where XX is between 0x00 and 0x_fF).
1732*          The MAC DA[7:0] bits are used as a pointer to the Special Multicast
1733*          Table entries in the DA-Filter table.
1734*          In this case, the function calls eth_port_smc_addr() routine to set the
1735*          Special Multicast Table.
1736*       2) Other Multicast Table for multicast of another type. A CRC-8bit
1737*          is used as an index to the Other Multicast Table entries in the
1738*          DA-Filter table.
1739*          In this case, the function calculates the CRC-8bit value and calls
1740*          eth_port_omc_addr() routine to set the Other Multicast Table.
1741* INPUT:
1742*       ETH_PORT        eth_port_num      Port number.
1743*       unsigned char   *p_addr         Unicast MAC Address.
1744*       ETH_QUEUE                queue          Rx queue number for this MAC address.
1745*       int                     option      0 = Add, 1 = remove address.
1746*
1747* OUTPUT:
1748*       See description.
1749*
1750* RETURN:
1751*       true is output succeeded.
1752*       false if add_address_table_entry( ) failed.
1753*
1754*******************************************************************************/
1755static void eth_port_mc_addr (ETH_PORT eth_port_num,
1756                              unsigned char *p_addr,
1757                              ETH_QUEUE queue, int option)
1758{
1759        unsigned int mac_h;
1760        unsigned int mac_l;
1761        unsigned char crc_result = 0;
1762        int mac_array[48];
1763        int crc[8];
1764        int i;
1765
1766
1767        if ((p_addr[0] == 0x01) &&
1768            (p_addr[1] == 0x00) &&
1769            (p_addr[2] == 0x5E) && (p_addr[3] == 0x00) && (p_addr[4] == 0x00))
1770
1771                eth_port_smc_addr (eth_port_num, p_addr[5], queue, option);
1772        else {
1773                /* Calculate CRC-8 out of the given address */
1774                mac_h = (p_addr[0] << 8) | (p_addr[1]);
1775                mac_l = (p_addr[2] << 24) | (p_addr[3] << 16) |
1776                        (p_addr[4] << 8) | (p_addr[5] << 0);
1777
1778                for (i = 0; i < 32; i++)
1779                        mac_array[i] = (mac_l >> i) & 0x1;
1780                for (i = 32; i < 48; i++)
1781                        mac_array[i] = (mac_h >> (i - 32)) & 0x1;
1782
1783
1784                crc[0] = mac_array[45] ^ mac_array[43] ^ mac_array[40] ^
1785                        mac_array[39] ^ mac_array[35] ^ mac_array[34] ^
1786                        mac_array[31] ^ mac_array[30] ^ mac_array[28] ^
1787                        mac_array[23] ^ mac_array[21] ^ mac_array[19] ^
1788                        mac_array[18] ^ mac_array[16] ^ mac_array[14] ^
1789                        mac_array[12] ^ mac_array[8] ^ mac_array[7] ^
1790                        mac_array[6] ^ mac_array[0];
1791
1792                crc[1] = mac_array[46] ^ mac_array[45] ^ mac_array[44] ^
1793                        mac_array[43] ^ mac_array[41] ^ mac_array[39] ^
1794                        mac_array[36] ^ mac_array[34] ^ mac_array[32] ^
1795                        mac_array[30] ^ mac_array[29] ^ mac_array[28] ^
1796                        mac_array[24] ^ mac_array[23] ^ mac_array[22] ^
1797                        mac_array[21] ^ mac_array[20] ^ mac_array[18] ^
1798                        mac_array[17] ^ mac_array[16] ^ mac_array[15] ^
1799                        mac_array[14] ^ mac_array[13] ^ mac_array[12] ^
1800                        mac_array[9] ^ mac_array[6] ^ mac_array[1] ^
1801                        mac_array[0];
1802
1803                crc[2] = mac_array[47] ^ mac_array[46] ^ mac_array[44] ^
1804                        mac_array[43] ^ mac_array[42] ^ mac_array[39] ^
1805                        mac_array[37] ^ mac_array[34] ^ mac_array[33] ^
1806                        mac_array[29] ^ mac_array[28] ^ mac_array[25] ^
1807                        mac_array[24] ^ mac_array[22] ^ mac_array[17] ^
1808                        mac_array[15] ^ mac_array[13] ^ mac_array[12] ^
1809                        mac_array[10] ^ mac_array[8] ^ mac_array[6] ^
1810                        mac_array[2] ^ mac_array[1] ^ mac_array[0];
1811
1812                crc[3] = mac_array[47] ^ mac_array[45] ^ mac_array[44] ^
1813                        mac_array[43] ^ mac_array[40] ^ mac_array[38] ^
1814                        mac_array[35] ^ mac_array[34] ^ mac_array[30] ^
1815                        mac_array[29] ^ mac_array[26] ^ mac_array[25] ^
1816                        mac_array[23] ^ mac_array[18] ^ mac_array[16] ^
1817                        mac_array[14] ^ mac_array[13] ^ mac_array[11] ^
1818                        mac_array[9] ^ mac_array[7] ^ mac_array[3] ^
1819                        mac_array[2] ^ mac_array[1];
1820
1821                crc[4] = mac_array[46] ^ mac_array[45] ^ mac_array[44] ^
1822                        mac_array[41] ^ mac_array[39] ^ mac_array[36] ^
1823                        mac_array[35] ^ mac_array[31] ^ mac_array[30] ^
1824                        mac_array[27] ^ mac_array[26] ^ mac_array[24] ^
1825                        mac_array[19] ^ mac_array[17] ^ mac_array[15] ^
1826                        mac_array[14] ^ mac_array[12] ^ mac_array[10] ^
1827                        mac_array[8] ^ mac_array[4] ^ mac_array[3] ^
1828                        mac_array[2];
1829
1830                crc[5] = mac_array[47] ^ mac_array[46] ^ mac_array[45] ^
1831                        mac_array[42] ^ mac_array[40] ^ mac_array[37] ^
1832                        mac_array[36] ^ mac_array[32] ^ mac_array[31] ^
1833                        mac_array[28] ^ mac_array[27] ^ mac_array[25] ^
1834                        mac_array[20] ^ mac_array[18] ^ mac_array[16] ^
1835                        mac_array[15] ^ mac_array[13] ^ mac_array[11] ^
1836                        mac_array[9] ^ mac_array[5] ^ mac_array[4] ^
1837                        mac_array[3];
1838
1839                crc[6] = mac_array[47] ^ mac_array[46] ^ mac_array[43] ^
1840                        mac_array[41] ^ mac_array[38] ^ mac_array[37] ^
1841                        mac_array[33] ^ mac_array[32] ^ mac_array[29] ^
1842                        mac_array[28] ^ mac_array[26] ^ mac_array[21] ^
1843                        mac_array[19] ^ mac_array[17] ^ mac_array[16] ^
1844                        mac_array[14] ^ mac_array[12] ^ mac_array[10] ^
1845                        mac_array[6] ^ mac_array[5] ^ mac_array[4];
1846
1847                crc[7] = mac_array[47] ^ mac_array[44] ^ mac_array[42] ^
1848                        mac_array[39] ^ mac_array[38] ^ mac_array[34] ^
1849                        mac_array[33] ^ mac_array[30] ^ mac_array[29] ^
1850                        mac_array[27] ^ mac_array[22] ^ mac_array[20] ^
1851                        mac_array[18] ^ mac_array[17] ^ mac_array[15] ^
1852                        mac_array[13] ^ mac_array[11] ^ mac_array[7] ^
1853                        mac_array[6] ^ mac_array[5];
1854
1855                for (i = 0; i < 8; i++)
1856                        crc_result = crc_result | (crc[i] << i);
1857
1858                eth_port_omc_addr (eth_port_num, crc_result, queue, option);
1859        }
1860        return;
1861}
1862
1863/*******************************************************************************
1864* eth_port_smc_addr - Special Multicast address settings.
1865*
1866* DESCRIPTION:
1867*       This routine controls the MV device special MAC multicast support.
1868*       The Special Multicast Table for MAC addresses supports MAC of the form
1869*       0x01-00-5E-00-00-XX (where XX is between 0x00 and 0x_fF).
1870*       The MAC DA[7:0] bits are used as a pointer to the Special Multicast
1871*       Table entries in the DA-Filter table.
1872*       This function set the Special Multicast Table appropriate entry
1873*       according to the argument given.
1874*
1875* INPUT:
1876*       ETH_PORT        eth_port_num      Port number.
1877*       unsigned char   mc_byte         Multicast addr last byte (MAC DA[7:0] bits).
1878*       ETH_QUEUE                queue          Rx queue number for this MAC address.
1879*       int                     option      0 = Add, 1 = remove address.
1880*
1881* OUTPUT:
1882*       See description.
1883*
1884* RETURN:
1885*       true is output succeeded.
1886*       false if option parameter is invalid.
1887*
1888*******************************************************************************/
1889static bool eth_port_smc_addr (ETH_PORT eth_port_num,
1890                               unsigned char mc_byte,
1891                               ETH_QUEUE queue, int option)
1892{
1893        unsigned int smc_table_reg;
1894        unsigned int tbl_offset;
1895        unsigned int reg_offset;
1896
1897        /* Locate the SMC table entry */
1898        tbl_offset = (mc_byte / 4) * 4; /* Register offset from SMC table base */
1899        reg_offset = mc_byte % 4;       /* Entry offset within the above register */
1900        queue &= 0x7;
1901
1902        switch (option) {
1903        case REJECT_MAC_ADDR:
1904                /* Clear accepts frame bit at specified Special DA table entry */
1905                smc_table_reg =
1906                        MV_REG_READ ((MV64460_ETH_DA_FILTER_SPECIAL_MULTICAST_TABLE_BASE (eth_port_num) + tbl_offset));
1907                smc_table_reg &= (0x0E << (8 * reg_offset));
1908
1909                MV_REG_WRITE ((MV64460_ETH_DA_FILTER_SPECIAL_MULTICAST_TABLE_BASE (eth_port_num) + tbl_offset), smc_table_reg);
1910                break;
1911
1912        case ACCEPT_MAC_ADDR:
1913                /* Set accepts frame bit at specified Special DA table entry */
1914                smc_table_reg =
1915                        MV_REG_READ ((MV64460_ETH_DA_FILTER_SPECIAL_MULTICAST_TABLE_BASE (eth_port_num) + tbl_offset));
1916                smc_table_reg |= ((0x01 | queue) << (8 * reg_offset));
1917
1918                MV_REG_WRITE ((MV64460_ETH_DA_FILTER_SPECIAL_MULTICAST_TABLE_BASE (eth_port_num) + tbl_offset), smc_table_reg);
1919                break;
1920
1921        default:
1922                return false;
1923        }
1924        return true;
1925}
1926
1927/*******************************************************************************
1928* eth_port_omc_addr - Multicast address settings.
1929*
1930* DESCRIPTION:
1931*       This routine controls the MV device Other MAC multicast support.
1932*       The Other Multicast Table is used for multicast of another type.
1933*       A CRC-8bit is used as an index to the Other Multicast Table entries
1934*       in the DA-Filter table.
1935*       The function gets the CRC-8bit value from the calling routine and
1936*      set the Other Multicast Table appropriate entry according to the
1937*       CRC-8 argument given.
1938*
1939* INPUT:
1940*       ETH_PORT        eth_port_num      Port number.
1941*       unsigned char     crc8          A CRC-8bit (Polynomial: x^8+x^2+x^1+1).
1942*       ETH_QUEUE                queue          Rx queue number for this MAC address.
1943*       int                     option      0 = Add, 1 = remove address.
1944*
1945* OUTPUT:
1946*       See description.
1947*
1948* RETURN:
1949*       true is output succeeded.
1950*       false if option parameter is invalid.
1951*
1952*******************************************************************************/
1953static bool eth_port_omc_addr (ETH_PORT eth_port_num,
1954                               unsigned char crc8,
1955                               ETH_QUEUE queue, int option)
1956{
1957        unsigned int omc_table_reg;
1958        unsigned int tbl_offset;
1959        unsigned int reg_offset;
1960
1961        /* Locate the OMC table entry */
1962        tbl_offset = (crc8 / 4) * 4;    /* Register offset from OMC table base */
1963        reg_offset = crc8 % 4;  /* Entry offset within the above register */
1964        queue &= 0x7;
1965
1966        switch (option) {
1967        case REJECT_MAC_ADDR:
1968                /* Clear accepts frame bit at specified Other DA table entry */
1969                omc_table_reg =
1970                        MV_REG_READ ((MV64460_ETH_DA_FILTER_OTHER_MULTICAST_TABLE_BASE (eth_port_num) + tbl_offset));
1971                omc_table_reg &= (0x0E << (8 * reg_offset));
1972
1973                MV_REG_WRITE ((MV64460_ETH_DA_FILTER_OTHER_MULTICAST_TABLE_BASE (eth_port_num) + tbl_offset), omc_table_reg);
1974                break;
1975
1976        case ACCEPT_MAC_ADDR:
1977                /* Set accepts frame bit at specified Other DA table entry */
1978                omc_table_reg =
1979                        MV_REG_READ ((MV64460_ETH_DA_FILTER_OTHER_MULTICAST_TABLE_BASE (eth_port_num) + tbl_offset));
1980                omc_table_reg |= ((0x01 | queue) << (8 * reg_offset));
1981
1982                MV_REG_WRITE ((MV64460_ETH_DA_FILTER_OTHER_MULTICAST_TABLE_BASE (eth_port_num) + tbl_offset), omc_table_reg);
1983                break;
1984
1985        default:
1986                return false;
1987        }
1988        return true;
1989}
1990#endif
1991
1992/*******************************************************************************
1993* eth_port_init_mac_tables - Clear all entrance in the UC, SMC and OMC tables
1994*
1995* DESCRIPTION:
1996*       Go through all the DA filter tables (Unicast, Special Multicast & Other
1997*       Multicast) and set each entry to 0.
1998*
1999* INPUT:
2000*       ETH_PORT    eth_port_num   Ethernet Port number. See ETH_PORT enum.
2001*
2002* OUTPUT:
2003*       Multicast and Unicast packets are rejected.
2004*
2005* RETURN:
2006*       None.
2007*
2008*******************************************************************************/
2009static void eth_port_init_mac_tables (ETH_PORT eth_port_num)
2010{
2011        int table_index;
2012
2013        /* Clear DA filter unicast table (Ex_dFUT) */
2014        for (table_index = 0; table_index <= 0xC; table_index += 4)
2015                MV_REG_WRITE ((MV64460_ETH_DA_FILTER_UNICAST_TABLE_BASE
2016                               (eth_port_num) + table_index), 0);
2017
2018        for (table_index = 0; table_index <= 0xFC; table_index += 4) {
2019                /* Clear DA filter special multicast table (Ex_dFSMT) */
2020                MV_REG_WRITE ((MV64460_ETH_DA_FILTER_SPECIAL_MULTICAST_TABLE_BASE (eth_port_num) + table_index), 0);
2021                /* Clear DA filter other multicast table (Ex_dFOMT) */
2022                MV_REG_WRITE ((MV64460_ETH_DA_FILTER_OTHER_MULTICAST_TABLE_BASE (eth_port_num) + table_index), 0);
2023        }
2024}
2025
2026/*******************************************************************************
2027* eth_clear_mib_counters - Clear all MIB counters
2028*
2029* DESCRIPTION:
2030*       This function clears all MIB counters of a specific ethernet port.
2031*       A read from the MIB counter will reset the counter.
2032*
2033* INPUT:
2034*       ETH_PORT    eth_port_num   Ethernet Port number. See ETH_PORT enum.
2035*
2036* OUTPUT:
2037*       After reading all MIB counters, the counters resets.
2038*
2039* RETURN:
2040*       MIB counter value.
2041*
2042*******************************************************************************/
2043static void eth_clear_mib_counters (ETH_PORT eth_port_num)
2044{
2045        int i;
2046
2047        /* Perform dummy reads from MIB counters */
2048        for (i = ETH_MIB_GOOD_OCTETS_RECEIVED_LOW; i < ETH_MIB_LATE_COLLISION;
2049             i += 4)
2050                MV_REG_READ((MV64460_ETH_MIB_COUNTERS_BASE(eth_port_num) + i));
2051
2052        return;
2053}
2054
2055/*******************************************************************************
2056* eth_read_mib_counter - Read a MIB counter
2057*
2058* DESCRIPTION:
2059*       This function reads a MIB counter of a specific ethernet port.
2060*       NOTE - If read from ETH_MIB_GOOD_OCTETS_RECEIVED_LOW, then the
2061*       following read must be from ETH_MIB_GOOD_OCTETS_RECEIVED_HIGH
2062*       register. The same applies for ETH_MIB_GOOD_OCTETS_SENT_LOW and
2063*       ETH_MIB_GOOD_OCTETS_SENT_HIGH
2064*
2065* INPUT:
2066*       ETH_PORT    eth_port_num   Ethernet Port number. See ETH_PORT enum.
2067*       unsigned int mib_offset   MIB counter offset (use ETH_MIB_... macros).
2068*
2069* OUTPUT:
2070*       After reading the MIB counter, the counter resets.
2071*
2072* RETURN:
2073*       MIB counter value.
2074*
2075*******************************************************************************/
2076unsigned int eth_read_mib_counter (ETH_PORT eth_port_num,
2077                                   unsigned int mib_offset)
2078{
2079        return (MV_REG_READ (MV64460_ETH_MIB_COUNTERS_BASE (eth_port_num)
2080                             + mib_offset));
2081}
2082
2083/*******************************************************************************
2084* ethernet_phy_set - Set the ethernet port PHY address.
2085*
2086* DESCRIPTION:
2087*       This routine set the ethernet port PHY address according to given
2088*       parameter.
2089*
2090* INPUT:
2091*               ETH_PORT   eth_port_num   Ethernet Port number. See ETH_PORT enum.
2092*
2093* OUTPUT:
2094*       Set PHY Address Register with given PHY address parameter.
2095*
2096* RETURN:
2097*       None.
2098*
2099*******************************************************************************/
2100static void ethernet_phy_set (ETH_PORT eth_port_num, int phy_addr)
2101{
2102        unsigned int reg_data;
2103
2104        reg_data = MV_REG_READ (MV64460_ETH_PHY_ADDR_REG);
2105
2106        reg_data &= ~(0x1F << (5 * eth_port_num));
2107        reg_data |= (phy_addr << (5 * eth_port_num));
2108
2109        MV_REG_WRITE (MV64460_ETH_PHY_ADDR_REG, reg_data);
2110
2111        return;
2112}
2113
2114/*******************************************************************************
2115 * ethernet_phy_get - Get the ethernet port PHY address.
2116 *
2117 * DESCRIPTION:
2118 *       This routine returns the given ethernet port PHY address.
2119 *
2120 * INPUT:
2121 *              ETH_PORT   eth_port_num   Ethernet Port number. See ETH_PORT enum.
2122 *
2123 * OUTPUT:
2124 *       None.
2125 *
2126 * RETURN:
2127 *       PHY address.
2128 *
2129 *******************************************************************************/
2130static int ethernet_phy_get (ETH_PORT eth_port_num)
2131{
2132        unsigned int reg_data;
2133
2134        reg_data = MV_REG_READ (MV64460_ETH_PHY_ADDR_REG);
2135
2136        return ((reg_data >> (5 * eth_port_num)) & 0x1f);
2137}
2138
2139/*******************************************************************************
2140 * ethernet_phy_reset - Reset Ethernet port PHY.
2141 *
2142 * DESCRIPTION:
2143 *       This routine utilize the SMI interface to reset the ethernet port PHY.
2144 *       The routine waits until the link is up again or link up is timeout.
2145 *
2146 * INPUT:
2147 *      ETH_PORT   eth_port_num   Ethernet Port number. See ETH_PORT enum.
2148 *
2149 * OUTPUT:
2150 *       The ethernet port PHY renew its link.
2151 *
2152 * RETURN:
2153 *       None.
2154 *
2155*******************************************************************************/
2156static bool ethernet_phy_reset (ETH_PORT eth_port_num)
2157{
2158        unsigned int time_out = 50;
2159        unsigned int phy_reg_data;
2160
2161        /* Reset the PHY */
2162        eth_port_read_smi_reg (eth_port_num, 0, &phy_reg_data);
2163        phy_reg_data |= 0x8000; /* Set bit 15 to reset the PHY */
2164        eth_port_write_smi_reg (eth_port_num, 0, phy_reg_data);
2165
2166        /* Poll on the PHY LINK */
2167        do {
2168                eth_port_read_smi_reg (eth_port_num, 1, &phy_reg_data);
2169
2170                if (time_out-- == 0)
2171                        return false;
2172        }
2173        while (!(phy_reg_data & 0x20));
2174
2175        return true;
2176}
2177
2178/*******************************************************************************
2179 * eth_port_reset - Reset Ethernet port
2180 *
2181 * DESCRIPTION:
2182 *      This routine resets the chip by aborting any SDMA engine activity and
2183 *      clearing the MIB counters. The Receiver and the Transmit unit are in
2184 *      idle state after this command is performed and the port is disabled.
2185 *
2186 * INPUT:
2187 *      ETH_PORT   eth_port_num   Ethernet Port number. See ETH_PORT enum.
2188 *
2189 * OUTPUT:
2190 *       Channel activity is halted.
2191 *
2192 * RETURN:
2193 *       None.
2194 *
2195 *******************************************************************************/
2196static void eth_port_reset (ETH_PORT eth_port_num)
2197{
2198        unsigned int reg_data;
2199
2200        /* Stop Tx port activity. Check port Tx activity. */
2201        reg_data =
2202                MV_REG_READ (MV64460_ETH_TRANSMIT_QUEUE_COMMAND_REG
2203                             (eth_port_num));
2204
2205        if (reg_data & 0xFF) {
2206                /* Issue stop command for active channels only */
2207                MV_REG_WRITE (MV64460_ETH_TRANSMIT_QUEUE_COMMAND_REG
2208                              (eth_port_num), (reg_data << 8));
2209
2210                /* Wait for all Tx activity to terminate. */
2211                do {
2212                        /* Check port cause register that all Tx queues are stopped */
2213                        reg_data =
2214                                MV_REG_READ
2215                                (MV64460_ETH_TRANSMIT_QUEUE_COMMAND_REG
2216                                 (eth_port_num));
2217                }
2218                while (reg_data & 0xFF);
2219        }
2220
2221        /* Stop Rx port activity. Check port Rx activity. */
2222        reg_data =
2223                MV_REG_READ (MV64460_ETH_RECEIVE_QUEUE_COMMAND_REG
2224                             (eth_port_num));
2225
2226        if (reg_data & 0xFF) {
2227                /* Issue stop command for active channels only */
2228                MV_REG_WRITE (MV64460_ETH_RECEIVE_QUEUE_COMMAND_REG
2229                              (eth_port_num), (reg_data << 8));
2230
2231                /* Wait for all Rx activity to terminate. */
2232                do {
2233                        /* Check port cause register that all Rx queues are stopped */
2234                        reg_data =
2235                                MV_REG_READ
2236                                (MV64460_ETH_RECEIVE_QUEUE_COMMAND_REG
2237                                 (eth_port_num));
2238                }
2239                while (reg_data & 0xFF);
2240        }
2241
2242
2243        /* Clear all MIB counters */
2244        eth_clear_mib_counters (eth_port_num);
2245
2246        /* Reset the Enable bit in the Configuration Register */
2247        reg_data =
2248                MV_REG_READ (MV64460_ETH_PORT_SERIAL_CONTROL_REG
2249                             (eth_port_num));
2250        reg_data &= ~ETH_SERIAL_PORT_ENABLE;
2251        MV_REG_WRITE (MV64460_ETH_PORT_SERIAL_CONTROL_REG (eth_port_num),
2252                      reg_data);
2253
2254        return;
2255}
2256
2257#if 0                           /* Not needed here */
2258/*******************************************************************************
2259 * ethernet_set_config_reg - Set specified bits in configuration register.
2260 *
2261 * DESCRIPTION:
2262 *       This function sets specified bits in the given ethernet
2263 *       configuration register.
2264 *
2265 * INPUT:
2266 *      ETH_PORT   eth_port_num   Ethernet Port number. See ETH_PORT enum.
2267 *      unsigned int    value   32 bit value.
2268 *
2269 * OUTPUT:
2270 *      The set bits in the value parameter are set in the configuration
2271 *      register.
2272 *
2273 * RETURN:
2274 *      None.
2275 *
2276 *******************************************************************************/
2277static void ethernet_set_config_reg (ETH_PORT eth_port_num,
2278                                     unsigned int value)
2279{
2280        unsigned int eth_config_reg;
2281
2282        eth_config_reg =
2283                MV_REG_READ (MV64460_ETH_PORT_CONFIG_REG (eth_port_num));
2284        eth_config_reg |= value;
2285        MV_REG_WRITE (MV64460_ETH_PORT_CONFIG_REG (eth_port_num),
2286                      eth_config_reg);
2287
2288        return;
2289}
2290#endif
2291
2292#if 0                           /* FIXME */
2293/*******************************************************************************
2294 * ethernet_reset_config_reg - Reset specified bits in configuration register.
2295 *
2296 * DESCRIPTION:
2297 *       This function resets specified bits in the given Ethernet
2298 *       configuration register.
2299 *
2300 * INPUT:
2301 *      ETH_PORT   eth_port_num   Ethernet Port number. See ETH_PORT enum.
2302 *      unsigned int    value   32 bit value.
2303 *
2304 * OUTPUT:
2305 *      The set bits in the value parameter are reset in the configuration
2306 *      register.
2307 *
2308 * RETURN:
2309 *      None.
2310 *
2311 *******************************************************************************/
2312static void ethernet_reset_config_reg (ETH_PORT eth_port_num,
2313                                       unsigned int value)
2314{
2315        unsigned int eth_config_reg;
2316
2317        eth_config_reg = MV_REG_READ (MV64460_ETH_PORT_CONFIG_EXTEND_REG
2318                                      (eth_port_num));
2319        eth_config_reg &= ~value;
2320        MV_REG_WRITE (MV64460_ETH_PORT_CONFIG_EXTEND_REG (eth_port_num),
2321                      eth_config_reg);
2322
2323        return;
2324}
2325#endif
2326
2327#if 0                           /* Not needed here */
2328/*******************************************************************************
2329 * ethernet_get_config_reg - Get the port configuration register
2330 *
2331 * DESCRIPTION:
2332 *       This function returns the configuration register value of the given
2333 *       ethernet port.
2334 *
2335 * INPUT:
2336 *      ETH_PORT   eth_port_num   Ethernet Port number. See ETH_PORT enum.
2337 *
2338 * OUTPUT:
2339 *       None.
2340 *
2341 * RETURN:
2342 *       Port configuration register value.
2343 *
2344 *******************************************************************************/
2345static unsigned int ethernet_get_config_reg (ETH_PORT eth_port_num)
2346{
2347        unsigned int eth_config_reg;
2348
2349        eth_config_reg = MV_REG_READ (MV64460_ETH_PORT_CONFIG_EXTEND_REG
2350                                      (eth_port_num));
2351        return eth_config_reg;
2352}
2353
2354#endif
2355
2356/*******************************************************************************
2357 * eth_port_read_smi_reg - Read PHY registers
2358 *
2359 * DESCRIPTION:
2360 *       This routine utilize the SMI interface to interact with the PHY in
2361 *       order to perform PHY register read.
2362 *
2363 * INPUT:
2364 *      ETH_PORT   eth_port_num   Ethernet Port number. See ETH_PORT enum.
2365 *       unsigned int   phy_reg   PHY register address offset.
2366 *       unsigned int   *value   Register value buffer.
2367 *
2368 * OUTPUT:
2369 *       Write the value of a specified PHY register into given buffer.
2370 *
2371 * RETURN:
2372 *       false if the PHY is busy or read data is not in valid state.
2373 *       true otherwise.
2374 *
2375 *******************************************************************************/
2376static bool eth_port_read_smi_reg (ETH_PORT eth_port_num,
2377                                   unsigned int phy_reg, unsigned int *value)
2378{
2379        unsigned int reg_value;
2380        unsigned int time_out = PHY_BUSY_TIMEOUT;
2381        int phy_addr;
2382
2383        phy_addr = ethernet_phy_get (eth_port_num);
2384/*    printf("     Phy-Port %d has addess %d  \n",eth_port_num, phy_addr );*/
2385
2386        /* first check that it is not busy */
2387        do {
2388                reg_value = MV_REG_READ (MV64460_ETH_SMI_REG);
2389                if (time_out-- == 0) {
2390                        return false;
2391                }
2392        }
2393        while (reg_value & ETH_SMI_BUSY);
2394
2395        /* not busy */
2396
2397        MV_REG_WRITE (MV64460_ETH_SMI_REG,
2398                      (phy_addr << 16) | (phy_reg << 21) |
2399                      ETH_SMI_OPCODE_READ);
2400
2401        time_out = PHY_BUSY_TIMEOUT;    /* initialize the time out var again */
2402
2403        do {
2404                reg_value = MV_REG_READ (MV64460_ETH_SMI_REG);
2405                if (time_out-- == 0) {
2406                        return false;
2407                }
2408        }
2409        while ((reg_value & ETH_SMI_READ_VALID) != ETH_SMI_READ_VALID); /* Bit set equ operation done */
2410
2411        /* Wait for the data to update in the SMI register */
2412#define PHY_UPDATE_TIMEOUT      10000
2413        for (time_out = 0; time_out < PHY_UPDATE_TIMEOUT; time_out++);
2414
2415        reg_value = MV_REG_READ (MV64460_ETH_SMI_REG);
2416
2417        *value = reg_value & 0xffff;
2418
2419        return true;
2420}
2421
2422/*******************************************************************************
2423 * eth_port_write_smi_reg - Write to PHY registers
2424 *
2425 * DESCRIPTION:
2426 *       This routine utilize the SMI interface to interact with the PHY in
2427 *       order to perform writes to PHY registers.
2428 *
2429 * INPUT:
2430 *      ETH_PORT   eth_port_num   Ethernet Port number. See ETH_PORT enum.
2431 *      unsigned int   phy_reg   PHY register address offset.
2432 *      unsigned int    value   Register value.
2433 *
2434 * OUTPUT:
2435 *      Write the given value to the specified PHY register.
2436 *
2437 * RETURN:
2438 *      false if the PHY is busy.
2439 *      true otherwise.
2440 *
2441 *******************************************************************************/
2442static bool eth_port_write_smi_reg (ETH_PORT eth_port_num,
2443                                    unsigned int phy_reg, unsigned int value)
2444{
2445        unsigned int reg_value;
2446        unsigned int time_out = PHY_BUSY_TIMEOUT;
2447        int phy_addr;
2448
2449        phy_addr = ethernet_phy_get (eth_port_num);
2450
2451        /* first check that it is not busy */
2452        do {
2453                reg_value = MV_REG_READ (MV64460_ETH_SMI_REG);
2454                if (time_out-- == 0) {
2455                        return false;
2456                }
2457        }
2458        while (reg_value & ETH_SMI_BUSY);
2459
2460        /* not busy */
2461        MV_REG_WRITE (MV64460_ETH_SMI_REG,
2462                      (phy_addr << 16) | (phy_reg << 21) |
2463                      ETH_SMI_OPCODE_WRITE | (value & 0xffff));
2464        return true;
2465}
2466
2467/*******************************************************************************
2468 * eth_set_access_control - Config address decode parameters for Ethernet unit
2469 *
2470 * DESCRIPTION:
2471 *       This function configures the address decode parameters for the Gigabit
2472 *       Ethernet Controller according the given parameters struct.
2473 *
2474 * INPUT:
2475 *      ETH_PORT   eth_port_num   Ethernet Port number. See ETH_PORT enum.
2476 *       ETH_WIN_PARAM  *param   Address decode parameter struct.
2477 *
2478 * OUTPUT:
2479 *       An access window is opened using the given access parameters.
2480 *
2481 * RETURN:
2482 *       None.
2483 *
2484 *******************************************************************************/
2485static void eth_set_access_control (ETH_PORT eth_port_num,
2486                                    ETH_WIN_PARAM * param)
2487{
2488        unsigned int access_prot_reg;
2489
2490        /* Set access control register */
2491        access_prot_reg = MV_REG_READ (MV64460_ETH_ACCESS_PROTECTION_REG
2492                                       (eth_port_num));
2493        access_prot_reg &= (~(3 << (param->win * 2)));  /* clear window permission */
2494        access_prot_reg |= (param->access_ctrl << (param->win * 2));
2495        MV_REG_WRITE (MV64460_ETH_ACCESS_PROTECTION_REG (eth_port_num),
2496                      access_prot_reg);
2497
2498        /* Set window Size reg (SR) */
2499        MV_REG_WRITE ((MV64460_ETH_SIZE_REG_0 +
2500                       (ETH_SIZE_REG_GAP * param->win)),
2501                      (((param->size / 0x10000) - 1) << 16));
2502
2503        /* Set window Base address reg (BA) */
2504        MV_REG_WRITE ((MV64460_ETH_BAR_0 + (ETH_BAR_GAP * param->win)),
2505                      (param->target | param->attributes | param->base_addr));
2506        /* High address remap reg (HARR) */
2507        if (param->win < 4)
2508                MV_REG_WRITE ((MV64460_ETH_HIGH_ADDR_REMAP_REG_0 +
2509                               (ETH_HIGH_ADDR_REMAP_REG_GAP * param->win)),
2510                              param->high_addr);
2511
2512        /* Base address enable reg (BARER) */
2513        if (param->enable == 1)
2514                MV_RESET_REG_BITS (MV64460_ETH_BASE_ADDR_ENABLE_REG,
2515                                   (1 << param->win));
2516        else
2517                MV_SET_REG_BITS (MV64460_ETH_BASE_ADDR_ENABLE_REG,
2518                                 (1 << param->win));
2519}
2520
2521/*******************************************************************************
2522 * ether_init_rx_desc_ring - Curve a Rx chain desc list and buffer in memory.
2523 *
2524 * DESCRIPTION:
2525 *       This function prepares a Rx chained list of descriptors and packet
2526 *       buffers in a form of a ring. The routine must be called after port
2527 *       initialization routine and before port start routine.
2528 *       The Ethernet SDMA engine uses CPU bus addresses to access the various
2529 *       devices in the system (i.e. DRAM). This function uses the ethernet
2530 *       struct 'virtual to physical' routine (set by the user) to set the ring
2531 *       with physical addresses.
2532 *
2533 * INPUT:
2534 *      ETH_PORT_INFO   *p_eth_port_ctrl   Ethernet Port Control srtuct.
2535 *      ETH_QUEUE       rx_queue         Number of Rx queue.
2536 *      int                     rx_desc_num       Number of Rx descriptors
2537 *      int                     rx_buff_size      Size of Rx buffer
2538 *      unsigned int    rx_desc_base_addr  Rx descriptors memory area base addr.
2539 *      unsigned int    rx_buff_base_addr  Rx buffer memory area base addr.
2540 *
2541 * OUTPUT:
2542 *      The routine updates the Ethernet port control struct with information
2543 *      regarding the Rx descriptors and buffers.
2544 *
2545 * RETURN:
2546 *      false if the given descriptors memory area is not aligned according to
2547 *      Ethernet SDMA specifications.
2548 *      true otherwise.
2549 *
2550 *******************************************************************************/
2551static bool ether_init_rx_desc_ring (ETH_PORT_INFO * p_eth_port_ctrl,
2552                                     ETH_QUEUE rx_queue,
2553                                     int rx_desc_num,
2554                                     int rx_buff_size,
2555                                     unsigned int rx_desc_base_addr,
2556                                     unsigned int rx_buff_base_addr)
2557{
2558        ETH_RX_DESC *p_rx_desc;
2559        ETH_RX_DESC *p_rx_prev_desc;    /* pointer to link with the last descriptor */
2560        unsigned int buffer_addr;
2561        int ix;                 /* a counter */
2562
2563
2564        p_rx_desc = (ETH_RX_DESC *) rx_desc_base_addr;
2565        p_rx_prev_desc = p_rx_desc;
2566        buffer_addr = rx_buff_base_addr;
2567
2568        /* Rx desc Must be 4LW aligned (i.e. Descriptor_Address[3:0]=0000). */
2569        if (rx_buff_base_addr & 0xF)
2570                return false;
2571
2572        /* Rx buffers are limited to 64K bytes and Minimum size is 8 bytes  */
2573        if ((rx_buff_size < 8) || (rx_buff_size > RX_BUFFER_MAX_SIZE))
2574                return false;
2575
2576        /* Rx buffers must be 64-bit aligned.       */
2577        if ((rx_buff_base_addr + rx_buff_size) & 0x7)
2578                return false;
2579
2580        /* initialize the Rx descriptors ring */
2581        for (ix = 0; ix < rx_desc_num; ix++) {
2582                p_rx_desc->buf_size = rx_buff_size;
2583                p_rx_desc->byte_cnt = 0x0000;
2584                p_rx_desc->cmd_sts =
2585                        ETH_BUFFER_OWNED_BY_DMA | ETH_RX_ENABLE_INTERRUPT;
2586                p_rx_desc->next_desc_ptr =
2587                        ((unsigned int) p_rx_desc) + RX_DESC_ALIGNED_SIZE;
2588                p_rx_desc->buf_ptr = buffer_addr;
2589                p_rx_desc->return_info = 0x00000000;
2590                D_CACHE_FLUSH_LINE (p_rx_desc, 0);
2591                buffer_addr += rx_buff_size;
2592                p_rx_prev_desc = p_rx_desc;
2593                p_rx_desc = (ETH_RX_DESC *)
2594                        ((unsigned int) p_rx_desc + RX_DESC_ALIGNED_SIZE);
2595        }
2596
2597        /* Closing Rx descriptors ring */
2598        p_rx_prev_desc->next_desc_ptr = (rx_desc_base_addr);
2599        D_CACHE_FLUSH_LINE (p_rx_prev_desc, 0);
2600
2601        /* Save Rx desc pointer to driver struct. */
2602        CURR_RFD_SET ((ETH_RX_DESC *) rx_desc_base_addr, rx_queue);
2603        USED_RFD_SET ((ETH_RX_DESC *) rx_desc_base_addr, rx_queue);
2604
2605        p_eth_port_ctrl->p_rx_desc_area_base[rx_queue] =
2606                (ETH_RX_DESC *) rx_desc_base_addr;
2607        p_eth_port_ctrl->rx_desc_area_size[rx_queue] =
2608                rx_desc_num * RX_DESC_ALIGNED_SIZE;
2609
2610        p_eth_port_ctrl->port_rx_queue_command |= (1 << rx_queue);
2611
2612        return true;
2613}
2614
2615/*******************************************************************************
2616 * ether_init_tx_desc_ring - Curve a Tx chain desc list and buffer in memory.
2617 *
2618 * DESCRIPTION:
2619 *       This function prepares a Tx chained list of descriptors and packet
2620 *       buffers in a form of a ring. The routine must be called after port
2621 *       initialization routine and before port start routine.
2622 *       The Ethernet SDMA engine uses CPU bus addresses to access the various
2623 *       devices in the system (i.e. DRAM). This function uses the ethernet
2624 *       struct 'virtual to physical' routine (set by the user) to set the ring
2625 *       with physical addresses.
2626 *
2627 * INPUT:
2628 *      ETH_PORT_INFO   *p_eth_port_ctrl   Ethernet Port Control srtuct.
2629 *      ETH_QUEUE       tx_queue         Number of Tx queue.
2630 *      int                     tx_desc_num       Number of Tx descriptors
2631 *      int                     tx_buff_size      Size of Tx buffer
2632 *      unsigned int    tx_desc_base_addr  Tx descriptors memory area base addr.
2633 *      unsigned int    tx_buff_base_addr  Tx buffer memory area base addr.
2634 *
2635 * OUTPUT:
2636 *      The routine updates the Ethernet port control struct with information
2637 *      regarding the Tx descriptors and buffers.
2638 *
2639 * RETURN:
2640 *      false if the given descriptors memory area is not aligned according to
2641 *      Ethernet SDMA specifications.
2642 *      true otherwise.
2643 *
2644 *******************************************************************************/
2645static bool ether_init_tx_desc_ring (ETH_PORT_INFO * p_eth_port_ctrl,
2646                                     ETH_QUEUE tx_queue,
2647                                     int tx_desc_num,
2648                                     int tx_buff_size,
2649                                     unsigned int tx_desc_base_addr,
2650                                     unsigned int tx_buff_base_addr)
2651{
2652
2653        ETH_TX_DESC *p_tx_desc;
2654        ETH_TX_DESC *p_tx_prev_desc;
2655        unsigned int buffer_addr;
2656        int ix;                 /* a counter */
2657
2658
2659        /* save the first desc pointer to link with the last descriptor */
2660        p_tx_desc = (ETH_TX_DESC *) tx_desc_base_addr;
2661        p_tx_prev_desc = p_tx_desc;
2662        buffer_addr = tx_buff_base_addr;
2663
2664        /* Tx desc Must be 4LW aligned (i.e. Descriptor_Address[3:0]=0000). */
2665        if (tx_buff_base_addr & 0xF)
2666                return false;
2667
2668        /* Tx buffers are limited to 64K bytes and Minimum size is 8 bytes  */
2669        if ((tx_buff_size > TX_BUFFER_MAX_SIZE)
2670            || (tx_buff_size < TX_BUFFER_MIN_SIZE))
2671                return false;
2672
2673        /* Initialize the Tx descriptors ring */
2674        for (ix = 0; ix < tx_desc_num; ix++) {
2675                p_tx_desc->byte_cnt = 0x0000;
2676                p_tx_desc->l4i_chk = 0x0000;
2677                p_tx_desc->cmd_sts = 0x00000000;
2678                p_tx_desc->next_desc_ptr =
2679                        ((unsigned int) p_tx_desc) + TX_DESC_ALIGNED_SIZE;
2680
2681                p_tx_desc->buf_ptr = buffer_addr;
2682                p_tx_desc->return_info = 0x00000000;
2683                D_CACHE_FLUSH_LINE (p_tx_desc, 0);
2684                buffer_addr += tx_buff_size;
2685                p_tx_prev_desc = p_tx_desc;
2686                p_tx_desc = (ETH_TX_DESC *)
2687                        ((unsigned int) p_tx_desc + TX_DESC_ALIGNED_SIZE);
2688
2689        }
2690        /* Closing Tx descriptors ring */
2691        p_tx_prev_desc->next_desc_ptr = tx_desc_base_addr;
2692        D_CACHE_FLUSH_LINE (p_tx_prev_desc, 0);
2693        /* Set Tx desc pointer in driver struct. */
2694        CURR_TFD_SET ((ETH_TX_DESC *) tx_desc_base_addr, tx_queue);
2695        USED_TFD_SET ((ETH_TX_DESC *) tx_desc_base_addr, tx_queue);
2696
2697        /* Init Tx ring base and size parameters */
2698        p_eth_port_ctrl->p_tx_desc_area_base[tx_queue] =
2699                (ETH_TX_DESC *) tx_desc_base_addr;
2700        p_eth_port_ctrl->tx_desc_area_size[tx_queue] =
2701                (tx_desc_num * TX_DESC_ALIGNED_SIZE);
2702
2703        /* Add the queue to the list of Tx queues of this port */
2704        p_eth_port_ctrl->port_tx_queue_command |= (1 << tx_queue);
2705
2706        return true;
2707}
2708
2709/*******************************************************************************
2710 * eth_port_send - Send an Ethernet packet
2711 *
2712 * DESCRIPTION:
2713 *      This routine send a given packet described by p_pktinfo parameter. It
2714 *      supports transmitting of a packet spaned over multiple buffers. The
2715 *      routine updates 'curr' and 'first' indexes according to the packet
2716 *      segment passed to the routine. In case the packet segment is first,
2717 *      the 'first' index is update. In any case, the 'curr' index is updated.
2718 *      If the routine get into Tx resource error it assigns 'curr' index as
2719 *      'first'. This way the function can abort Tx process of multiple
2720 *      descriptors per packet.
2721 *
2722 * INPUT:
2723 *      ETH_PORT_INFO   *p_eth_port_ctrl   Ethernet Port Control srtuct.
2724 *      ETH_QUEUE       tx_queue         Number of Tx queue.
2725 *      PKT_INFO        *p_pkt_info       User packet buffer.
2726 *
2727 * OUTPUT:
2728 *      Tx ring 'curr' and 'first' indexes are updated.
2729 *
2730 * RETURN:
2731 *      ETH_QUEUE_FULL in case of Tx resource error.
2732 *      ETH_ERROR in case the routine can not access Tx desc ring.
2733 *      ETH_QUEUE_LAST_RESOURCE if the routine uses the last Tx resource.
2734 *      ETH_OK otherwise.
2735 *
2736 *******************************************************************************/
2737static ETH_FUNC_RET_STATUS eth_port_send (ETH_PORT_INFO * p_eth_port_ctrl,
2738                                          ETH_QUEUE tx_queue,
2739                                          PKT_INFO * p_pkt_info)
2740{
2741        volatile ETH_TX_DESC *p_tx_desc_first;
2742        volatile ETH_TX_DESC *p_tx_desc_curr;
2743        volatile ETH_TX_DESC *p_tx_next_desc_curr;
2744        volatile ETH_TX_DESC *p_tx_desc_used;
2745        unsigned int command_status;
2746
2747        /* Do not process Tx ring in case of Tx ring resource error */
2748        if (p_eth_port_ctrl->tx_resource_err[tx_queue] == true)
2749                return ETH_QUEUE_FULL;
2750
2751        /* Get the Tx Desc ring indexes */
2752        CURR_TFD_GET (p_tx_desc_curr, tx_queue);
2753        USED_TFD_GET (p_tx_desc_used, tx_queue);
2754
2755        if (p_tx_desc_curr == NULL)
2756                return ETH_ERROR;
2757
2758        /* The following parameters are used to save readings from memory */
2759        p_tx_next_desc_curr = TX_NEXT_DESC_PTR (p_tx_desc_curr, tx_queue);
2760        command_status = p_pkt_info->cmd_sts | ETH_ZERO_PADDING | ETH_GEN_CRC;
2761
2762        if (command_status & (ETH_TX_FIRST_DESC)) {
2763                /* Update first desc */
2764                FIRST_TFD_SET (p_tx_desc_curr, tx_queue);
2765                p_tx_desc_first = p_tx_desc_curr;
2766        } else {
2767                FIRST_TFD_GET (p_tx_desc_first, tx_queue);
2768                command_status |= ETH_BUFFER_OWNED_BY_DMA;
2769        }
2770
2771        /* Buffers with a payload smaller than 8 bytes must be aligned to 64-bit */
2772        /* boundary. We use the memory allocated for Tx descriptor. This memory  */
2773        /* located in TX_BUF_OFFSET_IN_DESC offset within the Tx descriptor. */
2774        if (p_pkt_info->byte_cnt <= 8) {
2775                printf ("You have failed in the < 8 bytes errata - fixme\n");   /* RABEEH - TBD */
2776                return ETH_ERROR;
2777
2778                p_tx_desc_curr->buf_ptr =
2779                        (unsigned int) p_tx_desc_curr + TX_BUF_OFFSET_IN_DESC;
2780                eth_b_copy (p_pkt_info->buf_ptr, p_tx_desc_curr->buf_ptr,
2781                            p_pkt_info->byte_cnt);
2782        } else
2783                p_tx_desc_curr->buf_ptr = p_pkt_info->buf_ptr;
2784
2785        p_tx_desc_curr->byte_cnt = p_pkt_info->byte_cnt;
2786        p_tx_desc_curr->return_info = p_pkt_info->return_info;
2787
2788        if (p_pkt_info->cmd_sts & (ETH_TX_LAST_DESC)) {
2789                /* Set last desc with DMA ownership and interrupt enable. */
2790                p_tx_desc_curr->cmd_sts = command_status |
2791                        ETH_BUFFER_OWNED_BY_DMA | ETH_TX_ENABLE_INTERRUPT;
2792
2793                if (p_tx_desc_curr != p_tx_desc_first)
2794                        p_tx_desc_first->cmd_sts |= ETH_BUFFER_OWNED_BY_DMA;
2795
2796                /* Flush CPU pipe */
2797
2798                D_CACHE_FLUSH_LINE ((unsigned int) p_tx_desc_curr, 0);
2799                D_CACHE_FLUSH_LINE ((unsigned int) p_tx_desc_first, 0);
2800                CPU_PIPE_FLUSH;
2801
2802                /* Apply send command */
2803                ETH_ENABLE_TX_QUEUE (tx_queue, p_eth_port_ctrl->port_num);
2804
2805                /* Finish Tx packet. Update first desc in case of Tx resource error */
2806                p_tx_desc_first = p_tx_next_desc_curr;
2807                FIRST_TFD_SET (p_tx_desc_first, tx_queue);
2808
2809        } else {
2810                p_tx_desc_curr->cmd_sts = command_status;
2811                D_CACHE_FLUSH_LINE ((unsigned int) p_tx_desc_curr, 0);
2812        }
2813
2814        /* Check for ring index overlap in the Tx desc ring */
2815        if (p_tx_next_desc_curr == p_tx_desc_used) {
2816                /* Update the current descriptor */
2817                CURR_TFD_SET (p_tx_desc_first, tx_queue);
2818
2819                p_eth_port_ctrl->tx_resource_err[tx_queue] = true;
2820                return ETH_QUEUE_LAST_RESOURCE;
2821        } else {
2822                /* Update the current descriptor */
2823                CURR_TFD_SET (p_tx_next_desc_curr, tx_queue);
2824                return ETH_OK;
2825        }
2826}
2827
2828/*******************************************************************************
2829 * eth_tx_return_desc - Free all used Tx descriptors
2830 *
2831 * DESCRIPTION:
2832 *      This routine returns the transmitted packet information to the caller.
2833 *      It uses the 'first' index to support Tx desc return in case a transmit
2834 *      of a packet spanned over multiple buffer still in process.
2835 *      In case the Tx queue was in "resource error" condition, where there are
2836 *      no available Tx resources, the function resets the resource error flag.
2837 *
2838 * INPUT:
2839 *      ETH_PORT_INFO   *p_eth_port_ctrl   Ethernet Port Control srtuct.
2840 *      ETH_QUEUE       tx_queue         Number of Tx queue.
2841 *      PKT_INFO        *p_pkt_info       User packet buffer.
2842 *
2843 * OUTPUT:
2844 *      Tx ring 'first' and 'used' indexes are updated.
2845 *
2846 * RETURN:
2847 *      ETH_ERROR in case the routine can not access Tx desc ring.
2848 *      ETH_RETRY in case there is transmission in process.
2849 *      ETH_END_OF_JOB if the routine has nothing to release.
2850 *      ETH_OK otherwise.
2851 *
2852 *******************************************************************************/
2853static ETH_FUNC_RET_STATUS eth_tx_return_desc (ETH_PORT_INFO *
2854                                               p_eth_port_ctrl,
2855                                               ETH_QUEUE tx_queue,
2856                                               PKT_INFO * p_pkt_info)
2857{
2858        volatile ETH_TX_DESC *p_tx_desc_used = NULL;
2859        volatile ETH_TX_DESC *p_tx_desc_first = NULL;
2860        unsigned int command_status;
2861
2862
2863        /* Get the Tx Desc ring indexes */
2864        USED_TFD_GET (p_tx_desc_used, tx_queue);
2865        FIRST_TFD_GET (p_tx_desc_first, tx_queue);
2866
2867
2868        /* Sanity check */
2869        if (p_tx_desc_used == NULL)
2870                return ETH_ERROR;
2871
2872        command_status = p_tx_desc_used->cmd_sts;
2873
2874        /* Still transmitting... */
2875        if (command_status & (ETH_BUFFER_OWNED_BY_DMA)) {
2876                D_CACHE_FLUSH_LINE ((unsigned int) p_tx_desc_used, 0);
2877                return ETH_RETRY;
2878        }
2879
2880        /* Stop release. About to overlap the current available Tx descriptor */
2881        if ((p_tx_desc_used == p_tx_desc_first) &&
2882            (p_eth_port_ctrl->tx_resource_err[tx_queue] == false)) {
2883                D_CACHE_FLUSH_LINE ((unsigned int) p_tx_desc_used, 0);
2884                return ETH_END_OF_JOB;
2885        }
2886
2887        /* Pass the packet information to the caller */
2888        p_pkt_info->cmd_sts = command_status;
2889        p_pkt_info->return_info = p_tx_desc_used->return_info;
2890        p_tx_desc_used->return_info = 0;
2891
2892        /* Update the next descriptor to release. */
2893        USED_TFD_SET (TX_NEXT_DESC_PTR (p_tx_desc_used, tx_queue), tx_queue);
2894
2895        /* Any Tx return cancels the Tx resource error status */
2896        if (p_eth_port_ctrl->tx_resource_err[tx_queue] == true)
2897                p_eth_port_ctrl->tx_resource_err[tx_queue] = false;
2898
2899        D_CACHE_FLUSH_LINE ((unsigned int) p_tx_desc_used, 0);
2900
2901        return ETH_OK;
2902
2903}
2904
2905/*******************************************************************************
2906 * eth_port_receive - Get received information from Rx ring.
2907 *
2908 * DESCRIPTION:
2909 *      This routine returns the received data to the caller. There is no
2910 *      data copying during routine operation. All information is returned
2911 *      using pointer to packet information struct passed from the caller.
2912 *      If the routine exhausts Rx ring resources then the resource error flag
2913 *      is set.
2914 *
2915 * INPUT:
2916 *      ETH_PORT_INFO   *p_eth_port_ctrl   Ethernet Port Control srtuct.
2917 *      ETH_QUEUE       rx_queue         Number of Rx queue.
2918 *      PKT_INFO        *p_pkt_info       User packet buffer.
2919 *
2920 * OUTPUT:
2921 *      Rx ring current and used indexes are updated.
2922 *
2923 * RETURN:
2924 *      ETH_ERROR in case the routine can not access Rx desc ring.
2925 *      ETH_QUEUE_FULL if Rx ring resources are exhausted.
2926 *      ETH_END_OF_JOB if there is no received data.
2927 *      ETH_OK otherwise.
2928 *
2929 *******************************************************************************/
2930static ETH_FUNC_RET_STATUS eth_port_receive (ETH_PORT_INFO * p_eth_port_ctrl,
2931                                             ETH_QUEUE rx_queue,
2932                                             PKT_INFO * p_pkt_info)
2933{
2934        volatile ETH_RX_DESC *p_rx_curr_desc;
2935        volatile ETH_RX_DESC *p_rx_next_curr_desc;
2936        volatile ETH_RX_DESC *p_rx_used_desc;
2937        unsigned int command_status;
2938
2939        /* Do not process Rx ring in case of Rx ring resource error */
2940        if (p_eth_port_ctrl->rx_resource_err[rx_queue] == true) {
2941                printf ("\nRx Queue is full ...\n");
2942                return ETH_QUEUE_FULL;
2943        }
2944
2945        /* Get the Rx Desc ring 'curr and 'used' indexes */
2946        CURR_RFD_GET (p_rx_curr_desc, rx_queue);
2947        USED_RFD_GET (p_rx_used_desc, rx_queue);
2948
2949        /* Sanity check */
2950        if (p_rx_curr_desc == NULL)
2951                return ETH_ERROR;
2952
2953        /* The following parameters are used to save readings from memory */
2954        p_rx_next_curr_desc = RX_NEXT_DESC_PTR (p_rx_curr_desc, rx_queue);
2955        command_status = p_rx_curr_desc->cmd_sts;
2956
2957        /* Nothing to receive... */
2958        if (command_status & (ETH_BUFFER_OWNED_BY_DMA)) {
2959/*      DP(printf("Rx: command_status: %08x\n", command_status)); */
2960                D_CACHE_FLUSH_LINE ((unsigned int) p_rx_curr_desc, 0);
2961/*      DP(printf("\nETH_END_OF_JOB ...\n"));*/
2962                return ETH_END_OF_JOB;
2963        }
2964
2965        p_pkt_info->byte_cnt = (p_rx_curr_desc->byte_cnt) - RX_BUF_OFFSET;
2966        p_pkt_info->cmd_sts = command_status;
2967        p_pkt_info->buf_ptr = (p_rx_curr_desc->buf_ptr) + RX_BUF_OFFSET;
2968        p_pkt_info->return_info = p_rx_curr_desc->return_info;
2969        p_pkt_info->l4i_chk = p_rx_curr_desc->buf_size; /* IP fragment indicator */
2970
2971        /* Clean the return info field to indicate that the packet has been */
2972        /* moved to the upper layers                                        */
2973        p_rx_curr_desc->return_info = 0;
2974
2975        /* Update 'curr' in data structure */
2976        CURR_RFD_SET (p_rx_next_curr_desc, rx_queue);
2977
2978        /* Rx descriptors resource exhausted. Set the Rx ring resource error flag */
2979        if (p_rx_next_curr_desc == p_rx_used_desc)
2980                p_eth_port_ctrl->rx_resource_err[rx_queue] = true;
2981
2982        D_CACHE_FLUSH_LINE ((unsigned int) p_rx_curr_desc, 0);
2983        CPU_PIPE_FLUSH;
2984        return ETH_OK;
2985}
2986
2987/*******************************************************************************
2988 * eth_rx_return_buff - Returns a Rx buffer back to the Rx ring.
2989 *
2990 * DESCRIPTION:
2991 *      This routine returns a Rx buffer back to the Rx ring. It retrieves the
2992 *      next 'used' descriptor and attached the returned buffer to it.
2993 *      In case the Rx ring was in "resource error" condition, where there are
2994 *      no available Rx resources, the function resets the resource error flag.
2995 *
2996 * INPUT:
2997 *      ETH_PORT_INFO   *p_eth_port_ctrl   Ethernet Port Control srtuct.
2998 *      ETH_QUEUE       rx_queue         Number of Rx queue.
2999 *      PKT_INFO        *p_pkt_info       Information on the returned buffer.
3000 *
3001 * OUTPUT:
3002 *      New available Rx resource in Rx descriptor ring.
3003 *
3004 * RETURN:
3005 *      ETH_ERROR in case the routine can not access Rx desc ring.
3006 *      ETH_OK otherwise.
3007 *
3008 *******************************************************************************/
3009static ETH_FUNC_RET_STATUS eth_rx_return_buff (ETH_PORT_INFO *
3010                                               p_eth_port_ctrl,
3011                                               ETH_QUEUE rx_queue,
3012                                               PKT_INFO * p_pkt_info)
3013{
3014        volatile ETH_RX_DESC *p_used_rx_desc;   /* Where to return Rx resource */
3015
3016        /* Get 'used' Rx descriptor */
3017        USED_RFD_GET (p_used_rx_desc, rx_queue);
3018
3019        /* Sanity check */
3020        if (p_used_rx_desc == NULL)
3021                return ETH_ERROR;
3022
3023        p_used_rx_desc->buf_ptr = p_pkt_info->buf_ptr;
3024        p_used_rx_desc->return_info = p_pkt_info->return_info;
3025        p_used_rx_desc->byte_cnt = p_pkt_info->byte_cnt;
3026        p_used_rx_desc->buf_size = MV64460_RX_BUFFER_SIZE;      /* Reset Buffer size */
3027
3028        /* Flush the write pipe */
3029        CPU_PIPE_FLUSH;
3030
3031        /* Return the descriptor to DMA ownership */
3032        p_used_rx_desc->cmd_sts =
3033                ETH_BUFFER_OWNED_BY_DMA | ETH_RX_ENABLE_INTERRUPT;
3034
3035        /* Flush descriptor and CPU pipe */
3036        D_CACHE_FLUSH_LINE ((unsigned int) p_used_rx_desc, 0);
3037        CPU_PIPE_FLUSH;
3038
3039        /* Move the used descriptor pointer to the next descriptor */
3040        USED_RFD_SET (RX_NEXT_DESC_PTR (p_used_rx_desc, rx_queue), rx_queue);
3041
3042        /* Any Rx return cancels the Rx resource error status */
3043        if (p_eth_port_ctrl->rx_resource_err[rx_queue] == true)
3044                p_eth_port_ctrl->rx_resource_err[rx_queue] = false;
3045
3046        return ETH_OK;
3047}
3048
3049/*******************************************************************************
3050 * eth_port_set_rx_coal - Sets coalescing interrupt mechanism on RX path
3051 *
3052 * DESCRIPTION:
3053 *      This routine sets the RX coalescing interrupt mechanism parameter.
3054 *      This parameter is a timeout counter, that counts in 64 t_clk
3055 *      chunks ; that when timeout event occurs a maskable interrupt
3056 *      occurs.
3057 *      The parameter is calculated using the tClk of the MV-643xx chip
3058 *      , and the required delay of the interrupt in usec.
3059 *
3060 * INPUT:
3061 *      ETH_PORT eth_port_num      Ethernet port number
3062 *      unsigned int t_clk        t_clk of the MV-643xx chip in HZ units
3063 *      unsigned int delay       Delay in usec
3064 *
3065 * OUTPUT:
3066 *      Interrupt coalescing mechanism value is set in MV-643xx chip.
3067 *
3068 * RETURN:
3069 *      The interrupt coalescing value set in the gigE port.
3070 *
3071 *******************************************************************************/
3072#if 0                           /* FIXME */
3073static unsigned int eth_port_set_rx_coal (ETH_PORT eth_port_num,
3074                                          unsigned int t_clk,
3075                                          unsigned int delay)
3076{
3077        unsigned int coal;
3078
3079        coal = ((t_clk / 1000000) * delay) / 64;
3080        /* Set RX Coalescing mechanism */
3081        MV_REG_WRITE (MV64460_ETH_SDMA_CONFIG_REG (eth_port_num),
3082                      ((coal & 0x3fff) << 8) |
3083                      (MV_REG_READ
3084                       (MV64460_ETH_SDMA_CONFIG_REG (eth_port_num))
3085                       & 0xffc000ff));
3086        return coal;
3087}
3088
3089#endif
3090/*******************************************************************************
3091 * eth_port_set_tx_coal - Sets coalescing interrupt mechanism on TX path
3092 *
3093 * DESCRIPTION:
3094 *      This routine sets the TX coalescing interrupt mechanism parameter.
3095 *      This parameter is a timeout counter, that counts in 64 t_clk
3096 *      chunks ; that when timeout event occurs a maskable interrupt
3097 *      occurs.
3098 *      The parameter is calculated using the t_cLK frequency of the
3099 *      MV-643xx chip and the required delay in the interrupt in uSec
3100 *
3101 * INPUT:
3102 *      ETH_PORT eth_port_num      Ethernet port number
3103 *      unsigned int t_clk        t_clk of the MV-643xx chip in HZ units
3104 *      unsigned int delay       Delay in uSeconds
3105 *
3106 * OUTPUT:
3107 *      Interrupt coalescing mechanism value is set in MV-643xx chip.
3108 *
3109 * RETURN:
3110 *      The interrupt coalescing value set in the gigE port.
3111 *
3112 *******************************************************************************/
3113#if 0                           /* FIXME */
3114static unsigned int eth_port_set_tx_coal (ETH_PORT eth_port_num,
3115                                          unsigned int t_clk,
3116                                          unsigned int delay)
3117{
3118        unsigned int coal;
3119
3120        coal = ((t_clk / 1000000) * delay) / 64;
3121        /* Set TX Coalescing mechanism */
3122        MV_REG_WRITE (MV64460_ETH_TX_FIFO_URGENT_THRESHOLD_REG (eth_port_num),
3123                      coal << 4);
3124        return coal;
3125}
3126#endif
3127
3128/*******************************************************************************
3129 * eth_b_copy - Copy bytes from source to destination
3130 *
3131 * DESCRIPTION:
3132 *       This function supports the eight bytes limitation on Tx buffer size.
3133 *       The routine will zero eight bytes starting from the destination address
3134 *       followed by copying bytes from the source address to the destination.
3135 *
3136 * INPUT:
3137 *       unsigned int src_addr    32 bit source address.
3138 *       unsigned int dst_addr    32 bit destination address.
3139 *       int        byte_count    Number of bytes to copy.
3140 *
3141 * OUTPUT:
3142 *       See description.
3143 *
3144 * RETURN:
3145 *       None.
3146 *
3147 *******************************************************************************/
3148static void eth_b_copy (unsigned int src_addr, unsigned int dst_addr,
3149                        int byte_count)
3150{
3151        /* Zero the dst_addr area */
3152        *(unsigned int *) dst_addr = 0x0;
3153
3154        while (byte_count != 0) {
3155                *(char *) dst_addr = *(char *) src_addr;
3156                dst_addr++;
3157                src_addr++;
3158                byte_count--;
3159        }
3160}
3161