0005-stmmac-pci-Use-dmi_system_id-table-for-retrieving-PH.patch 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. From d771759e71dfab46de09fc2efcd1282926a775b8 Mon Sep 17 00:00:00 2001
  2. From: Jan Kiszka <jan.kiszka@siemens.com>
  3. Date: Thu, 22 Jun 2017 08:18:01 +0200
  4. Subject: [PATCH 05/32] stmmac: pci: Use dmi_system_id table for retrieving PHY
  5. addresses
  6. Commit 8d78b69091845386b6096f3adae98f28b9bf96ed upstream.
  7. Avoids reimplementation of DMI matching in stmmac_pci_find_phy_addr.
  8. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
  9. Signed-off-by: David S. Miller <davem@davemloft.net>
  10. ---
  11. drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c | 97 ++++++++++++++++--------
  12. 1 file changed, 64 insertions(+), 33 deletions(-)
  13. diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c
  14. index 9fe6368738ec..279a1355d75f 100644
  15. --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c
  16. +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c
  17. @@ -34,36 +34,39 @@
  18. * negative value of the address means that MAC controller is not connected
  19. * with PHY.
  20. */
  21. -struct stmmac_pci_dmi_data {
  22. - const char *name;
  23. - const char *asset_tag;
  24. +struct stmmac_pci_func_data {
  25. unsigned int func;
  26. int phy_addr;
  27. };
  28. +struct stmmac_pci_dmi_data {
  29. + const struct stmmac_pci_func_data *func;
  30. + size_t nfuncs;
  31. +};
  32. +
  33. struct stmmac_pci_info {
  34. int (*setup)(struct pci_dev *pdev, struct plat_stmmacenet_data *plat);
  35. };
  36. static int stmmac_pci_find_phy_addr(struct pci_dev *pdev,
  37. - struct stmmac_pci_dmi_data *dmi_data)
  38. + const struct dmi_system_id *dmi_list)
  39. {
  40. - const char *name = dmi_get_system_info(DMI_BOARD_NAME);
  41. - const char *asset_tag = dmi_get_system_info(DMI_BOARD_ASSET_TAG);
  42. - unsigned int func = PCI_FUNC(pdev->devfn);
  43. - struct stmmac_pci_dmi_data *dmi;
  44. -
  45. - if (!name)
  46. + const struct stmmac_pci_func_data *func_data;
  47. + const struct stmmac_pci_dmi_data *dmi_data;
  48. + const struct dmi_system_id *dmi_id;
  49. + int func = PCI_FUNC(pdev->devfn);
  50. + size_t n;
  51. +
  52. + dmi_id = dmi_first_match(dmi_list);
  53. + if (!dmi_id)
  54. return -ENODEV;
  55. - for (dmi = dmi_data; dmi->name && *dmi->name; dmi++) {
  56. - if (!strcmp(dmi->name, name) && dmi->func == func) {
  57. - /* If asset tag is provided, match on it as well. */
  58. - if (dmi->asset_tag && strcmp(dmi->asset_tag, asset_tag))
  59. - continue;
  60. - return dmi->phy_addr;
  61. - }
  62. - }
  63. + dmi_data = dmi_id->driver_data;
  64. + func_data = dmi_data->func;
  65. +
  66. + for (n = 0; n < dmi_data->nfuncs; n++, func_data++)
  67. + if (func_data->func == func)
  68. + return func_data->phy_addr;
  69. return -ENODEV;
  70. }
  71. @@ -97,34 +100,62 @@ static const struct stmmac_pci_info stmmac_pci_info = {
  72. .setup = stmmac_default_data,
  73. };
  74. -static struct stmmac_pci_dmi_data quark_pci_dmi_data[] = {
  75. +static const struct stmmac_pci_func_data galileo_stmmac_func_data[] = {
  76. {
  77. - .name = "Galileo",
  78. .func = 6,
  79. .phy_addr = 1,
  80. },
  81. +};
  82. +
  83. +static const struct stmmac_pci_dmi_data galileo_stmmac_dmi_data = {
  84. + .func = galileo_stmmac_func_data,
  85. + .nfuncs = ARRAY_SIZE(galileo_stmmac_func_data),
  86. +};
  87. +
  88. +static const struct stmmac_pci_func_data iot2040_stmmac_func_data[] = {
  89. {
  90. - .name = "GalileoGen2",
  91. .func = 6,
  92. .phy_addr = 1,
  93. },
  94. {
  95. - .name = "SIMATIC IOT2000",
  96. - .asset_tag = "6ES7647-0AA00-0YA2",
  97. - .func = 6,
  98. + .func = 7,
  99. .phy_addr = 1,
  100. },
  101. +};
  102. +
  103. +static const struct stmmac_pci_dmi_data iot2040_stmmac_dmi_data = {
  104. + .func = iot2040_stmmac_func_data,
  105. + .nfuncs = ARRAY_SIZE(iot2040_stmmac_func_data),
  106. +};
  107. +
  108. +static const struct dmi_system_id quark_pci_dmi[] = {
  109. {
  110. - .name = "SIMATIC IOT2000",
  111. - .asset_tag = "6ES7647-0AA00-1YA2",
  112. - .func = 6,
  113. - .phy_addr = 1,
  114. + .matches = {
  115. + DMI_EXACT_MATCH(DMI_BOARD_NAME, "Galileo"),
  116. + },
  117. + .driver_data = (void *)&galileo_stmmac_dmi_data,
  118. },
  119. {
  120. - .name = "SIMATIC IOT2000",
  121. - .asset_tag = "6ES7647-0AA00-1YA2",
  122. - .func = 7,
  123. - .phy_addr = 1,
  124. + .matches = {
  125. + DMI_EXACT_MATCH(DMI_BOARD_NAME, "GalileoGen2"),
  126. + },
  127. + .driver_data = (void *)&galileo_stmmac_dmi_data,
  128. + },
  129. + {
  130. + .matches = {
  131. + DMI_EXACT_MATCH(DMI_BOARD_NAME, "SIMATIC IOT2000"),
  132. + DMI_EXACT_MATCH(DMI_BOARD_ASSET_TAG,
  133. + "6ES7647-0AA00-0YA2"),
  134. + },
  135. + .driver_data = (void *)&galileo_stmmac_dmi_data,
  136. + },
  137. + {
  138. + .matches = {
  139. + DMI_EXACT_MATCH(DMI_BOARD_NAME, "SIMATIC IOT2000"),
  140. + DMI_EXACT_MATCH(DMI_BOARD_ASSET_TAG,
  141. + "6ES7647-0AA00-1YA2"),
  142. + },
  143. + .driver_data = (void *)&iot2040_stmmac_dmi_data,
  144. },
  145. {}
  146. };
  147. @@ -138,7 +169,7 @@ static int quark_default_data(struct pci_dev *pdev,
  148. * Refuse to load the driver and register net device if MAC controller
  149. * does not connect to any PHY interface.
  150. */
  151. - ret = stmmac_pci_find_phy_addr(pdev, quark_pci_dmi_data);
  152. + ret = stmmac_pci_find_phy_addr(pdev, quark_pci_dmi);
  153. if (ret < 0) {
  154. /* Return error to the caller on DMI enabled boards. */
  155. if (dmi_get_system_info(DMI_BOARD_NAME))
  156. --
  157. 2.16.4