source: rtems/c/src/lib/libbsp/powerpc/gen83xx/network/network.c @ 760ef104

4.115
Last change on this file since 760ef104 was 760ef104, checked in by Sebastian Huber <sebastian.huber@…>, on 01/24/11 at 11:53:24

2011-01-24 Sebastian Huber <sebastian.huber@…>

  • network/network.c: Typo.
  • Property mode set to 100644
File size: 7.6 KB
RevLine 
[f610e83f]1/*===============================================================*\
2| Project: RTEMS support for MPC83xx                              |
3+-----------------------------------------------------------------+
4|                    Copyright (c) 2007                           |
5|                    Embedded Brains GmbH                         |
6|                    Obere Lagerstr. 30                           |
7|                    D-82178 Puchheim                             |
8|                    Germany                                      |
9|                    rtems@embedded-brains.de                     |
10+-----------------------------------------------------------------+
11| The license and distribution terms for this file may be         |
12| found in the file LICENSE in this distribution or at            |
13|                                                                 |
14| http://www.rtems.com/license/LICENSE.                           |
15|                                                                 |
16+-----------------------------------------------------------------+
17| this file contains the board specific portion                   |
18| of the network interface driver                                 |
19\*===============================================================*/
20
21#include <rtems.h>
22#include <rtems/rtems_bsdnet.h>
[3df08660]23#include <rtems/rtems_bsdnet_internal.h>
[f610e83f]24#include <bsp.h>
[ce0922e]25#include <bsp/tsec.h>
26#include <bsp/u-boot.h>
[f610e83f]27#include <mpc83xx/mpc83xx.h>
[0e1d590c]28#include <string.h>
29#include <libcpu/spr.h>
[f610e83f]30
31#define TSEC_IFMODE_RGMII 0
32#define TSEC_IFMODE_GMII  1
[42bf1b9]33
[574fb67]34#if defined( MPC8313ERDB)
35
[214cbd9]36#define TSEC_IFMODE TSEC_IFMODE_RGMII
[42bf1b9]37
[574fb67]38#elif defined( MPC8349EAMDS)
39
[677cf05f]40#define TSEC_IFMODE TSEC_IFMODE_GMII
[574fb67]41
42#elif defined( HSC_CM01)
43
[f610e83f]44#define TSEC_IFMODE TSEC_IFMODE_RGMII
[574fb67]45
46#else
47
48#warning No TSEC configuration available
49
[42bf1b9]50#endif
[f610e83f]51
[0e1d590c]52/* System Version Register */
53#define SVR 286
54SPR_RO( SVR)
55
56/* Processor Version Register */
57SPR_RO( PVR)
58
[f610e83f]59/*=========================================================================*\
60| Function:                                                                 |
61\*-------------------------------------------------------------------------*/
62int BSP_tsec_attach
63(
64/*-------------------------------------------------------------------------*\
65| Purpose:                                                                  |
66|   attach or detach the driver                                             |
67+---------------------------------------------------------------------------+
68| Input Parameters:                                                         |
69\*-------------------------------------------------------------------------*/
70 struct rtems_bsdnet_ifconfig *config, /* interface configuration          */
71 int attaching                         /* 0 = detach, else attach          */
72)
73/*-------------------------------------------------------------------------*\
74| Return Value:                                                             |
75|    1, if success                                                       |
76\*=========================================================================*/
77{
[0e1d590c]78  tsec_config tsec_cfg;
[f610e83f]79  int    unitNumber;
[ce0922e]80  char *unitName;
[0e1d590c]81  uint32_t svr = _read_SVR();
82  uint32_t pvr = _read_PVR();
83
84  memset(&tsec_cfg, 0, sizeof(tsec_cfg));
85  config->drv_ctrl = &tsec_cfg;
[f610e83f]86
87  /*
88   * Parse driver name
89   */
[ce0922e]90  if((unitNumber = rtems_bsdnet_parse_driver_name(config, &unitName)) < 0) {
[f610e83f]91    return 0;
92  }
[0e1d590c]93
94  tsec_cfg.reg_ptr = &mpc83xx.tsec [unitNumber - 1];
95  tsec_cfg.mdio_ptr = &mpc83xx.tsec [0];
96
[f610e83f]97  if (attaching) {
[42bf1b9]98#if (TSEC_IFMODE==TSEC_IFMODE_GMII)
[4b23c94]99#if !defined(HSC_CM01)
100
101      /*
102       * do not change system I/O configuration registers on HSC board
103       * because should initialize from RCW
104       */
105
106
[f610e83f]107    if (unitNumber == 1) {
108      /*
[ac7af4a]109       * init system I/O configuration registers
110       * to ensure proper pin functions
[f610e83f]111       */
[59be902]112      mpc83xx.syscon.sicrh = mpc83xx.syscon.sicrh & ~0x1F800000;
[f610e83f]113      /*
114       * init port registers (GPIO2DIR) for TSEC1
115       */
116      mpc83xx.gpio[1].gpdir = ((mpc83xx.gpio[1].gpdir & ~0x00000FFF)
117                               |                         0x0000001f);
118    }
[42bf1b9]119    if (unitNumber == 2) {
[59be902]120      /*
[ac7af4a]121       * init system I/O configuration registers
122       * to ensure proper pin functions
[59be902]123       */
124      mpc83xx.syscon.sicrh = mpc83xx.syscon.sicrh & ~0x007f8000;
[42bf1b9]125      /*
126       * init port registers (GPIO2DIR) for TSEC2
127       */
128      mpc83xx.gpio[0].gpdir = ((mpc83xx.gpio[0].gpdir & ~0x000FFFFF)
129                               |                         0x00087881);
130    }
[4b23c94]131#endif /* !defined(HSC_CM01) */
[42bf1b9]132#endif
133#if (TSEC_IFMODE==TSEC_IFMODE_RGMII)
134
[f610e83f]135    /*
[42bf1b9]136     * Nothing special needed for TSEC1 operation
[f610e83f]137     */
[ac7af4a]138#endif
[f610e83f]139  }
140  /*
141   * add MAC address into config->hardware_adderss
142   * FIXME: get the real address we need
143   */
144  if (config->hardware_address == NULL) {
[d11ea4eb]145#if !defined(HAS_UBOOT)
[45c8fb6]146    static char hw_addr [TSEC_COUNT][6];
[760ef104]147    volatile tsec_registers *reg_ptr = tsec_cfg.reg_ptr;
[d11ea4eb]148
149    /* read MAC address from hardware register */
150    /* we expect it htere from the boot loader */
151    config->hardware_address = hw_addr[unitNumber-1];
[ac7af4a]152
[d11ea4eb]153    hw_addr[unitNumber-1][5] = (reg_ptr->macstnaddr[0] >> 24) & 0xff;
154    hw_addr[unitNumber-1][4] = (reg_ptr->macstnaddr[0] >> 16) & 0xff;
155    hw_addr[unitNumber-1][3] = (reg_ptr->macstnaddr[0] >>  8) & 0xff;
156    hw_addr[unitNumber-1][2] = (reg_ptr->macstnaddr[0] >>  0) & 0xff;
157    hw_addr[unitNumber-1][1] = (reg_ptr->macstnaddr[1] >> 24) & 0xff;
158    hw_addr[unitNumber-1][0] = (reg_ptr->macstnaddr[1] >> 16) & 0xff;
159#endif
[574fb67]160
[d11ea4eb]161#if defined(HAS_UBOOT)
[574fb67]162    switch (unitNumber) {
163      case 1:
[ac4b164]164        config->hardware_address = bsp_uboot_board_info.bi_enetaddr;
[574fb67]165        break;
166
167#ifdef CONFIG_HAS_ETH1
168      case 2:
[ac4b164]169        config->hardware_address = bsp_uboot_board_info.bi_enet1addr;
[574fb67]170        break;
171#endif /* CONFIG_HAS_ETH1 */
172
173#ifdef CONFIG_HAS_ETH2
174      case 3:
[ac4b164]175        config->hardware_address = bsp_uboot_board_info.bi_enet2addr;
[574fb67]176        break;
177#endif /* CONFIG_HAS_ETH2 */
178
179#ifdef CONFIG_HAS_ETH3
180      case 4:
[ac4b164]181        config->hardware_address = bsp_uboot_board_info.bi_enet3addr;
[574fb67]182        break;
183#endif /* CONFIG_HAS_ETH3 */
184
185      default:
186        return 0;
187    }
188
189#endif /* HAS_UBOOT */
190
[f610e83f]191  }
192  /*
193   * set interrupt number for given interface
194   */
[699c2be]195  config->irno = (unsigned) (
196      unitNumber == 1
197      ? BSP_IPIC_IRQ_TSEC1_TX
198      : BSP_IPIC_IRQ_TSEC2_TX
199    );
[0e1d590c]200
201  if (svr == 0x80b00010 && pvr == 0x80850010) {
202    /*
203     * This is a special case for MPC8313ERDB with silicon revision 1.  Look in
204     * "MPC8313ECE Rev. 3, 3/2008" errata for "IPIC 1".
205     */
206    if (unitNumber == 1) {
207      tsec_cfg.irq_num_tx      = 37;
208      tsec_cfg.irq_num_rx      = 36;
209      tsec_cfg.irq_num_err     = 35;
210    } else if (unitNumber == 2) {
211      tsec_cfg.irq_num_tx      = 34;
212      tsec_cfg.irq_num_rx      = 33;
213      tsec_cfg.irq_num_err     = 32;
214    } else {
215      return 0;
216    }
217  } else {
218    rtems_irq_number irno = unitNumber == 1 ?
219      BSP_IPIC_IRQ_TSEC1_TX : BSP_IPIC_IRQ_TSEC2_TX;
220
221    /* get base interrupt number (for Tx irq, Rx=base+1,Err=base+2) */
222    tsec_cfg.irq_num_tx = irno + 0;
223    tsec_cfg.irq_num_rx = irno + 1;
224    tsec_cfg.irq_num_err = irno + 2;
225  }
226
227  /*
228   * XXX: Although most hardware builders will assign the PHY addresses
229   * like this, this should be more configurable
230   */
231#ifdef MPC8313ERDB
232  if (unitNumber == 2) {
233          tsec_cfg.phy_default = 4;
234  } else {
235          /* TODO */
236          return 0;
237  }
238#else /* MPC8313ERDB */
239  tsec_cfg.phy_default = unitNumber-1;
240#endif /* MPC8313ERDB */
241
242  tsec_cfg.unit_number = unitNumber;
243  tsec_cfg.unit_name = unitName;
244
[f610e83f]245  /*
246   * call attach function of board independent driver
247   */
[0e1d590c]248  return tsec_driver_attach_detach(config, attaching);
[f610e83f]249}
Note: See TracBrowser for help on using the repository browser.