aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSunil Goutham <sgoutham@cavium.com>2017-03-07 07:39:10 -0500
committerDavid S. Miller <davem@davemloft.net>2017-03-09 16:12:41 -0500
commit78aacb6f6eeea3c581a29b4a50438d0bdf85ad0b (patch)
tree9c700580a0350c445566a9e3a2b8dabe2fddcadc
parent18de7ba95f6e5ab150e482618123d92ee2240dc0 (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.c58
-rw-r--r--drivers/net/ethernet/cavium/thunder/thunder_bgx.h1
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
126static int max_bgx_per_node;
127static 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
149static 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 */
127unsigned bgx_get_map(int node) 157unsigned 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
173const u8 *bgx_get_lmac_mac(int node, int bgx_idx, int lmacid) 203const 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
184void bgx_set_lmac_mac(int node, int bgx_idx, int lmacid, const u8 *mac) 214void 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
195void bgx_lmac_rx_tx_enable(int node, int bgx_idx, int lmacid, bool enable) 225void 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);
217void bgx_lmac_get_pfc(int node, int bgx_idx, int lmacid, void *pause) 247void 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);
237void bgx_lmac_set_pfc(int node, int bgx_idx, int lmacid, void *pause) 267void 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