Changeset 81291a0 in rtems


Ignore:
Timestamp:
Jun 29, 2005, 8:09:14 PM (15 years ago)
Author:
Eric Norum <WENorum@…>
Branches:
4.10, 4.11, 4.8, 4.9, master
Children:
5eb336b
Parents:
cdb717e
Message:

Add duplex negotation support.

Location:
c/src/lib/libbsp/m68k/uC5282
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • c/src/lib/libbsp/m68k/uC5282/ChangeLog

    rcdb717e r81291a0  
     12005-06-28  Eric Norum <norume@aps.anl.gov>
     2
     3        * network/network.c: Add full/half-duplex auto-negotiation support.
     4
    152005-06-20  Eric Norum <norume@aps.anl.gov>
    26
  • c/src/lib/libbsp/m68k/uC5282/network/network.c

    rcdb717e r81291a0  
    11/*
    2  * RTEMS/TCPIP driver for MCF5282 Fast Ethernet Controller
     2 * RTEMS driver for MCF5282 Fast Ethernet Controller
    33 */
    44
     
    3131#define FEC_INTC0_TX_VECTOR (64+23)
    3232#define FEC_INTC0_RX_VECTOR (64+27)
     33#define MII_VECTOR (64+7)  /* IRQ7* pin connected to external transceiver */
     34#define MII_EPPAR  MCF5282_EPORT_EPPAR_EPPA7_LEVEL
     35#define MII_EPDDR  MCF5282_EPORT_EPDDR_EPDD7
     36#define MII_EPIER  MCF5282_EPORT_EPIER_EPIE7
     37#define MII_EPPDR  MCF5282_EPORT_EPPDR_EPPD7
    3338
    3439/*
     
    97102    unsigned long   rxInterrupts;
    98103    unsigned long   txInterrupts;
     104    unsigned long   miiInterrupts;
    99105    unsigned long   txRawWait;
    100106    unsigned long   txRealign;
    101107    unsigned long   txRealignDrop;
     108    uint16_t        mii_sr2;
    102109};
    103110static struct mcf5282_enet_struct enet_driver[NIFACES];
    104111
    105 static rtems_isr
    106 mcf5282_fec_rx_interrupt_handler( rtems_vector_number v )
    107 {
    108     MCF5282_FEC_EIR = MCF5282_FEC_EIR_RXF;
    109     MCF5282_FEC_EIMR &= ~MCF5282_FEC_EIMR_RXF;   
    110     enet_driver[0].rxInterrupts++;
    111     rtems_event_send(enet_driver[0].rxDaemonTid, RX_INTERRUPT_EVENT);
    112 }
    113 
    114 static rtems_isr
    115 mcf5282_fec_tx_interrupt_handler( rtems_vector_number v )
    116 {
    117     MCF5282_FEC_EIR = MCF5282_FEC_EIR_TXF;
    118     MCF5282_FEC_EIMR &= ~MCF5282_FEC_EIMR_TXF;   
    119     enet_driver[0].txInterrupts++;
    120     rtems_event_send(enet_driver[0].txDaemonTid, TX_INTERRUPT_EVENT);
    121 }
    122 
    123 /*
    124  * Allocate buffer descriptors from (non-cached) on-chip static RAM
    125  * Ensure 128-bit (16-byte) alignment
    126  */
    127 static mcf5282BufferDescriptor_t *
    128 mcf5282_bd_allocate(unsigned int count)
    129 {
    130     extern char __SRAMBASE[];
    131     static mcf5282BufferDescriptor_t *bdp = (mcf5282BufferDescriptor_t *)__SRAMBASE;
    132     mcf5282BufferDescriptor_t *p = bdp;
    133 
    134     bdp += count;
    135     if ((int)bdp & 0xF)
    136         bdp = (mcf5282BufferDescriptor_t *)((char *)bdp + (16 - ((int)bdp & 0xF)));
    137     return p;
    138 }
    139 
    140 #if UNUSED
    141112/*
    142113 * Read MII register
     
    155126    return MCF5282_FEC_MMFR & 0xFFFF;
    156127}
    157 #endif
    158128
    159129/*
     
    174144}
    175145
     146static rtems_isr
     147mcf5282_fec_rx_interrupt_handler( rtems_vector_number v )
     148{
     149    MCF5282_FEC_EIR = MCF5282_FEC_EIR_RXF;
     150    MCF5282_FEC_EIMR &= ~MCF5282_FEC_EIMR_RXF;   
     151    enet_driver[0].rxInterrupts++;
     152    rtems_event_send(enet_driver[0].rxDaemonTid, RX_INTERRUPT_EVENT);
     153}
     154
     155static rtems_isr
     156mcf5282_fec_tx_interrupt_handler( rtems_vector_number v )
     157{
     158    MCF5282_FEC_EIR = MCF5282_FEC_EIR_TXF;
     159    MCF5282_FEC_EIMR &= ~MCF5282_FEC_EIMR_TXF;   
     160    enet_driver[0].txInterrupts++;
     161    rtems_event_send(enet_driver[0].txDaemonTid, TX_INTERRUPT_EVENT);
     162}
     163
     164static rtems_isr
     165mcf5282_mii_interrupt_handler( rtems_vector_number v )
     166{
     167    uint16 sr2;
     168
     169    enet_driver[0].miiInterrupts++;
     170    getMII(1, 19); /* Read and clear interrupt status bits */
     171    enet_driver[0].mii_sr2 = sr2 = getMII(1, 17);
     172    if (((sr2 & 0x200) != 0)
     173     && ((MCF5282_FEC_TCR & MCF5282_FEC_TCR_FDEN) == 0))
     174        MCF5282_FEC_TCR |= MCF5282_FEC_TCR_FDEN;
     175    else if (((sr2 & 0x200) == 0)
     176          && ((MCF5282_FEC_TCR & MCF5282_FEC_TCR_FDEN) != 0))
     177        MCF5282_FEC_TCR &= ~MCF5282_FEC_TCR_FDEN;
     178}
     179
     180/*
     181 * Allocate buffer descriptors from (non-cached) on-chip static RAM
     182 * Ensure 128-bit (16-byte) alignment
     183 */
     184static mcf5282BufferDescriptor_t *
     185mcf5282_bd_allocate(unsigned int count)
     186{
     187    extern char __SRAMBASE[];
     188    static mcf5282BufferDescriptor_t *bdp = (mcf5282BufferDescriptor_t *)__SRAMBASE;
     189    mcf5282BufferDescriptor_t *p = bdp;
     190
     191    bdp += count;
     192    if ((int)bdp & 0xF)
     193        bdp = (mcf5282BufferDescriptor_t *)((char *)bdp + (16 - ((int)bdp & 0xF)));
     194    return p;
     195}
     196
    176197static void
    177198mcf5282_fec_initialize_hardware(struct mcf5282_enet_struct *sc)
     
    187208     */
    188209    MCF5282_FEC_ECR = MCF5282_FEC_ECR_RESET;
    189     rtems_task_wake_after(1);
     210    rtems_task_wake_after(2);
    190211    MCF5282_FEC_ECR = 0;
    191212
     
    268289
    269290    /*
    270      * Set PHYS to 100 Mb/s, full duplex
    271      */
    272     setMII(1, 0, 0x2100);
     291     * Set PHYS
     292     *  Advertise 100 Mb/s, full-duplex, IEEE-802.3
     293     *  Turn off auto-negotiate
     294     *  Enable speed-change, duplex-change and link-status-change interrupts
     295     *  Start auto-negotiate
     296     */
     297    setMII(1,  4, 0x0181);
     298    setMII(1,  0, 0x0000);
     299    rtems_task_wake_after(2);
     300    sc->mii_sr2 = getMII(1, 17);
     301    setMII(1, 18, 0x0072);
     302    setMII(1,  0, 0x1000);
    273303
    274304    /*
     
    294324    if (status != RTEMS_SUCCESSFUL)
    295325        rtems_panic ("Can't attach MCF5282 FEC TX interrupt handler: %s\n",
    296                      rtems_status_text(status));
    297     status = rtems_interrupt_catch(mcf5282_fec_rx_interrupt_handler, FEC_INTC0_RX_VECTOR, &old_handler);
    298     if (status != RTEMS_SUCCESSFUL)
    299         rtems_panic ("Can't attach MCF5282 FEC RX interrupt handler: %s\n",
    300                      rtems_status_text(status));
     326                                                 rtems_status_text(status));
    301327    bsp_allocate_interrupt(FEC_IRQ_LEVEL, FEC_IRQ_TX_PRIORITY);
    302328    MCF5282_INTC0_ICR23 = MCF5282_INTC_ICR_IL(FEC_IRQ_LEVEL) |
    303329                          MCF5282_INTC_ICR_IP(FEC_IRQ_TX_PRIORITY);
    304330    MCF5282_INTC0_IMRL &= ~(MCF5282_INTC_IMRL_INT23 | MCF5282_INTC_IMRL_MASKALL);
     331
     332    status = rtems_interrupt_catch(mcf5282_fec_rx_interrupt_handler, FEC_INTC0_RX_VECTOR, &old_handler);
     333    if (status != RTEMS_SUCCESSFUL)
     334        rtems_panic ("Can't attach MCF5282 FEC RX interrupt handler: %s\n",
     335                                                 rtems_status_text(status));
    305336    bsp_allocate_interrupt(FEC_IRQ_LEVEL, FEC_IRQ_RX_PRIORITY);
    306337    MCF5282_INTC0_ICR27 = MCF5282_INTC_ICR_IL(FEC_IRQ_LEVEL) |
    307338                          MCF5282_INTC_ICR_IP(FEC_IRQ_RX_PRIORITY);
    308339    MCF5282_INTC0_IMRL &= ~(MCF5282_INTC_IMRL_INT27 | MCF5282_INTC_IMRL_MASKALL);
     340
     341    status = rtems_interrupt_catch(mcf5282_mii_interrupt_handler, MII_VECTOR, &old_handler);
     342    if (status != RTEMS_SUCCESSFUL)
     343        rtems_panic ("Can't attach MCF5282 FEC MII interrupt handler: %s\n",
     344                                                 rtems_status_text(status));
     345    MCF5282_EPORT_EPPAR &= ~MII_EPPAR;
     346    MCF5282_EPORT_EPDDR &= ~MII_EPDDR;
     347    MCF5282_EPORT_EPIER |=  MII_EPIER;
     348    MCF5282_INTC0_IMRL &= ~(MCF5282_INTC_IMRL_INT7 | MCF5282_INTC_IMRL_MASKALL);
    309349}
    310350
     
    736776    printf("   Tx SQE Error:%-10lu",   MCF5282_FEC_IEEE_T_SQE);
    737777    printf("Tx Pause Frames:%-10lu\n", MCF5282_FEC_IEEE_T_FDXFC);
    738     printf("   Tx Octets OK:%-10lu\n", MCF5282_FEC_IEEE_T_OCTETS_OK);
     778    printf("   Tx Octets OK:%-10lu",   MCF5282_FEC_IEEE_T_OCTETS_OK);
     779    printf(" MII interrupts:%-10lu\n", sc->miiInterrupts);
     780    if ((sc->mii_sr2 & 0x400) == 0) {
     781        printf("LINK DOWN!\n");
     782    }
     783    else {
     784        printf("Link speed %d Mb/s, %s-duplex.\n",
     785                                    sc->mii_sr2  & 0x4000 ? 100 : 10,
     786                                    sc->mii_sr2 & 0x200 ? "full" : "half");
     787    }
    739788    printf(" EIR:%8.8lx  ",  MCF5282_FEC_EIR);
    740789    printf("EIMR:%8.8lx  ",  MCF5282_FEC_EIMR);
Note: See TracChangeset for help on using the changeset viewer.