diff options
author | Sunil Goutham <sgoutham@cavium.com> | 2017-03-07 07:39:10 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-03-09 16:12:41 -0500 |
commit | 78aacb6f6eeea3c581a29b4a50438d0bdf85ad0b (patch) | |
tree | 9c700580a0350c445566a9e3a2b8dabe2fddcadc | |
parent | 18de7ba95f6e5ab150e482618123d92ee2240dc0 (diff) |
net: thunderx: Fix invalid mac addresses for node1 interfaces
When booted with ACPI, random mac addresses are being
assigned to node1 interfaces due to mismatch of bgx_id
in BGX driver and ACPI tables.
This patch fixes this issue by setting maximum BGX devices
per node based on platform/soc instead of a macro. This
change will set the bgx_id appropriately.
Signed-off-by: Sunil Goutham <sgoutham@cavium.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/cavium/thunder/thunder_bgx.c | 58 | ||||
-rw-r--r-- | drivers/net/ethernet/cavium/thunder/thunder_bgx.h | 1 |
2 files changed, 45 insertions, 14 deletions
diff --git a/drivers/net/ethernet/cavium/thunder/thunder_bgx.c b/drivers/net/ethernet/cavium/thunder/thunder_bgx.c index 9b8a53e138e7..64a1095e4d14 100644 --- a/drivers/net/ethernet/cavium/thunder/thunder_bgx.c +++ b/drivers/net/ethernet/cavium/thunder/thunder_bgx.c | |||
@@ -123,14 +123,44 @@ static int bgx_poll_reg(struct bgx *bgx, u8 lmac, u64 reg, u64 mask, bool zero) | |||
123 | return 1; | 123 | return 1; |
124 | } | 124 | } |
125 | 125 | ||
126 | static int max_bgx_per_node; | ||
127 | static void set_max_bgx_per_node(struct pci_dev *pdev) | ||
128 | { | ||
129 | u16 sdevid; | ||
130 | |||
131 | if (max_bgx_per_node) | ||
132 | return; | ||
133 | |||
134 | pci_read_config_word(pdev, PCI_SUBSYSTEM_ID, &sdevid); | ||
135 | switch (sdevid) { | ||
136 | case PCI_SUBSYS_DEVID_81XX_BGX: | ||
137 | max_bgx_per_node = MAX_BGX_PER_CN81XX; | ||
138 | break; | ||
139 | case PCI_SUBSYS_DEVID_83XX_BGX: | ||
140 | max_bgx_per_node = MAX_BGX_PER_CN83XX; | ||
141 | break; | ||
142 | case PCI_SUBSYS_DEVID_88XX_BGX: | ||
143 | default: | ||
144 | max_bgx_per_node = MAX_BGX_PER_CN88XX; | ||
145 | break; | ||
146 | } | ||
147 | } | ||
148 | |||
149 | static struct bgx *get_bgx(int node, int bgx_idx) | ||
150 | { | ||
151 | int idx = (node * max_bgx_per_node) + bgx_idx; | ||
152 | |||
153 | return bgx_vnic[idx]; | ||
154 | } | ||
155 | |||
126 | /* Return number of BGX present in HW */ | 156 | /* Return number of BGX present in HW */ |
127 | unsigned bgx_get_map(int node) | 157 | unsigned bgx_get_map(int node) |
128 | { | 158 | { |
129 | int i; | 159 | int i; |
130 | unsigned map = 0; | 160 | unsigned map = 0; |
131 | 161 | ||
132 | for (i = 0; i < MAX_BGX_PER_NODE; i++) { | 162 | for (i = 0; i < max_bgx_per_node; i++) { |
133 | if (bgx_vnic[(node * MAX_BGX_PER_NODE) + i]) | 163 | if (bgx_vnic[(node * max_bgx_per_node) + i]) |
134 | map |= (1 << i); | 164 | map |= (1 << i); |
135 | } | 165 | } |
136 | 166 | ||
@@ -143,7 +173,7 @@ int bgx_get_lmac_count(int node, int bgx_idx) | |||
143 | { | 173 | { |
144 | struct bgx *bgx; | 174 | struct bgx *bgx; |
145 | 175 | ||
146 | bgx = bgx_vnic[(node * MAX_BGX_PER_NODE) + bgx_idx]; | 176 | bgx = get_bgx(node, bgx_idx); |
147 | if (bgx) | 177 | if (bgx) |
148 | return bgx->lmac_count; | 178 | return bgx->lmac_count; |
149 | 179 | ||
@@ -158,7 +188,7 @@ void bgx_get_lmac_link_state(int node, int bgx_idx, int lmacid, void *status) | |||
158 | struct bgx *bgx; | 188 | struct bgx *bgx; |
159 | struct lmac *lmac; | 189 | struct lmac *lmac; |
160 | 190 | ||
161 | bgx = bgx_vnic[(node * MAX_BGX_PER_NODE) + bgx_idx]; | 191 | bgx = get_bgx(node, bgx_idx); |
162 | if (!bgx) | 192 | if (!bgx) |
163 | return; | 193 | return; |
164 | 194 | ||
@@ -172,7 +202,7 @@ EXPORT_SYMBOL(bgx_get_lmac_link_state); | |||
172 | 202 | ||
173 | const u8 *bgx_get_lmac_mac(int node, int bgx_idx, int lmacid) | 203 | const u8 *bgx_get_lmac_mac(int node, int bgx_idx, int lmacid) |
174 | { | 204 | { |
175 | struct bgx *bgx = bgx_vnic[(node * MAX_BGX_PER_NODE) + bgx_idx]; | 205 | struct bgx *bgx = get_bgx(node, bgx_idx); |
176 | 206 | ||
177 | if (bgx) | 207 | if (bgx) |
178 | return bgx->lmac[lmacid].mac; | 208 | return bgx->lmac[lmacid].mac; |
@@ -183,7 +213,7 @@ EXPORT_SYMBOL(bgx_get_lmac_mac); | |||
183 | 213 | ||
184 | void bgx_set_lmac_mac(int node, int bgx_idx, int lmacid, const u8 *mac) | 214 | void bgx_set_lmac_mac(int node, int bgx_idx, int lmacid, const u8 *mac) |
185 | { | 215 | { |
186 | struct bgx *bgx = bgx_vnic[(node * MAX_BGX_PER_NODE) + bgx_idx]; | 216 | struct bgx *bgx = get_bgx(node, bgx_idx); |
187 | 217 | ||
188 | if (!bgx) | 218 | if (!bgx) |
189 | return; | 219 | return; |
@@ -194,7 +224,7 @@ EXPORT_SYMBOL(bgx_set_lmac_mac); | |||
194 | 224 | ||
195 | void bgx_lmac_rx_tx_enable(int node, int bgx_idx, int lmacid, bool enable) | 225 | void bgx_lmac_rx_tx_enable(int node, int bgx_idx, int lmacid, bool enable) |
196 | { | 226 | { |
197 | struct bgx *bgx = bgx_vnic[(node * MAX_BGX_PER_NODE) + bgx_idx]; | 227 | struct bgx *bgx = get_bgx(node, bgx_idx); |
198 | struct lmac *lmac; | 228 | struct lmac *lmac; |
199 | u64 cfg; | 229 | u64 cfg; |
200 | 230 | ||
@@ -217,7 +247,7 @@ EXPORT_SYMBOL(bgx_lmac_rx_tx_enable); | |||
217 | void bgx_lmac_get_pfc(int node, int bgx_idx, int lmacid, void *pause) | 247 | void bgx_lmac_get_pfc(int node, int bgx_idx, int lmacid, void *pause) |
218 | { | 248 | { |
219 | struct pfc *pfc = (struct pfc *)pause; | 249 | struct pfc *pfc = (struct pfc *)pause; |
220 | struct bgx *bgx = bgx_vnic[(node * MAX_BGX_PER_CN88XX) + bgx_idx]; | 250 | struct bgx *bgx = get_bgx(node, bgx_idx); |
221 | struct lmac *lmac; | 251 | struct lmac *lmac; |
222 | u64 cfg; | 252 | u64 cfg; |
223 | 253 | ||
@@ -237,7 +267,7 @@ EXPORT_SYMBOL(bgx_lmac_get_pfc); | |||
237 | void bgx_lmac_set_pfc(int node, int bgx_idx, int lmacid, void *pause) | 267 | void bgx_lmac_set_pfc(int node, int bgx_idx, int lmacid, void *pause) |
238 | { | 268 | { |
239 | struct pfc *pfc = (struct pfc *)pause; | 269 | struct pfc *pfc = (struct pfc *)pause; |
240 | struct bgx *bgx = bgx_vnic[(node * MAX_BGX_PER_CN88XX) + bgx_idx]; | 270 | struct bgx *bgx = get_bgx(node, bgx_idx); |
241 | struct lmac *lmac; | 271 | struct lmac *lmac; |
242 | u64 cfg; | 272 | u64 cfg; |
243 | 273 | ||
@@ -369,7 +399,7 @@ u64 bgx_get_rx_stats(int node, int bgx_idx, int lmac, int idx) | |||
369 | { | 399 | { |
370 | struct bgx *bgx; | 400 | struct bgx *bgx; |
371 | 401 | ||
372 | bgx = bgx_vnic[(node * MAX_BGX_PER_NODE) + bgx_idx]; | 402 | bgx = get_bgx(node, bgx_idx); |
373 | if (!bgx) | 403 | if (!bgx) |
374 | return 0; | 404 | return 0; |
375 | 405 | ||
@@ -383,7 +413,7 @@ u64 bgx_get_tx_stats(int node, int bgx_idx, int lmac, int idx) | |||
383 | { | 413 | { |
384 | struct bgx *bgx; | 414 | struct bgx *bgx; |
385 | 415 | ||
386 | bgx = bgx_vnic[(node * MAX_BGX_PER_NODE) + bgx_idx]; | 416 | bgx = get_bgx(node, bgx_idx); |
387 | if (!bgx) | 417 | if (!bgx) |
388 | return 0; | 418 | return 0; |
389 | 419 | ||
@@ -411,7 +441,7 @@ void bgx_lmac_internal_loopback(int node, int bgx_idx, | |||
411 | struct lmac *lmac; | 441 | struct lmac *lmac; |
412 | u64 cfg; | 442 | u64 cfg; |
413 | 443 | ||
414 | bgx = bgx_vnic[(node * MAX_BGX_PER_NODE) + bgx_idx]; | 444 | bgx = get_bgx(node, bgx_idx); |
415 | if (!bgx) | 445 | if (!bgx) |
416 | return; | 446 | return; |
417 | 447 | ||
@@ -1328,11 +1358,13 @@ static int bgx_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1328 | goto err_release_regions; | 1358 | goto err_release_regions; |
1329 | } | 1359 | } |
1330 | 1360 | ||
1361 | set_max_bgx_per_node(pdev); | ||
1362 | |||
1331 | pci_read_config_word(pdev, PCI_DEVICE_ID, &sdevid); | 1363 | pci_read_config_word(pdev, PCI_DEVICE_ID, &sdevid); |
1332 | if (sdevid != PCI_DEVICE_ID_THUNDER_RGX) { | 1364 | if (sdevid != PCI_DEVICE_ID_THUNDER_RGX) { |
1333 | bgx->bgx_id = (pci_resource_start(pdev, | 1365 | bgx->bgx_id = (pci_resource_start(pdev, |
1334 | PCI_CFG_REG_BAR_NUM) >> 24) & BGX_ID_MASK; | 1366 | PCI_CFG_REG_BAR_NUM) >> 24) & BGX_ID_MASK; |
1335 | bgx->bgx_id += nic_get_node_id(pdev) * MAX_BGX_PER_NODE; | 1367 | bgx->bgx_id += nic_get_node_id(pdev) * max_bgx_per_node; |
1336 | bgx->max_lmac = MAX_LMAC_PER_BGX; | 1368 | bgx->max_lmac = MAX_LMAC_PER_BGX; |
1337 | bgx_vnic[bgx->bgx_id] = bgx; | 1369 | bgx_vnic[bgx->bgx_id] = bgx; |
1338 | } else { | 1370 | } else { |
diff --git a/drivers/net/ethernet/cavium/thunder/thunder_bgx.h b/drivers/net/ethernet/cavium/thunder/thunder_bgx.h index a60f189429bb..c5080f2cead5 100644 --- a/drivers/net/ethernet/cavium/thunder/thunder_bgx.h +++ b/drivers/net/ethernet/cavium/thunder/thunder_bgx.h | |||
@@ -22,7 +22,6 @@ | |||
22 | #define MAX_BGX_PER_CN88XX 2 | 22 | #define MAX_BGX_PER_CN88XX 2 |
23 | #define MAX_BGX_PER_CN81XX 3 /* 2 BGXs + 1 RGX */ | 23 | #define MAX_BGX_PER_CN81XX 3 /* 2 BGXs + 1 RGX */ |
24 | #define MAX_BGX_PER_CN83XX 4 | 24 | #define MAX_BGX_PER_CN83XX 4 |
25 | #define MAX_BGX_PER_NODE 4 | ||
26 | #define MAX_LMAC_PER_BGX 4 | 25 | #define MAX_LMAC_PER_BGX 4 |
27 | #define MAX_BGX_CHANS_PER_LMAC 16 | 26 | #define MAX_BGX_CHANS_PER_LMAC 16 |
28 | #define MAX_DMAC_PER_LMAC 8 | 27 | #define MAX_DMAC_PER_LMAC 8 |