uboot/drivers/net/enc28j60_lpc2292.c
<<
>>
Prefs
   1/*
   2 * This program is free software; you can redistribute it and/or
   3 * modify it under the terms of the GNU General Public License as
   4 * published by the Free Software Foundation; either version 2 of
   5 * the License, or (at your option) any later version.
   6 *
   7 * This program is distributed in the hope that it will be useful,
   8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
   9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10 * GNU General Public License for more details.
  11 *
  12 * You should have received a copy of the GNU General Public License
  13 * along with this program; if not, write to the Free Software
  14 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  15 * MA 02111-1307 USA
  16 */
  17
  18#warning This driver is depreciated. Please update to new SPI framework enc28j60 driver
  19#include <config.h>
  20#include <common.h>
  21#include <net.h>
  22#include <asm/arch/hardware.h>
  23#include <asm/arch/spi.h>
  24
  25/*
  26 * Control Registers in Bank 0
  27 */
  28
  29#define CTL_REG_ERDPTL   0x00
  30#define CTL_REG_ERDPTH   0x01
  31#define CTL_REG_EWRPTL   0x02
  32#define CTL_REG_EWRPTH   0x03
  33#define CTL_REG_ETXSTL   0x04
  34#define CTL_REG_ETXSTH   0x05
  35#define CTL_REG_ETXNDL   0x06
  36#define CTL_REG_ETXNDH   0x07
  37#define CTL_REG_ERXSTL   0x08
  38#define CTL_REG_ERXSTH   0x09
  39#define CTL_REG_ERXNDL   0x0A
  40#define CTL_REG_ERXNDH   0x0B
  41#define CTL_REG_ERXRDPTL 0x0C
  42#define CTL_REG_ERXRDPTH 0x0D
  43#define CTL_REG_ERXWRPTL 0x0E
  44#define CTL_REG_ERXWRPTH 0x0F
  45#define CTL_REG_EDMASTL  0x10
  46#define CTL_REG_EDMASTH  0x11
  47#define CTL_REG_EDMANDL  0x12
  48#define CTL_REG_EDMANDH  0x13
  49#define CTL_REG_EDMADSTL 0x14
  50#define CTL_REG_EDMADSTH 0x15
  51#define CTL_REG_EDMACSL  0x16
  52#define CTL_REG_EDMACSH  0x17
  53/* these are common in all banks */
  54#define CTL_REG_EIE      0x1B
  55#define CTL_REG_EIR      0x1C
  56#define CTL_REG_ESTAT    0x1D
  57#define CTL_REG_ECON2    0x1E
  58#define CTL_REG_ECON1    0x1F
  59
  60/*
  61 * Control Registers in Bank 1
  62 */
  63
  64#define CTL_REG_EHT0    0x00
  65#define CTL_REG_EHT1    0x01
  66#define CTL_REG_EHT2    0x02
  67#define CTL_REG_EHT3    0x03
  68#define CTL_REG_EHT4    0x04
  69#define CTL_REG_EHT5    0x05
  70#define CTL_REG_EHT6    0x06
  71#define CTL_REG_EHT7    0x07
  72#define CTL_REG_EPMM0   0x08
  73#define CTL_REG_EPMM1   0x09
  74#define CTL_REG_EPMM2   0x0A
  75#define CTL_REG_EPMM3   0x0B
  76#define CTL_REG_EPMM4   0x0C
  77#define CTL_REG_EPMM5   0x0D
  78#define CTL_REG_EPMM6   0x0E
  79#define CTL_REG_EPMM7   0x0F
  80#define CTL_REG_EPMCSL  0x10
  81#define CTL_REG_EPMCSH  0x11
  82#define CTL_REG_EPMOL   0x14
  83#define CTL_REG_EPMOH   0x15
  84#define CTL_REG_EWOLIE  0x16
  85#define CTL_REG_EWOLIR  0x17
  86#define CTL_REG_ERXFCON 0x18
  87#define CTL_REG_EPKTCNT 0x19
  88
  89/*
  90 * Control Registers in Bank 2
  91 */
  92
  93#define CTL_REG_MACON1   0x00
  94#define CTL_REG_MACON2   0x01
  95#define CTL_REG_MACON3   0x02
  96#define CTL_REG_MACON4   0x03
  97#define CTL_REG_MABBIPG  0x04
  98#define CTL_REG_MAIPGL   0x06
  99#define CTL_REG_MAIPGH   0x07
 100#define CTL_REG_MACLCON1 0x08
 101#define CTL_REG_MACLCON2 0x09
 102#define CTL_REG_MAMXFLL  0x0A
 103#define CTL_REG_MAMXFLH  0x0B
 104#define CTL_REG_MAPHSUP  0x0D
 105#define CTL_REG_MICON    0x11
 106#define CTL_REG_MICMD    0x12
 107#define CTL_REG_MIREGADR 0x14
 108#define CTL_REG_MIWRL    0x16
 109#define CTL_REG_MIWRH    0x17
 110#define CTL_REG_MIRDL    0x18
 111#define CTL_REG_MIRDH    0x19
 112
 113/*
 114 * Control Registers in Bank 3
 115 */
 116
 117#define CTL_REG_MAADR1  0x00
 118#define CTL_REG_MAADR0  0x01
 119#define CTL_REG_MAADR3  0x02
 120#define CTL_REG_MAADR2  0x03
 121#define CTL_REG_MAADR5  0x04
 122#define CTL_REG_MAADR4  0x05
 123#define CTL_REG_EBSTSD  0x06
 124#define CTL_REG_EBSTCON 0x07
 125#define CTL_REG_EBSTCSL 0x08
 126#define CTL_REG_EBSTCSH 0x09
 127#define CTL_REG_MISTAT  0x0A
 128#define CTL_REG_EREVID  0x12
 129#define CTL_REG_ECOCON  0x15
 130#define CTL_REG_EFLOCON 0x17
 131#define CTL_REG_EPAUSL  0x18
 132#define CTL_REG_EPAUSH  0x19
 133
 134
 135/*
 136 * PHY Register
 137 */
 138
 139#define PHY_REG_PHID1 0x02
 140#define PHY_REG_PHID2 0x03
 141/* taken from the Linux driver */
 142#define PHY_REG_PHCON1 0x00
 143#define PHY_REG_PHCON2 0x10
 144#define PHY_REG_PHLCON 0x14
 145
 146/*
 147 * Receive Filter Register (ERXFCON) bits
 148 */
 149
 150#define ENC_RFR_UCEN  0x80
 151#define ENC_RFR_ANDOR 0x40
 152#define ENC_RFR_CRCEN 0x20
 153#define ENC_RFR_PMEN  0x10
 154#define ENC_RFR_MPEN  0x08
 155#define ENC_RFR_HTEN  0x04
 156#define ENC_RFR_MCEN  0x02
 157#define ENC_RFR_BCEN  0x01
 158
 159/*
 160 * ECON1 Register Bits
 161 */
 162
 163#define ENC_ECON1_TXRST  0x80
 164#define ENC_ECON1_RXRST  0x40
 165#define ENC_ECON1_DMAST  0x20
 166#define ENC_ECON1_CSUMEN 0x10
 167#define ENC_ECON1_TXRTS  0x08
 168#define ENC_ECON1_RXEN   0x04
 169#define ENC_ECON1_BSEL1  0x02
 170#define ENC_ECON1_BSEL0  0x01
 171
 172/*
 173 * ECON2 Register Bits
 174 */
 175#define ENC_ECON2_AUTOINC 0x80
 176#define ENC_ECON2_PKTDEC  0x40
 177#define ENC_ECON2_PWRSV   0x20
 178#define ENC_ECON2_VRPS    0x08
 179
 180/*
 181 * EIR Register Bits
 182 */
 183#define ENC_EIR_PKTIF  0x40
 184#define ENC_EIR_DMAIF  0x20
 185#define ENC_EIR_LINKIF 0x10
 186#define ENC_EIR_TXIF   0x08
 187#define ENC_EIR_WOLIF  0x04
 188#define ENC_EIR_TXERIF 0x02
 189#define ENC_EIR_RXERIF 0x01
 190
 191/*
 192 * ESTAT Register Bits
 193 */
 194
 195#define ENC_ESTAT_INT     0x80
 196#define ENC_ESTAT_LATECOL 0x10
 197#define ENC_ESTAT_RXBUSY  0x04
 198#define ENC_ESTAT_TXABRT  0x02
 199#define ENC_ESTAT_CLKRDY  0x01
 200
 201/*
 202 * EIE Register Bits
 203 */
 204
 205#define ENC_EIE_INTIE  0x80
 206#define ENC_EIE_PKTIE  0x40
 207#define ENC_EIE_DMAIE  0x20
 208#define ENC_EIE_LINKIE 0x10
 209#define ENC_EIE_TXIE   0x08
 210#define ENC_EIE_WOLIE  0x04
 211#define ENC_EIE_TXERIE 0x02
 212#define ENC_EIE_RXERIE 0x01
 213
 214/*
 215 * MACON1 Register Bits
 216 */
 217#define ENC_MACON1_LOOPBK  0x10
 218#define ENC_MACON1_TXPAUS  0x08
 219#define ENC_MACON1_RXPAUS  0x04
 220#define ENC_MACON1_PASSALL 0x02
 221#define ENC_MACON1_MARXEN  0x01
 222
 223
 224/*
 225 * MACON2 Register Bits
 226 */
 227#define ENC_MACON2_MARST   0x80
 228#define ENC_MACON2_RNDRST  0x40
 229#define ENC_MACON2_MARXRST 0x08
 230#define ENC_MACON2_RFUNRST 0x04
 231#define ENC_MACON2_MATXRST 0x02
 232#define ENC_MACON2_TFUNRST 0x01
 233
 234/*
 235 * MACON3 Register Bits
 236 */
 237#define ENC_MACON3_PADCFG2 0x80
 238#define ENC_MACON3_PADCFG1 0x40
 239#define ENC_MACON3_PADCFG0 0x20
 240#define ENC_MACON3_TXCRCEN 0x10
 241#define ENC_MACON3_PHDRLEN 0x08
 242#define ENC_MACON3_HFRMEN  0x04
 243#define ENC_MACON3_FRMLNEN 0x02
 244#define ENC_MACON3_FULDPX  0x01
 245
 246/*
 247 * MICMD Register Bits
 248 */
 249#define ENC_MICMD_MIISCAN 0x02
 250#define ENC_MICMD_MIIRD   0x01
 251
 252/*
 253 * MISTAT Register Bits
 254 */
 255#define ENC_MISTAT_NVALID 0x04
 256#define ENC_MISTAT_SCAN   0x02
 257#define ENC_MISTAT_BUSY   0x01
 258
 259/*
 260 * PHID1 and PHID2 values
 261 */
 262#define ENC_PHID1_VALUE 0x0083
 263#define ENC_PHID2_VALUE 0x1400
 264#define ENC_PHID2_MASK  0xFC00
 265
 266
 267#define ENC_SPI_SLAVE_CS 0x00010000     /* pin P1.16 */
 268#define ENC_RESET        0x00020000     /* pin P1.17 */
 269
 270#define FAILSAFE_VALUE 5000
 271
 272/*
 273 * Controller memory layout:
 274 *
 275 * 0x0000 - 0x17ff  6k bytes receive buffer
 276 * 0x1800 - 0x1fff  2k bytes transmit buffer
 277 */
 278/* Use the lower memory for receiver buffer. See errata pt. 5 */
 279#define ENC_RX_BUF_START 0x0000
 280#define ENC_TX_BUF_START 0x1800
 281/* taken from the Linux driver */
 282#define ENC_RX_BUF_END   0x17ff
 283#define ENC_TX_BUF_END   0x1fff
 284
 285/* maximum frame length */
 286#define ENC_MAX_FRM_LEN 1518
 287
 288#define enc_enable() PUT32(IO1CLR, ENC_SPI_SLAVE_CS)
 289#define enc_disable() PUT32(IO1SET, ENC_SPI_SLAVE_CS)
 290#define enc_cfg_spi() spi_set_cfg(0, 0, 0); spi_set_clock(8);
 291
 292
 293static unsigned char encReadReg (unsigned char regNo);
 294static void encWriteReg (unsigned char regNo, unsigned char data);
 295static void encWriteRegRetry (unsigned char regNo, unsigned char data, int c);
 296static void encReadBuff (unsigned short length, unsigned char *pBuff);
 297static void encWriteBuff (unsigned short length, unsigned char *pBuff);
 298static void encBitSet (unsigned char regNo, unsigned char data);
 299static void encBitClr (unsigned char regNo, unsigned char data);
 300static void encReset (void);
 301static void encInit (unsigned char *pEthAddr);
 302static unsigned short phyRead (unsigned char addr);
 303static void phyWrite(unsigned char, unsigned short);
 304static void encPoll (void);
 305static void encRx (void);
 306
 307#define m_nic_read(reg) encReadReg(reg)
 308#define m_nic_write(reg, data) encWriteReg(reg, data)
 309#define m_nic_write_retry(reg, data, count) encWriteRegRetry(reg, data, count)
 310#define m_nic_read_data(len, buf) encReadBuff((len), (buf))
 311#define m_nic_write_data(len, buf) encWriteBuff((len), (buf))
 312
 313/* bit field set */
 314#define m_nic_bfs(reg, data) encBitSet(reg, data)
 315
 316/* bit field clear */
 317#define m_nic_bfc(reg, data) encBitClr(reg, data)
 318
 319static unsigned char bank = 0;  /* current bank in enc28j60 */
 320static unsigned char next_pointer_lsb;
 321static unsigned char next_pointer_msb;
 322
 323static unsigned char buffer[ENC_MAX_FRM_LEN];
 324static int rxResetCounter = 0;
 325
 326#define RX_RESET_COUNTER 1000;
 327
 328/*-----------------------------------------------------------------------------
 329 * Always returns 0
 330 */
 331int eth_init (bd_t * bis)
 332{
 333        unsigned char estatVal;
 334        uchar enetaddr[6];
 335
 336        /* configure GPIO */
 337        (*((volatile unsigned long *) IO1DIR)) |= ENC_SPI_SLAVE_CS;
 338        (*((volatile unsigned long *) IO1DIR)) |= ENC_RESET;
 339
 340        /* CS and RESET active low */
 341        PUT32 (IO1SET, ENC_SPI_SLAVE_CS);
 342        PUT32 (IO1SET, ENC_RESET);
 343
 344        spi_init ();
 345
 346        /* taken from the Linux driver - dangerous stuff here! */
 347        /* Wait for CLKRDY to become set (i.e., check that we can communicate with
 348           the ENC) */
 349        do
 350        {
 351                estatVal = m_nic_read(CTL_REG_ESTAT);
 352        } while ((estatVal & 0x08) || (~estatVal & ENC_ESTAT_CLKRDY));
 353
 354        /* initialize controller */
 355        encReset ();
 356        eth_getenv_enetaddr("ethaddr", enetaddr);
 357        encInit (enetaddr);
 358
 359        m_nic_bfs (CTL_REG_ECON1, ENC_ECON1_RXEN);      /* enable receive */
 360
 361        return 0;
 362}
 363
 364int eth_send (volatile void *packet, int length)
 365{
 366        /* check frame length, etc. */
 367        /* TODO: */
 368
 369        /* switch to bank 0 */
 370        m_nic_bfc (CTL_REG_ECON1, (ENC_ECON1_BSEL1 | ENC_ECON1_BSEL0));
 371
 372        /* set EWRPT */
 373        m_nic_write (CTL_REG_EWRPTL, (ENC_TX_BUF_START & 0xff));
 374        m_nic_write (CTL_REG_EWRPTH, (ENC_TX_BUF_START >> 8));
 375
 376        /* set ETXND */
 377        m_nic_write (CTL_REG_ETXNDL, (length + ENC_TX_BUF_START) & 0xFF);
 378        m_nic_write (CTL_REG_ETXNDH, (length + ENC_TX_BUF_START) >> 8);
 379
 380        /* set ETXST */
 381        m_nic_write (CTL_REG_ETXSTL, ENC_TX_BUF_START & 0xFF);
 382        m_nic_write (CTL_REG_ETXSTH, ENC_TX_BUF_START >> 8);
 383
 384        /* write packet */
 385        m_nic_write_data (length, (unsigned char *) packet);
 386
 387        /* taken from the Linux driver */
 388        /* Verify that the internal transmit logic has not been altered by excessive
 389           collisions.  See Errata B4 12 and 14.
 390         */
 391        if (m_nic_read(CTL_REG_EIR) & ENC_EIR_TXERIF) {
 392                m_nic_bfs(CTL_REG_ECON1, ENC_ECON1_TXRST);
 393                m_nic_bfc(CTL_REG_ECON1, ENC_ECON1_TXRST);
 394        }
 395        m_nic_bfc(CTL_REG_EIR, (ENC_EIR_TXERIF | ENC_EIR_TXIF));
 396
 397        /* set ECON1.TXRTS */
 398        m_nic_bfs (CTL_REG_ECON1, ENC_ECON1_TXRTS);
 399
 400        return 0;
 401}
 402
 403
 404/*****************************************************************************
 405 * This function resets the receiver only. This function may be called from
 406 * interrupt-context.
 407 */
 408static void encReceiverReset (void)
 409{
 410        unsigned char econ1;
 411
 412        econ1 = m_nic_read (CTL_REG_ECON1);
 413        if ((econ1 & ENC_ECON1_RXRST) == 0) {
 414                m_nic_bfs (CTL_REG_ECON1, ENC_ECON1_RXRST);
 415                rxResetCounter = RX_RESET_COUNTER;
 416        }
 417}
 418
 419/*****************************************************************************
 420 * receiver reset timer
 421 */
 422static void encReceiverResetCallback (void)
 423{
 424        m_nic_bfc (CTL_REG_ECON1, ENC_ECON1_RXRST);
 425        m_nic_bfs (CTL_REG_ECON1, ENC_ECON1_RXEN);      /* enable receive */
 426}
 427
 428/*-----------------------------------------------------------------------------
 429 * Check for received packets. Call NetReceive for each packet. The return
 430 * value is ignored by the caller.
 431 */
 432int eth_rx (void)
 433{
 434        if (rxResetCounter > 0 && --rxResetCounter == 0) {
 435                encReceiverResetCallback ();
 436        }
 437
 438        encPoll ();
 439
 440        return 0;
 441}
 442
 443void eth_halt (void)
 444{
 445        m_nic_bfc (CTL_REG_ECON1, ENC_ECON1_RXEN);      /* disable receive */
 446}
 447
 448/*****************************************************************************/
 449
 450static void encPoll (void)
 451{
 452        unsigned char eir_reg;
 453        volatile unsigned char estat_reg;
 454        unsigned char pkt_cnt;
 455
 456#ifdef CONFIG_USE_IRQ
 457        /* clear global interrupt enable bit in enc28j60 */
 458        m_nic_bfc (CTL_REG_EIE, ENC_EIE_INTIE);
 459#endif
 460        estat_reg = m_nic_read (CTL_REG_ESTAT);
 461
 462        eir_reg = m_nic_read (CTL_REG_EIR);
 463
 464        if (eir_reg & ENC_EIR_TXIF) {
 465                /* clear TXIF bit in EIR */
 466                m_nic_bfc (CTL_REG_EIR, ENC_EIR_TXIF);
 467        }
 468
 469        /* We have to use pktcnt and not pktif bit, see errata pt. 6 */
 470
 471        /* move to bank 1 */
 472        m_nic_bfc (CTL_REG_ECON1, ENC_ECON1_BSEL1);
 473        m_nic_bfs (CTL_REG_ECON1, ENC_ECON1_BSEL0);
 474
 475        /* read pktcnt */
 476        pkt_cnt = m_nic_read (CTL_REG_EPKTCNT);
 477
 478        if (pkt_cnt > 0) {
 479                if ((eir_reg & ENC_EIR_PKTIF) == 0) {
 480                        /*printf("encPoll: pkt cnt > 0, but pktif not set\n"); */
 481                }
 482                encRx ();
 483                /* clear PKTIF bit in EIR, this should not need to be done but it
 484                   seems like we get problems if we do not */
 485                m_nic_bfc (CTL_REG_EIR, ENC_EIR_PKTIF);
 486        }
 487
 488        if (eir_reg & ENC_EIR_RXERIF) {
 489                printf ("encPoll: rx error\n");
 490                m_nic_bfc (CTL_REG_EIR, ENC_EIR_RXERIF);
 491        }
 492        if (eir_reg & ENC_EIR_TXERIF) {
 493                printf ("encPoll: tx error\n");
 494                m_nic_bfc (CTL_REG_EIR, ENC_EIR_TXERIF);
 495        }
 496
 497#ifdef CONFIG_USE_IRQ
 498        /* set global interrupt enable bit in enc28j60 */
 499        m_nic_bfs (CTL_REG_EIE, ENC_EIE_INTIE);
 500#endif
 501}
 502
 503static void encRx (void)
 504{
 505        unsigned short pkt_len;
 506        unsigned short copy_len;
 507        unsigned short status;
 508        unsigned char eir_reg;
 509        unsigned char pkt_cnt = 0;
 510        unsigned short rxbuf_rdpt;
 511
 512        /* switch to bank 0 */
 513        m_nic_bfc (CTL_REG_ECON1, (ENC_ECON1_BSEL1 | ENC_ECON1_BSEL0));
 514
 515        m_nic_write (CTL_REG_ERDPTL, next_pointer_lsb);
 516        m_nic_write (CTL_REG_ERDPTH, next_pointer_msb);
 517
 518        do {
 519                m_nic_read_data (6, buffer);
 520                next_pointer_lsb = buffer[0];
 521                next_pointer_msb = buffer[1];
 522                pkt_len = buffer[2];
 523                pkt_len |= (unsigned short) buffer[3] << 8;
 524                status = buffer[4];
 525                status |= (unsigned short) buffer[5] << 8;
 526
 527                if (pkt_len <= ENC_MAX_FRM_LEN)
 528                        copy_len = pkt_len;
 529                else
 530                        copy_len = 0;
 531
 532                if ((status & (1L << 7)) == 0) /* check Received Ok bit */
 533                        copy_len = 0;
 534
 535                /* taken from the Linux driver */
 536                /* check if next pointer is resonable */
 537                if ((((unsigned int)next_pointer_msb << 8) |
 538                        (unsigned int)next_pointer_lsb) >= ENC_TX_BUF_START)
 539                        copy_len = 0;
 540
 541                if (copy_len > 0) {
 542                        m_nic_read_data (copy_len, buffer);
 543                }
 544
 545                /* advance read pointer to next pointer */
 546                m_nic_write (CTL_REG_ERDPTL, next_pointer_lsb);
 547                m_nic_write (CTL_REG_ERDPTH, next_pointer_msb);
 548
 549                /* decrease packet counter */
 550                m_nic_bfs (CTL_REG_ECON2, ENC_ECON2_PKTDEC);
 551
 552                /* taken from the Linux driver */
 553                /* Only odd values should be written to ERXRDPTL,
 554                 * see errata B4 pt.13
 555                 */
 556                rxbuf_rdpt = (next_pointer_msb << 8 | next_pointer_lsb) - 1;
 557                if ((rxbuf_rdpt < (m_nic_read(CTL_REG_ERXSTH) << 8 |
 558                                m_nic_read(CTL_REG_ERXSTL))) || (rxbuf_rdpt >
 559                                (m_nic_read(CTL_REG_ERXNDH) << 8 |
 560                                m_nic_read(CTL_REG_ERXNDL)))) {
 561                        m_nic_write(CTL_REG_ERXRDPTL, m_nic_read(CTL_REG_ERXNDL));
 562                        m_nic_write(CTL_REG_ERXRDPTH, m_nic_read(CTL_REG_ERXNDH));
 563                } else {
 564                        m_nic_write(CTL_REG_ERXRDPTL, rxbuf_rdpt & 0xFF);
 565                        m_nic_write(CTL_REG_ERXRDPTH, rxbuf_rdpt >> 8);
 566                }
 567
 568                /* move to bank 1 */
 569                m_nic_bfc (CTL_REG_ECON1, ENC_ECON1_BSEL1);
 570                m_nic_bfs (CTL_REG_ECON1, ENC_ECON1_BSEL0);
 571
 572                /* read pktcnt */
 573                pkt_cnt = m_nic_read (CTL_REG_EPKTCNT);
 574
 575                /* switch to bank 0 */
 576                m_nic_bfc (CTL_REG_ECON1,
 577                           (ENC_ECON1_BSEL1 | ENC_ECON1_BSEL0));
 578
 579                if (copy_len == 0) {
 580                        eir_reg = m_nic_read (CTL_REG_EIR);
 581                        encReceiverReset ();
 582                        printf ("eth_rx: copy_len=0\n");
 583                        continue;
 584                }
 585
 586                NetReceive ((unsigned char *) buffer, pkt_len);
 587
 588                eir_reg = m_nic_read (CTL_REG_EIR);
 589        } while (pkt_cnt);      /* Use EPKTCNT not EIR.PKTIF flag, see errata pt. 6 */
 590}
 591
 592static void encWriteReg (unsigned char regNo, unsigned char data)
 593{
 594        spi_lock ();
 595        enc_cfg_spi ();
 596        enc_enable ();
 597
 598        spi_write (0x40 | regNo);       /* write in regNo */
 599        spi_write (data);
 600
 601        enc_disable ();
 602        enc_enable ();
 603
 604        spi_write (0x1f);       /* write reg 0x1f */
 605
 606        enc_disable ();
 607        spi_unlock ();
 608}
 609
 610static void encWriteRegRetry (unsigned char regNo, unsigned char data, int c)
 611{
 612        unsigned char readback;
 613        int i;
 614
 615        spi_lock ();
 616
 617        for (i = 0; i < c; i++) {
 618                enc_cfg_spi ();
 619                enc_enable ();
 620
 621                spi_write (0x40 | regNo);       /* write in regNo */
 622                spi_write (data);
 623
 624                enc_disable ();
 625                enc_enable ();
 626
 627                spi_write (0x1f);       /* write reg 0x1f */
 628
 629                enc_disable ();
 630
 631                spi_unlock ();  /* we must unlock spi first */
 632
 633                readback = encReadReg (regNo);
 634
 635                spi_lock ();
 636
 637                if (readback == data)
 638                        break;
 639        }
 640        spi_unlock ();
 641
 642        if (i == c) {
 643                printf ("enc28j60: write reg %d failed\n", regNo);
 644        }
 645}
 646
 647static unsigned char encReadReg (unsigned char regNo)
 648{
 649        unsigned char rxByte;
 650
 651        spi_lock ();
 652        enc_cfg_spi ();
 653        enc_enable ();
 654
 655        spi_write (0x1f);       /* read reg 0x1f */
 656
 657        bank = spi_read () & 0x3;
 658
 659        enc_disable ();
 660        enc_enable ();
 661
 662        spi_write (regNo);
 663        rxByte = spi_read ();
 664
 665        /* check if MAC or MII register */
 666        if (((bank == 2) && (regNo <= 0x1a)) ||
 667            ((bank == 3) && (regNo <= 0x05 || regNo == 0x0a))) {
 668                /* ignore first byte and read another byte */
 669                rxByte = spi_read ();
 670        }
 671
 672        enc_disable ();
 673        spi_unlock ();
 674
 675        return rxByte;
 676}
 677
 678static void encReadBuff (unsigned short length, unsigned char *pBuff)
 679{
 680        spi_lock ();
 681        enc_cfg_spi ();
 682        enc_enable ();
 683
 684        spi_write (0x20 | 0x1a);        /* read buffer memory */
 685
 686        while (length--) {
 687                if (pBuff != NULL)
 688                        *pBuff++ = spi_read ();
 689                else
 690                        spi_write (0);
 691        }
 692
 693        enc_disable ();
 694        spi_unlock ();
 695}
 696
 697static void encWriteBuff (unsigned short length, unsigned char *pBuff)
 698{
 699        spi_lock ();
 700        enc_cfg_spi ();
 701        enc_enable ();
 702
 703        spi_write (0x60 | 0x1a);        /* write buffer memory */
 704
 705        spi_write (0x00);       /* control byte */
 706
 707        while (length--)
 708                spi_write (*pBuff++);
 709
 710        enc_disable ();
 711        spi_unlock ();
 712}
 713
 714static void encBitSet (unsigned char regNo, unsigned char data)
 715{
 716        spi_lock ();
 717        enc_cfg_spi ();
 718        enc_enable ();
 719
 720        spi_write (0x80 | regNo);       /* bit field set */
 721        spi_write (data);
 722
 723        enc_disable ();
 724        spi_unlock ();
 725}
 726
 727static void encBitClr (unsigned char regNo, unsigned char data)
 728{
 729        spi_lock ();
 730        enc_cfg_spi ();
 731        enc_enable ();
 732
 733        spi_write (0xA0 | regNo);       /* bit field clear */
 734        spi_write (data);
 735
 736        enc_disable ();
 737        spi_unlock ();
 738}
 739
 740static void encReset (void)
 741{
 742        spi_lock ();
 743        enc_cfg_spi ();
 744        enc_enable ();
 745
 746        spi_write (0xff);       /* soft reset */
 747
 748        enc_disable ();
 749        spi_unlock ();
 750
 751        /* sleep 1 ms. See errata pt. 2 */
 752        udelay (1000);
 753}
 754
 755static void encInit (unsigned char *pEthAddr)
 756{
 757        unsigned short phid1 = 0;
 758        unsigned short phid2 = 0;
 759
 760        /* switch to bank 0 */
 761        m_nic_bfc (CTL_REG_ECON1, (ENC_ECON1_BSEL1 | ENC_ECON1_BSEL0));
 762
 763        /*
 764         * Setup the buffer space. The reset values are valid for the
 765         * other pointers.
 766         */
 767        /* We shall not write to ERXST, see errata pt. 5. Instead we
 768           have to make sure that ENC_RX_BUS_START is 0. */
 769        m_nic_write_retry (CTL_REG_ERXSTL, (ENC_RX_BUF_START & 0xFF), 1);
 770        m_nic_write_retry (CTL_REG_ERXSTH, (ENC_RX_BUF_START >> 8), 1);
 771
 772        /* taken from the Linux driver */
 773        m_nic_write_retry (CTL_REG_ERXNDL, (ENC_RX_BUF_END & 0xFF), 1);
 774        m_nic_write_retry (CTL_REG_ERXNDH, (ENC_RX_BUF_END >> 8), 1);
 775
 776        m_nic_write_retry (CTL_REG_ERDPTL, (ENC_RX_BUF_START & 0xFF), 1);
 777        m_nic_write_retry (CTL_REG_ERDPTH, (ENC_RX_BUF_START >> 8), 1);
 778
 779        next_pointer_lsb = (ENC_RX_BUF_START & 0xFF);
 780        next_pointer_msb = (ENC_RX_BUF_START >> 8);
 781
 782        /* verify identification */
 783        phid1 = phyRead (PHY_REG_PHID1);
 784        phid2 = phyRead (PHY_REG_PHID2);
 785
 786        if (phid1 != ENC_PHID1_VALUE
 787            || (phid2 & ENC_PHID2_MASK) != ENC_PHID2_VALUE) {
 788                printf ("ERROR: failed to identify controller\n");
 789                printf ("phid1 = %x, phid2 = %x\n",
 790                        phid1, (phid2 & ENC_PHID2_MASK));
 791                printf ("should be phid1 = %x, phid2 = %x\n",
 792                        ENC_PHID1_VALUE, ENC_PHID2_VALUE);
 793        }
 794
 795        /*
 796         * --- MAC Initialization ---
 797         */
 798
 799        /* Pull MAC out of Reset */
 800
 801        /* switch to bank 2 */
 802        m_nic_bfc (CTL_REG_ECON1, ENC_ECON1_BSEL0);
 803        m_nic_bfs (CTL_REG_ECON1, ENC_ECON1_BSEL1);
 804
 805        /* enable MAC to receive frames */
 806        /* added some bits from the Linux driver */
 807        m_nic_write_retry (CTL_REG_MACON1
 808                ,(ENC_MACON1_MARXEN | ENC_MACON1_TXPAUS | ENC_MACON1_RXPAUS)
 809                ,10);
 810
 811        /* configure pad, tx-crc and duplex */
 812        /* added a bit from the Linux driver */
 813        m_nic_write_retry (CTL_REG_MACON3
 814                ,(ENC_MACON3_PADCFG0 | ENC_MACON3_TXCRCEN | ENC_MACON3_FRMLNEN)
 815                ,10);
 816
 817        /* added 4 new lines from the Linux driver */
 818        /* Allow infinite deferals if the medium is continously busy */
 819        m_nic_write_retry(CTL_REG_MACON4, (1<<6) /*ENC_MACON4_DEFER*/, 10);
 820
 821        /* Late collisions occur beyond 63 bytes */
 822        m_nic_write_retry(CTL_REG_MACLCON2, 63, 10);
 823
 824        /* Set (low byte) Non-Back-to_Back Inter-Packet Gap. Recommended 0x12 */
 825        m_nic_write_retry(CTL_REG_MAIPGL, 0x12, 10);
 826
 827        /*
 828        * Set (high byte) Non-Back-to_Back Inter-Packet Gap. Recommended
 829        * 0x0c for half-duplex. Nothing for full-duplex
 830        */
 831        m_nic_write_retry(CTL_REG_MAIPGH, 0x0C, 10);
 832
 833        /* set maximum frame length */
 834        m_nic_write_retry (CTL_REG_MAMXFLL, (ENC_MAX_FRM_LEN & 0xff), 10);
 835        m_nic_write_retry (CTL_REG_MAMXFLH, (ENC_MAX_FRM_LEN >> 8), 10);
 836
 837        /*
 838         * Set MAC back-to-back inter-packet gap. Recommended 0x12 for half duplex
 839         * and 0x15 for full duplex.
 840         */
 841        m_nic_write_retry (CTL_REG_MABBIPG, 0x12, 10);
 842
 843        /* set MAC address */
 844
 845        /* switch to bank 3 */
 846        m_nic_bfs (CTL_REG_ECON1, (ENC_ECON1_BSEL0 | ENC_ECON1_BSEL1));
 847
 848        m_nic_write_retry (CTL_REG_MAADR0, pEthAddr[5], 1);
 849        m_nic_write_retry (CTL_REG_MAADR1, pEthAddr[4], 1);
 850        m_nic_write_retry (CTL_REG_MAADR2, pEthAddr[3], 1);
 851        m_nic_write_retry (CTL_REG_MAADR3, pEthAddr[2], 1);
 852        m_nic_write_retry (CTL_REG_MAADR4, pEthAddr[1], 1);
 853        m_nic_write_retry (CTL_REG_MAADR5, pEthAddr[0], 1);
 854
 855        /*
 856        * PHY Initialization taken from the Linux driver
 857         */
 858
 859        /* Prevent automatic loopback of data beeing transmitted by setting
 860           ENC_PHCON2_HDLDIS */
 861        phyWrite(PHY_REG_PHCON2, (1<<8));
 862
 863        /* LEDs configuration
 864         * LEDA: LACFG = 0100 -> display link status
 865         * LEDB: LBCFG = 0111 -> display TX & RX activity
 866         * STRCH = 1 -> LED pulses
 867         */
 868        phyWrite(PHY_REG_PHLCON, 0x0472);
 869
 870        /* Reset PDPXMD-bit => half duplex */
 871        phyWrite(PHY_REG_PHCON1, 0);
 872
 873        /*
 874         * Receive settings
 875         */
 876
 877#ifdef CONFIG_USE_IRQ
 878        /* enable interrupts */
 879        m_nic_bfs (CTL_REG_EIE, ENC_EIE_PKTIE);
 880        m_nic_bfs (CTL_REG_EIE, ENC_EIE_TXIE);
 881        m_nic_bfs (CTL_REG_EIE, ENC_EIE_RXERIE);
 882        m_nic_bfs (CTL_REG_EIE, ENC_EIE_TXERIE);
 883        m_nic_bfs (CTL_REG_EIE, ENC_EIE_INTIE);
 884#endif
 885}
 886
 887/*****************************************************************************
 888 *
 889 * Description:
 890 *    Read PHY registers.
 891 *
 892 *    NOTE! This function will change to Bank 2.
 893 *
 894 * Params:
 895 *    [in] addr address of the register to read
 896 *
 897 * Returns:
 898 *    The value in the register
 899 */
 900static unsigned short phyRead (unsigned char addr)
 901{
 902        unsigned short ret = 0;
 903
 904        /* move to bank 2 */
 905        m_nic_bfc (CTL_REG_ECON1, ENC_ECON1_BSEL0);
 906        m_nic_bfs (CTL_REG_ECON1, ENC_ECON1_BSEL1);
 907
 908        /* write address to MIREGADR */
 909        m_nic_write (CTL_REG_MIREGADR, addr);
 910
 911        /* set MICMD.MIIRD */
 912        m_nic_write (CTL_REG_MICMD, ENC_MICMD_MIIRD);
 913
 914        /* taken from the Linux driver */
 915        /* move to bank 3 */
 916        m_nic_bfs(CTL_REG_ECON1, ENC_ECON1_BSEL0);
 917        m_nic_bfs(CTL_REG_ECON1, ENC_ECON1_BSEL1);
 918
 919        /* poll MISTAT.BUSY bit until operation is complete */
 920        while ((m_nic_read (CTL_REG_MISTAT) & ENC_MISTAT_BUSY) != 0) {
 921                static int cnt = 0;
 922
 923                if (cnt++ >= 1000) {
 924                        /* GJ - this seems extremely dangerous! */
 925                        /* printf("#"); */
 926                        cnt = 0;
 927                }
 928        }
 929
 930        /* taken from the Linux driver */
 931        /* move to bank 2 */
 932        m_nic_bfc(CTL_REG_ECON1, ENC_ECON1_BSEL0);
 933        m_nic_bfs(CTL_REG_ECON1, ENC_ECON1_BSEL1);
 934
 935        /* clear MICMD.MIIRD */
 936        m_nic_write (CTL_REG_MICMD, 0);
 937
 938        ret = (m_nic_read (CTL_REG_MIRDH) << 8);
 939        ret |= (m_nic_read (CTL_REG_MIRDL) & 0xFF);
 940
 941        return ret;
 942}
 943
 944/*****************************************************************************
 945 *
 946 * Taken from the Linux driver.
 947 * Description:
 948 * Write PHY registers.
 949 *
 950 * NOTE! This function will change to Bank 3.
 951 *
 952 * Params:
 953 * [in] addr address of the register to write to
 954 * [in] data to be written
 955 *
 956 * Returns:
 957 *    None
 958 */
 959static void phyWrite(unsigned char addr, unsigned short data)
 960{
 961        /* move to bank 2 */
 962        m_nic_bfc(CTL_REG_ECON1, ENC_ECON1_BSEL0);
 963        m_nic_bfs(CTL_REG_ECON1, ENC_ECON1_BSEL1);
 964
 965        /* write address to MIREGADR */
 966        m_nic_write(CTL_REG_MIREGADR, addr);
 967
 968        m_nic_write(CTL_REG_MIWRL, data & 0xff);
 969        m_nic_write(CTL_REG_MIWRH, data >> 8);
 970
 971        /* move to bank 3 */
 972        m_nic_bfs(CTL_REG_ECON1, ENC_ECON1_BSEL0);
 973        m_nic_bfs(CTL_REG_ECON1, ENC_ECON1_BSEL1);
 974
 975        /* poll MISTAT.BUSY bit until operation is complete */
 976        while((m_nic_read(CTL_REG_MISTAT) & ENC_MISTAT_BUSY) != 0) {
 977                static int cnt = 0;
 978
 979                if(cnt++ >= 1000) {
 980                        cnt = 0;
 981                }
 982        }
 983}
 984