Changeset 07c8680 in rtems-libbsd
- Timestamp:
- 05/24/17 11:16:11 (5 years ago)
- Branches:
- 5, 5-freebsd-12, 6-freebsd-12, 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)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
rtemsbsd/sys/powerpc/fdt_phy.c
r03d1426 r07c8680 332 332 } 333 333 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 339 struct phy_c45_device_ids { 340 uint32_t devices_in_package; 341 uint32_t device_ids[8]; 342 }; 343 344 static int 345 c45_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 366 static int 367 c45_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 388 static bool 389 c45_has_no_dip(const uint32_t *dip) 390 { 391 392 return ((*dip & 0x1fffffff) == 0x1fffffff); 393 } 394 395 static int 396 c45_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 334 436 static struct phy_device * 335 437 phy_obtain(const void *fdt, int is_c45, int mdio_node, int addr) … … 354 456 } 355 457 458 if (is_c45) { 459 struct phy_c45_device_ids ids = { 0 }; 460 461 c45_get_ids(phy_dev, &ids); 462 } 463 356 464 return (phy_dev); 357 465 }
Note: See TracChangeset
for help on using the changeset viewer.