Changeset 07c8680 in rtems-libbsd


Ignore:
Timestamp:
May 24, 2017, 11:16:11 AM (15 months ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
master
Children:
e846288
Parents:
03d1426
git-author:
Sebastian Huber <sebastian.huber@…> (05/24/17 11:16:11)
git-committer:
Sebastian Huber <sebastian.huber@…> (10/23/17 07:24:06)
Message:

dpaa: Get c45 ids

File:
1 edited

Legend:

Unmodified
Added
Removed
  • rtemsbsd/sys/powerpc/fdt_phy.c

    r03d1426 r07c8680  
    332332}
    333333
     334#define MDIO_C45_DEVID1 2
     335#define MDIO_C45_DEVID2 3
     336#define MDIO_C45_DEVINPKG1 5
     337#define MDIO_C45_DEVINPKG2 6
     338
     339struct phy_c45_device_ids {
     340        uint32_t devices_in_package;
     341        uint32_t device_ids[8];
     342};
     343
     344static int
     345c45_get_devices_in_package(struct phy_device *phy_dev, int dev, uint32_t *dip)
     346{
     347        int val;
     348        int reg;
     349
     350        reg = (dev << 16) | MDIO_C45_DEVINPKG2;
     351        val = phy_read(phy_dev, reg);
     352        if (val < 0) {
     353                return (-EIO);
     354        }
     355        *dip = (uint32_t)((val & 0xffff) << 16);
     356
     357        reg = (dev << 16) | MDIO_C45_DEVINPKG1;
     358        val = phy_read(phy_dev, reg);
     359        if (val < 0) {
     360                return (-EIO);
     361        }
     362        *dip |= (uint32_t)(val & 0xffff);
     363        return (0);
     364}
     365
     366static int
     367c45_get_id(struct phy_device *phy_dev, int dev, uint32_t *id)
     368{
     369        int val;
     370        int reg;
     371
     372        reg = (dev << 16) | MDIO_C45_DEVID1;
     373        val = phy_read(phy_dev, reg);
     374        if (val < 0) {
     375                return (-EIO);
     376        }
     377        *id = (uint32_t)((val & 0xffff) << 16);
     378
     379        reg = (dev << 16) | MDIO_C45_DEVID2;
     380        val = phy_read(phy_dev, reg);
     381        if (val < 0) {
     382                return (-EIO);
     383        }
     384        *id |= (uint32_t)(val & 0xffff);
     385        return (0);
     386}
     387
     388static bool
     389c45_has_no_dip(const uint32_t *dip)
     390{
     391
     392        return ((*dip & 0x1fffffff) == 0x1fffffff);
     393}
     394
     395static int
     396c45_get_ids(struct phy_device *phy_dev, struct phy_c45_device_ids *ids)
     397{
     398        int i;
     399        int err;
     400
     401        for (i = 1; i < ARRAY_SIZE(ids->device_ids) &&
     402            ids->devices_in_package == 0; ++i) {
     403                err = c45_get_devices_in_package(phy_dev, i,
     404                    &ids->devices_in_package);
     405                if (err != 0) {
     406                        return (err);
     407                }
     408
     409                if (c45_has_no_dip(&ids->devices_in_package)) {
     410                        err = c45_get_devices_in_package(phy_dev, 0,
     411                            &ids->devices_in_package);
     412                        if (err != 0) {
     413                                return (err);
     414                        }
     415
     416                        if (c45_has_no_dip(&ids->devices_in_package)) {
     417                                return (-EIO);
     418                        }
     419
     420                        break;
     421                }
     422        }
     423
     424        for (i = 1; i < ARRAY_SIZE(ids->device_ids); ++i) {
     425                if ((ids->devices_in_package & (1U << i)) != 0) {
     426                        err = c45_get_id(phy_dev, i, &ids->device_ids[i]);
     427                        if (err != 0) {
     428                                return (err);
     429                        }
     430                }
     431        }
     432
     433        return (0);
     434}
     435
    334436static struct phy_device *
    335437phy_obtain(const void *fdt, int is_c45, int mdio_node, int addr)
     
    354456        }
    355457
     458        if (is_c45) {
     459                struct phy_c45_device_ids ids = { 0 };
     460
     461                c45_get_ids(phy_dev, &ids);
     462        }
     463
    356464        return (phy_dev);
    357465}
Note: See TracChangeset for help on using the changeset viewer.