Changeset a706aad in libbsdport


Ignore:
Timestamp:
Apr 23, 2009, 4:54:18 AM (10 years ago)
Author:
Till Straumann <strauman@…>
Branches:
master
Children:
89832d3
Parents:
d237050
Message:
  • ported to RTEMS.
Location:
bsd_eth_drivers/if_fxp
Files:
2 added
2 edited

Legend:

Unmodified
Added
Removed
  • bsd_eth_drivers/if_fxp/if_fxp.c

    rd237050 ra706aad  
    2727 *
    2828 */
     29#ifdef __rtems__
     30#include <libbsdport.h>
     31#endif
    2932
    3033#include <sys/cdefs.h>
     
    8891MODULE_DEPEND(fxp, miibus, 1, 1, 1);
    8992#include "miibus_if.h"
     93
     94#ifdef __rtems__
     95#include <libbsdport_post.h>
     96#endif
    9097
    9198/*
     
    214221static int              fxp_detach(device_t dev);
    215222static int              fxp_shutdown(device_t dev);
     223#ifndef __rtems__
    216224static int              fxp_suspend(device_t dev);
    217225static int              fxp_resume(device_t dev);
     226#endif
    218227
    219228static void             fxp_intr(void *xsc);
     
    228237static void             fxp_stop(struct fxp_softc *sc);
    229238static void             fxp_release(struct fxp_softc *sc);
     239#ifndef __rtems__
    230240static int              fxp_ioctl(struct ifnet *ifp, u_long command,
    231241                            caddr_t data);
     242#else
     243static int              fxp_ioctl(struct ifnet *ifp, ioctl_command_t command,
     244                            caddr_t data);
     245#endif
    232246static void             fxp_watchdog(struct fxp_softc *sc);
    233247static int              fxp_add_rfabuf(struct fxp_softc *sc,
     
    244258static void             fxp_write_eeprom(struct fxp_softc *sc, u_short *data,
    245259                            int offset, int words);
     260#ifndef __rtems__
    246261static int              fxp_ifmedia_upd(struct ifnet *ifp);
    247262static void             fxp_ifmedia_sts(struct ifnet *ifp,
    248263                            struct ifmediareq *ifmr);
     264#endif
    249265static int              fxp_serial_ifmedia_upd(struct ifnet *ifp);
    250266static void             fxp_serial_ifmedia_sts(struct ifnet *ifp,
     
    254270                            int value);
    255271static void             fxp_load_ucode(struct fxp_softc *sc);
     272#ifndef RTEMS_SYSCTL_NOTYETSUP
    256273static int              sysctl_int_range(SYSCTL_HANDLER_ARGS,
    257274                            int low, int high);
    258275static int              sysctl_hw_fxp_bundle_max(SYSCTL_HANDLER_ARGS);
    259276static int              sysctl_hw_fxp_int_delay(SYSCTL_HANDLER_ARGS);
     277#endif
    260278static void             fxp_scb_wait(struct fxp_softc *sc);
    261279static void             fxp_scb_cmd(struct fxp_softc *sc, int cmd);
     
    264282                            bus_dmamap_t map);
    265283
     284#ifdef __rtems__
     285
     286static int
     287fxp_irq_check_dis(device_t d)
     288{
     289struct  fxp_softc *sc      = device_get_softc(d);
     290uint8_t           statack  = CSR_READ_1(sc, FXP_CSR_SCB_STATACK);
     291
     292        if ( statack && 0xff != statack ) {
     293                CSR_WRITE_1(sc, FXP_CSR_SCB_INTRCNTL, FXP_SCB_INTR_DISABLE);
     294                return FILTER_HANDLED;
     295        }
     296
     297        return FILTER_STRAY;   
     298}
     299
     300static void
     301fxp_irq_en(device_t d)
     302{
     303struct fxp_softc *sc = device_get_softc(d);
     304        CSR_WRITE_1(sc, FXP_CSR_SCB_INTRCNTL, 0);
     305}
     306
     307static device_method_t fxp_methods = {
     308        probe:                  fxp_probe,
     309        attach:                 fxp_attach,
     310        shutdown:               (void (*)(device_t))fxp_shutdown,
     311        detach:                 fxp_detach,
     312        irq_check_dis:  fxp_irq_check_dis,
     313        irq_en:                 fxp_irq_en,
     314};
     315
     316driver_t libbsdport_fxp_driver = {
     317        "fxp",
     318        &fxp_methods,
     319        DEV_TYPE_PCI,
     320        sizeof(struct fxp_softc)
     321};
     322
     323static int              mdio_r(int phy, void *uarg, unsigned reg, uint32_t *pval);
     324static int              mdio_w(int phy, void *uarg, unsigned reg, uint32_t data);
     325
     326struct rtems_mdio_info fxp_mdio = {
     327        mdio_r: mdio_r,
     328        mdio_w: mdio_w,
     329        has_gmii: 0
     330};
     331#else
    266332static device_method_t fxp_methods[] = {
    267333        /* Device interface */
     
    291357DRIVER_MODULE(fxp, cardbus, fxp_driver, fxp_devclass, 0, 0);
    292358DRIVER_MODULE(miibus, fxp, miibus_driver, miibus_devclass, 0, 0);
     359#endif
    293360
    294361static struct resource_spec fxp_res_spec_mem[] = {
     
    754821                ifmedia_add(&sc->sc_media, IFM_ETHER|IFM_MANUAL, 0, NULL);
    755822                ifmedia_set(&sc->sc_media, IFM_ETHER|IFM_MANUAL);
     823#ifdef __rtems__
     824                sc->phyidx = -1;
     825#endif
    756826        } else {
     827#ifndef __rtems__
    757828                if (mii_phy_probe(dev, &sc->miibus, fxp_ifmedia_upd,
    758829                    fxp_ifmedia_sts)) {
     
    761832                        goto fail;
    762833                }
     834#else
     835                sc->phyidx = -2;
     836                sc->phyidx = rtems_mii_phy_probe(&fxp_mdio, sc);
     837                if ( sc->phyidx < 0 ) {
     838                device_printf(dev, "MII without any PHY!\n");
     839                        error = ENXIO;
     840                        goto fail;
     841                }
     842#endif
    763843        }
    764844
     
    770850        ifp->if_start = fxp_start;
    771851
     852#ifndef __rtems__
    772853        ifp->if_capabilities = ifp->if_capenable = 0;
    773854
     
    783864        ifp->if_capabilities |= IFCAP_POLLING;
    784865#endif
     866#endif
    785867
    786868        /*
     
    789871        ether_ifattach(ifp, eaddr);
    790872
     873#ifndef __rtems__
    791874        /*
    792875         * Tell the upper layer(s) we support long frames.
     
    797880        ifp->if_capabilities |= IFCAP_VLAN_MTU;
    798881        ifp->if_capenable |= IFCAP_VLAN_MTU; /* the hw bits already set */
     882#endif
    799883
    800884        /*
     
    899983        struct fxp_softc *sc = device_get_softc(dev);
    900984
     985#ifndef __rtems__
    901986#ifdef DEVICE_POLLING
    902987        if (sc->ifp->if_capenable & IFCAP_POLLING)   
    903988                ether_poll_deregister(sc->ifp);
     989#endif
    904990#endif
    905991
     
    9521038}
    9531039
     1040#ifndef __rtems__
    9541041/*
    9551042 * Device suspend routine.  Stop the interface and save some PCI
     
    9961083        return (0);
    9971084}
     1085#endif
    9981086
    9991087static void
     
    12761364                    FXP_IPCB_HARDWAREPARSING_ENABLE;
    12771365
     1366#ifndef __rtems__
    12781367        /*
    12791368         * Deal with TCP/IP checksum offload. Note that
     
    13321421#endif
    13331422        }
     1423#endif
    13341424
    13351425        chainlen = 0;
     
    15031593        }
    15041594
     1595#ifndef __rtems__
    15051596#ifdef DEVICE_POLLING
    15061597        if (ifp->if_capenable & IFCAP_POLLING) {
     
    15081599                return;
    15091600        }
     1601#endif
    15101602#endif
    15111603        while ((statack = CSR_READ_1(sc, FXP_CSR_SCB_STATACK)) != 0) {
     
    16721764                        }
    16731765
     1766#ifndef __rtems__
    16741767                        /* Do IP checksum checking. */
    16751768                        if (le16toh(rfa->rfa_status) & FXP_RFA_STATUS_PARSE) {
     
    16911784                                }
    16921785                        }
     1786#endif
    16931787
    16941788                        m->m_pkthdr.len = m->m_len = total_len;
     
    17041798                         */
    17051799                        FXP_UNLOCK(sc);
     1800#ifndef __rtems__
    17061801                        (*ifp->if_input)(ifp, m);
     1802#else
     1803                        ether_input_skipping(ifp, m);
     1804#endif
    17071805                        FXP_LOCK(sc);
    17081806                } else if (fxp_rc == ENOBUFS) {
     
    18151913                sp->rx_overrun_errors = 0;
    18161914        }
     1915#ifndef __rtems__
    18171916        if (sc->miibus != NULL)
    18181917                mii_tick(device_get_softc(sc->miibus));
     1918#endif
    18191919
    18201920        /*
     
    21622262         * Enable interrupts.
    21632263         */
     2264#ifndef __rtems__
    21642265#ifdef DEVICE_POLLING
    21652266        /*
     
    21712272        else
    21722273#endif /* DEVICE_POLLING */
     2274#endif
    21732275        CSR_WRITE_1(sc, FXP_CSR_SCB_INTRCNTL, 0);
    21742276
     
    21932295}
    21942296
     2297#ifndef __rtems__
    21952298/*
    21962299 * Change media according to request.
     
    22362339        FXP_UNLOCK(sc);
    22372340}
     2341#endif
    22382342
    22392343/*
     
    23622466}
    23632467
     2468#ifdef __rtems__
    23642469static int
     2470mdio_r(int phy, void *uarg, unsigned reg, uint32_t *pval)
     2471{
     2472        struct fxp_softc *sc = uarg;
     2473
     2474        /* Hack to support early probing */
     2475        if ( -2 != sc->phyidx ) {
     2476
     2477                /* using phy's other than the default not supported */
     2478                if ( 0 != phy || sc->phyidx < 0 ) {
     2479                        return EINVAL;
     2480                }
     2481                phy = sc->phyidx;
     2482        }
     2483
     2484        *pval = fxp_miibus_readreg(sc->dev, phy, reg);
     2485
     2486        return 0;
     2487}
     2488
     2489static int
     2490mdio_w(int phy, void *uarg, unsigned reg, uint32_t value)
     2491{
     2492        struct fxp_softc *sc = uarg;
     2493
     2494        /* using phy's other than the default not supported */
     2495        if ( 0 != phy || sc->phyidx < 0 ) {
     2496                return EINVAL;
     2497        }
     2498
     2499        fxp_miibus_writereg(sc->dev, sc->phyidx, reg, value);
     2500
     2501        return 0;
     2502}
     2503#endif
     2504
     2505static int
     2506#ifndef __rtems__
    23652507fxp_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
     2508#else
     2509fxp_ioctl(struct ifnet *ifp, ioctl_command_t command, caddr_t data)
     2510#endif
    23662511{
    23672512        struct fxp_softc *sc = ifp->if_softc;
    23682513        struct ifreq *ifr = (struct ifreq *)data;
     2514#ifndef __rtems__
    23692515        struct mii_data *mii;
    23702516        int flag, mask, error = 0;
     2517#else
     2518        int error = 0;
     2519#endif
    23712520
    23722521        switch (command) {
     
    23952544        case SIOCADDMULTI:
    23962545        case SIOCDELMULTI:
     2546#ifdef __rtems__
     2547                if ( ETHER_SIOCMULTIFRAG(error, command, ifr, ifp) )
     2548                        break;
     2549#endif
    23972550                FXP_LOCK(sc);
    23982551                if (ifp->if_flags & IFF_ALLMULTI)
     
    24182571        case SIOCSIFMEDIA:
    24192572        case SIOCGIFMEDIA:
     2573#ifndef __rtems__
    24202574                if (sc->miibus != NULL) {
    24212575                        mii = device_get_softc(sc->miibus);
     
    24252579                        error = ifmedia_ioctl(ifp, ifr, &sc->sc_media, command);
    24262580                }
     2581#else
     2582                error = rtems_mii_ioctl(&fxp_mdio, sc, command, &ifr->ifr_media);
     2583#endif
    24272584                break;
    24282585
     2586#ifndef __rtems__
    24292587        case SIOCSIFCAP:
    24302588                mask = ifp->if_capenable ^ ifr->ifr_reqcap;
     
    24632621                }
    24642622                break;
     2623#endif
     2624
     2625#ifdef __rtems__
     2626        case SIO_RTEMS_SHOW_STATS:
     2627                printf("Good packets sent  %lu\n", ifp->if_opackets);
     2628                printf("Output errors      %lu\n", ifp->if_oerrors);
     2629                printf("Good packets recvd %lu\n", ifp->if_ipackets);
     2630                printf("Input  errors      %lu\n", ifp->if_ierrors);
     2631                printf("Collisions         %lu\n", ifp->if_collisions);
     2632                break;
     2633#endif
    24652634
    24662635        default:
     
    24782647        struct fxp_cb_mcs *mcsp = sc->mcsp;
    24792648        struct ifnet *ifp = sc->ifp;
     2649#ifndef __rtems__
    24802650        struct ifmultiaddr *ifma;
     2651#endif
    24812652        int nmcasts;
    24822653
    24832654        nmcasts = 0;
    24842655        if ((sc->flags & FXP_FLAG_ALL_MCAST) == 0) {
     2656#ifndef __rtems__
    24852657                IF_ADDR_LOCK(ifp);
    24862658                TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
     
    24972669                }
    24982670                IF_ADDR_UNLOCK(ifp);
     2671#else
     2672        {
     2673        /* UNTESTED */
     2674        struct ether_multi     *enm;
     2675        struct ether_multistep step;
     2676        ETHER_FIRST_MULTI(step, (struct arpcom*)ifp, enm);
     2677        while ( enm != NULL ) {
     2678                if (nmcasts >= MAXMCADDR) {
     2679                        sc->flags |= FXP_FLAG_ALL_MCAST;
     2680                        nmcasts = 0;
     2681                break;
     2682                }
     2683                bcopy(enm->enm_addrlo,
     2684                    &sc->mcsp->mc_addr[nmcasts][0], ETHER_ADDR_LEN);
     2685                nmcasts++;
     2686                ETHER_NEXT_MULTI( step, enm );
     2687        }
     2688        }
     2689#endif
    24992690        }
    25002691        mcsp->mc_cnt = htole16(nmcasts * ETHER_ADDR_LEN);
     
    26852876}
    26862877
     2878#ifndef RTEMS_SYSCTL_NOTYETSUP
    26872879static int
    26882880sysctl_int_range(SYSCTL_HANDLER_ARGS, int low, int high)
     
    27152907        return (sysctl_int_range(oidp, arg1, arg2, req, 1, 0xffff));
    27162908}
     2909#endif
  • bsd_eth_drivers/if_fxp/if_fxpvar.h

    rd237050 ra706aad  
    168168        struct ifmedia sc_media;        /* media information */
    169169        device_t miibus;
     170#ifdef __rtems__
     171        int    phyidx;
     172#endif
    170173        device_t dev;
    171174        int tunable_int_delay;          /* interrupt delay value for ucode */
Note: See TracChangeset for help on using the changeset viewer.