Changeset 15f0f9b in rtems


Ignore:
Timestamp:
Apr 11, 2016, 11:27:53 AM (3 years ago)
Author:
Alexander Krutwig <alexander.krutwig@…>
Branches:
master
Children:
033443c
Parents:
a2597f3
git-author:
Alexander Krutwig <alexander.krutwig@…> (04/11/16 11:27:53)
git-committer:
Sebastian Huber <sebastian.huber@…> (06/06/16 10:57:07)
Message:

atsam: Fix network interface PHY handling

Close #2685.

Location:
c/src/lib/libbsp/arm/atsam
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • c/src/lib/libbsp/arm/atsam/include/bsp.h

    ra2597f3 r15f0f9b  
    5555   * @brief Address of PHY.
    5656   *
    57    * Use -1 to search for a PHY.
     57   * Use 0xff to search for a PHY.
    5858   */
    59   int phy_addr;
     59  uint8_t phy_addr;
    6060} if_atsam_config;
    6161
  • c/src/lib/libbsp/arm/atsam/network/if_atsam.c

    ra2597f3 r15f0f9b  
    3333#include <libchip/include/gmacd.h>
    3434#include <libchip/include/pio.h>
    35 #include <libchip/include/timetick.h>
    3635
    3736#define __INSIDE_RTEMS_BSD_TCPIP_STACK__        1
     
    3938
    4039#include <bsp.h>
     40#include <bsp/irq.h>
     41
    4142#include <stdio.h>
    42 #include <errno.h>
    4343
    4444#include <rtems/error.h>
     
    4646#include <rtems/rtems_mii_ioctl.h>
    4747
     48#include <sys/types.h>
    4849#include <sys/ioctl.h>
    4950#include <sys/param.h>
     
    5859#include <netinet/in.h>
    5960#include <netinet/if_ether.h>
    60 #include <bsp/irq.h>
    61 
    62 #include <sys/types.h>
    63 #include <sys/socket.h>
     61
    6462#include <arpa/inet.h>
    6563
    66 #include <time.h>
     64#include <dev/mii/mii.h>
    6765
    6866/*
     
    9492                                                          PIO_OUTPUT_1,    \
    9593                                                          PIO_PULLUP }
    96 
    97 #define GMII_BMCR                               0x0             // Basic Mode Control Register
    98 #define GMII_PHYID1R                            0x2             // PHY Identifier Register 1
    99 #define GMII_PHYID2R                            0x3             // PHY Identifier Register 2
    100 
    101 #define GMII_RESET                              (1 << 15)       // 1= Software Reset; 0=Normal Operation
    102 /** definitions: MII_PHYID1 */
    103 #define GMII_OUI_MSB                            0x0022
    104 /** definitions: MII_PHYID2 */
    105 #define GMII_OUI_LSB                            0x1572 // KSZ8061 PHY Id2
    10694
    10795/** Multicast Enable */
     
    130118
    131119#define GMAC_DESCRIPTOR_ALIGNMENT               8
    132 /** IEEE defined Registers */
    133 #define GMII_ANLPAR                             0x5 // Auto_negotiation Link Partner Ability Register
    134120
    135121/** Events */
     
    224210                        return (1);
    225211                }
    226                 usleep(100);
     212                rtems_task_wake_after(1);
    227213        }
    228214
     
    268254        uint8_t rc;
    269255        uint8_t phy_address;
    270         uint8_t cnt;
    271256
    272257        TRACE_DEBUG("GMACB_FindValidPhy\n\r");
     
    275260        retry_max = gmac_inst->retries;
    276261
    277         if (phy_address != -1) {
     262        if (phy_address != 0xFF) {
    278263                return;
    279264        }
     265
    280266        /* Find another one */
    281         if (value != GMII_OUI_MSB) {
    282                 rc = 0xFF;
    283 
    284                 for (cnt = 0; cnt < 32; cnt++) {
    285                         phy_address = (phy_address + 1) & 0x1F;
    286 
    287                         if (if_atsam_read_phy(pHw, phy_address, GMII_PHYID1R,
    288                             &value, retry_max) == 1) {
    289                                 TRACE_ERROR("MACB PROBLEM\n\r");
    290                         }
     267        rc = 0xFF;
     268
     269        for (phy_address = 0; phy_address < 32; ++phy_address) {
     270                int rv;
     271
     272                rv = if_atsam_read_phy(pHw, phy_address, MII_PHYIDR1,
     273                    &value, retry_max);
     274                if (rv == 0 && value != 0 && value >= 0xffff) {
    291275                        TRACE_DEBUG("_PHYID1  : 0x%X, addr: %d\n\r", value,
    292276                            phy_address);
    293                         if (value == GMII_OUI_MSB) {
    294                                 rc = phy_address;
    295                                 break;
    296                         }
    297                 }
    298         }
     277                        rc = phy_address;
     278                        break;
     279                } else {
     280                        TRACE_ERROR("MACB PROBLEM\n\r");
     281                }
     282        }
     283
    299284        if (rc != 0xFF) {
    300285                TRACE_DEBUG("** Valid PHY Found: %d\n\r", rc);
    301                 if_atsam_read_phy(pHw, phy_address, GMII_PHYID1R, &value,
     286                if_atsam_read_phy(pHw, phy_address, MII_PHYIDR1, &value,
    302287                    retry_max);
    303288                TRACE_DEBUG("_PHYID1R  : 0x%X, addr: %d\n\r", value,
    304289                    phy_address);
    305                 if_atsam_read_phy(pHw, phy_address, GMII_PHYID2R, &value,
     290                if_atsam_read_phy(pHw, phy_address, MII_PHYIDR2, &value,
    306291                    retry_max);
    307292                TRACE_DEBUG("_EMSR  : 0x%X, addr: %d\n\r", value, phy_address);
     
    314299{
    315300        uint32_t retry_max;
    316         uint32_t bmcr = GMII_RESET;
     301        uint32_t bmcr;
    317302        uint8_t phy_address;
    318303        uint32_t timeout = 10;
     
    326311        retry_max = gmac_inst->retries;
    327312
    328         bmcr = GMII_RESET;
    329         if_atsam_write_phy(pHw, phy_address, GMII_BMCR, bmcr, retry_max);
     313        bmcr = BMCR_RESET;
     314        if_atsam_write_phy(pHw, phy_address, MII_BMCR, bmcr, retry_max);
    330315        do {
    331                 if_atsam_read_phy(pHw, phy_address, GMII_BMCR, &bmcr,
     316                if_atsam_read_phy(pHw, phy_address, MII_BMCR, &bmcr,
    332317                    retry_max);
    333318                timeout--;
    334         } while ((bmcr & GMII_RESET) && timeout);
     319        } while ((bmcr & BMCR_RESET) && timeout);
    335320
    336321        if (!timeout) {
     
    357342                TRACE_DEBUG(" Hard Reset of GMACD Phy\n\r");
    358343                PIO_Clear(pResetPins);
    359                 usleep(100);
     344                rtems_task_wake_after(1);
    360345                PIO_Set(pResetPins);
    361346        }
     
    377362}
    378363
     364static bool if_atsam_is_valid_phy(int phy)
     365{
     366        return phy >= 0 && phy <= 31;
     367}
    379368
    380369static int if_atsam_mdio_read(int phy, void *arg, unsigned reg, uint32_t *pval)
    381370{
    382371        if_atsam_softc *sc = (if_atsam_softc *)arg;
    383         int err;
    384372
    385373        TRACE_DEBUG("Mdio read\n\r");
    386374        TRACE_DEBUG("%i\n", phy);
    387375
    388         if ((phy <= 0) || (phy >= 31)) {
    389                 /*
    390                  * invalid phy number
    391                  */
    392                 TRACE_ERROR("Mdio read error\n\r");
     376        if (!if_atsam_is_valid_phy(phy)) {
     377                TRACE_ERROR("Mdio read invalid phy\n\r");
    393378                return (EINVAL);
    394         } else {
    395                 err = if_atsam_read_phy(sc->Gmac_inst.gGmacd.pHw,
    396                         (uint8_t)phy, (uint8_t)reg, pval, 1);
    397         }
    398         return (err);
     379        }
     380
     381        return (if_atsam_read_phy(sc->Gmac_inst.gGmacd.pHw,
     382            (uint8_t)phy, (uint8_t)reg, pval, sc->Gmac_inst.retries));
    399383}
    400384
     
    403387{
    404388        if_atsam_softc *sc = (if_atsam_softc *)arg;
    405         int err = 0;
    406389
    407390        TRACE_DEBUG("Mdio write\n\r");
    408391
    409         if ((phy <= 0) && (phy <= 31)) {
    410                 /*
    411                  * invalid phy number
    412                  */
    413                 TRACE_DEBUG("%i\n", phy);
    414                 TRACE_ERROR("Mdio write error\n\r");
     392        if (!if_atsam_is_valid_phy(phy)) {
     393                TRACE_ERROR("Mdio write invalid phy\n\r");
    415394                return (EINVAL);
    416         } else {
    417                 err = if_atsam_write_phy(sc->Gmac_inst.gGmacd.pHw,
    418                         (uint8_t)phy, (uint8_t)reg, pval, 1);
    419         }
    420         return (err);
     395        }
     396
     397        return if_atsam_write_phy(sc->Gmac_inst.gGmacd.pHw,
     398            (uint8_t)phy, (uint8_t)reg, pval, sc->Gmac_inst.retries);
    421399}
    422400
     
    856834        TRACE_DEBUG("Entered Watchdog\n\r");
    857835
    858         if (if_atsam_read_phy(pHw, phy, GMII_ANLPAR, &anlpar, retries)) {
     836        if (if_atsam_read_phy(pHw, phy, MII_ANLPAR, &anlpar, retries)) {
    859837                anlpar = 0;
    860838        }
     
    901879        struct ifnet *ifp = &sc->arpcom.ac_if;
    902880        uint32_t dmac_cfg = 0;
     881        uint32_t gmii_val = 0;
    903882
    904883        if (sc->arpcom.ac_if.if_flags & IFF_RUNNING) {
     
    936915        sc->anlpar = 0xFFFFFFFF;
    937916        if_atsam_interface_watchdog(ifp);
     917
     918        /* Enable autonegotation */
     919        if_atsam_read_phy(sc->Gmac_inst.gGmacd.pHw, sc->Gmac_inst.phy_address,
     920            MII_BMCR, &gmii_val, sc->Gmac_inst.retries);
     921        if_atsam_write_phy(sc->Gmac_inst.gGmacd.pHw, sc->Gmac_inst.phy_address,
     922            MII_BMCR, (gmii_val | BMCR_AUTOEN), sc->Gmac_inst.retries);
    938923
    939924        /* Configuration of DMAC */
     
    12321217        if_atsam_softc *sc = &if_atsam_softc_inst;
    12331218        struct ifnet *ifp = &sc->arpcom.ac_if;
    1234         if_atsam_config *conf = config->drv_ctrl;
     1219        const if_atsam_config *conf = config->drv_ctrl;
    12351220        int unitNumber;
    12361221        char *unitName;
     
    12411226        } else {
    12421227                sc->Gmac_inst.retries = 10;
    1243                 sc->Gmac_inst.phy_address = -1;
     1228                sc->Gmac_inst.phy_address = 0xFF;
    12441229        }
    12451230
Note: See TracChangeset for help on using the changeset viewer.