725-v5.5-net-sfp-parse-SFP-power-requirement-earlier.patch 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. From d4b8746219e8c0361e5ed6e440ab3a8a600d1f76 Mon Sep 17 00:00:00 2001
  2. From: Russell King <[email protected]>
  3. Date: Fri, 11 Oct 2019 17:24:40 +0100
  4. Subject: [PATCH 623/660] net: sfp: parse SFP power requirement earlier
  5. Parse the SFP power requirement earlier, in preparation for moving the
  6. power level setup code.
  7. Signed-off-by: Russell King <[email protected]>
  8. ---
  9. drivers/net/phy/sfp.c | 42 +++++++++++++++++++++++++++++-------------
  10. 1 file changed, 29 insertions(+), 13 deletions(-)
  11. --- a/drivers/net/phy/sfp.c
  12. +++ b/drivers/net/phy/sfp.c
  13. @@ -196,6 +196,8 @@ struct sfp {
  14. unsigned int sm_retries;
  15. struct sfp_eeprom_id id;
  16. + unsigned int module_power_mW;
  17. +
  18. #if IS_ENABLED(CONFIG_HWMON)
  19. struct sfp_diag diag;
  20. struct device *hwmon_dev;
  21. @@ -1309,17 +1311,14 @@ static void sfp_sm_mod_init(struct sfp *
  22. sfp_sm_probe_phy(sfp);
  23. }
  24. -static int sfp_sm_mod_hpower(struct sfp *sfp)
  25. +static int sfp_module_parse_power(struct sfp *sfp)
  26. {
  27. - u32 power;
  28. - u8 val;
  29. - int err;
  30. + u32 power_mW = 1000;
  31. - power = 1000;
  32. if (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_POWER_DECL))
  33. - power = 1500;
  34. + power_mW = 1500;
  35. if (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_HIGH_POWER_LEVEL))
  36. - power = 2000;
  37. + power_mW = 2000;
  38. if (sfp->id.ext.sff8472_compliance == SFP_SFF8472_COMPLIANCE_NONE &&
  39. (sfp->id.ext.diagmon & (SFP_DIAGMON_DDM | SFP_DIAGMON_ADDRMODE)) !=
  40. @@ -1328,23 +1327,33 @@ static int sfp_sm_mod_hpower(struct sfp
  41. * or requires an address change sequence, so assume that
  42. * the module powers up in the indicated power mode.
  43. */
  44. - if (power > sfp->max_power_mW) {
  45. + if (power_mW > sfp->max_power_mW) {
  46. dev_err(sfp->dev,
  47. "Host does not support %u.%uW modules\n",
  48. - power / 1000, (power / 100) % 10);
  49. + power_mW / 1000, (power_mW / 100) % 10);
  50. return -EINVAL;
  51. }
  52. return 0;
  53. }
  54. - if (power > sfp->max_power_mW) {
  55. + if (power_mW > sfp->max_power_mW) {
  56. dev_warn(sfp->dev,
  57. "Host does not support %u.%uW modules, module left in power mode 1\n",
  58. - power / 1000, (power / 100) % 10);
  59. + power_mW / 1000, (power_mW / 100) % 10);
  60. return 0;
  61. }
  62. - if (power <= 1000)
  63. + sfp->module_power_mW = power_mW;
  64. +
  65. + return 0;
  66. +}
  67. +
  68. +static int sfp_sm_mod_hpower(struct sfp *sfp)
  69. +{
  70. + u8 val;
  71. + int err;
  72. +
  73. + if (sfp->module_power_mW <= 1000)
  74. return 0;
  75. err = sfp_read(sfp, true, SFP_EXT_STATUS, &val, sizeof(val));
  76. @@ -1364,7 +1373,8 @@ static int sfp_sm_mod_hpower(struct sfp
  77. }
  78. dev_info(sfp->dev, "Module switched to %u.%uW power level\n",
  79. - power / 1000, (power / 100) % 10);
  80. + sfp->module_power_mW / 1000,
  81. + (sfp->module_power_mW / 100) % 10);
  82. return T_HPOWER_LEVEL;
  83. err:
  84. @@ -1451,6 +1461,11 @@ static int sfp_sm_mod_probe(struct sfp *
  85. dev_warn(sfp->dev,
  86. "module address swap to access page 0xA2 is not supported.\n");
  87. + /* Parse the module power requirement */
  88. + ret = sfp_module_parse_power(sfp);
  89. + if (ret < 0)
  90. + return ret;
  91. +
  92. ret = sfp_hwmon_insert(sfp);
  93. if (ret < 0)
  94. return ret;
  95. @@ -1474,6 +1489,7 @@ static void sfp_sm_mod_remove(struct sfp
  96. sfp_module_tx_disable(sfp);
  97. memset(&sfp->id, 0, sizeof(sfp->id));
  98. + sfp->module_power_mW = 0;
  99. dev_info(sfp->dev, "module removed\n");
  100. }