diff options
Diffstat (limited to 'drivers/net/ethernet/broadcom')
-rw-r--r-- | drivers/net/ethernet/broadcom/bgmac.c | 44 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bgmac.h | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x.h | 37 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | 8 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | 14 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/cnic.c | 6 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/tg3.c | 6 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/tg3.h | 1 |
9 files changed, 89 insertions, 35 deletions
diff --git a/drivers/net/ethernet/broadcom/bgmac.c b/drivers/net/ethernet/broadcom/bgmac.c index eec0af45b859..249468f95365 100644 --- a/drivers/net/ethernet/broadcom/bgmac.c +++ b/drivers/net/ethernet/broadcom/bgmac.c | |||
@@ -157,6 +157,7 @@ static netdev_tx_t bgmac_dma_tx_add(struct bgmac *bgmac, | |||
157 | if (++ring->end >= BGMAC_TX_RING_SLOTS) | 157 | if (++ring->end >= BGMAC_TX_RING_SLOTS) |
158 | ring->end = 0; | 158 | ring->end = 0; |
159 | bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_INDEX, | 159 | bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_INDEX, |
160 | ring->index_base + | ||
160 | ring->end * sizeof(struct bgmac_dma_desc)); | 161 | ring->end * sizeof(struct bgmac_dma_desc)); |
161 | 162 | ||
162 | /* Always keep one slot free to allow detecting bugged calls. */ | 163 | /* Always keep one slot free to allow detecting bugged calls. */ |
@@ -181,6 +182,8 @@ static void bgmac_dma_tx_free(struct bgmac *bgmac, struct bgmac_dma_ring *ring) | |||
181 | /* The last slot that hardware didn't consume yet */ | 182 | /* The last slot that hardware didn't consume yet */ |
182 | empty_slot = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_STATUS); | 183 | empty_slot = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_STATUS); |
183 | empty_slot &= BGMAC_DMA_TX_STATDPTR; | 184 | empty_slot &= BGMAC_DMA_TX_STATDPTR; |
185 | empty_slot -= ring->index_base; | ||
186 | empty_slot &= BGMAC_DMA_TX_STATDPTR; | ||
184 | empty_slot /= sizeof(struct bgmac_dma_desc); | 187 | empty_slot /= sizeof(struct bgmac_dma_desc); |
185 | 188 | ||
186 | while (ring->start != empty_slot) { | 189 | while (ring->start != empty_slot) { |
@@ -274,6 +277,8 @@ static int bgmac_dma_rx_read(struct bgmac *bgmac, struct bgmac_dma_ring *ring, | |||
274 | 277 | ||
275 | end_slot = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_RX_STATUS); | 278 | end_slot = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_RX_STATUS); |
276 | end_slot &= BGMAC_DMA_RX_STATDPTR; | 279 | end_slot &= BGMAC_DMA_RX_STATDPTR; |
280 | end_slot -= ring->index_base; | ||
281 | end_slot &= BGMAC_DMA_RX_STATDPTR; | ||
277 | end_slot /= sizeof(struct bgmac_dma_desc); | 282 | end_slot /= sizeof(struct bgmac_dma_desc); |
278 | 283 | ||
279 | ring->end = end_slot; | 284 | ring->end = end_slot; |
@@ -418,9 +423,6 @@ static int bgmac_dma_alloc(struct bgmac *bgmac) | |||
418 | ring = &bgmac->tx_ring[i]; | 423 | ring = &bgmac->tx_ring[i]; |
419 | ring->num_slots = BGMAC_TX_RING_SLOTS; | 424 | ring->num_slots = BGMAC_TX_RING_SLOTS; |
420 | ring->mmio_base = ring_base[i]; | 425 | ring->mmio_base = ring_base[i]; |
421 | if (bgmac_dma_unaligned(bgmac, ring, BGMAC_DMA_RING_TX)) | ||
422 | bgmac_warn(bgmac, "TX on ring 0x%X supports unaligned addressing but this feature is not implemented\n", | ||
423 | ring->mmio_base); | ||
424 | 426 | ||
425 | /* Alloc ring of descriptors */ | 427 | /* Alloc ring of descriptors */ |
426 | size = ring->num_slots * sizeof(struct bgmac_dma_desc); | 428 | size = ring->num_slots * sizeof(struct bgmac_dma_desc); |
@@ -435,6 +437,13 @@ static int bgmac_dma_alloc(struct bgmac *bgmac) | |||
435 | if (ring->dma_base & 0xC0000000) | 437 | if (ring->dma_base & 0xC0000000) |
436 | bgmac_warn(bgmac, "DMA address using 0xC0000000 bit(s), it may need translation trick\n"); | 438 | bgmac_warn(bgmac, "DMA address using 0xC0000000 bit(s), it may need translation trick\n"); |
437 | 439 | ||
440 | ring->unaligned = bgmac_dma_unaligned(bgmac, ring, | ||
441 | BGMAC_DMA_RING_TX); | ||
442 | if (ring->unaligned) | ||
443 | ring->index_base = lower_32_bits(ring->dma_base); | ||
444 | else | ||
445 | ring->index_base = 0; | ||
446 | |||
438 | /* No need to alloc TX slots yet */ | 447 | /* No need to alloc TX slots yet */ |
439 | } | 448 | } |
440 | 449 | ||
@@ -444,9 +453,6 @@ static int bgmac_dma_alloc(struct bgmac *bgmac) | |||
444 | ring = &bgmac->rx_ring[i]; | 453 | ring = &bgmac->rx_ring[i]; |
445 | ring->num_slots = BGMAC_RX_RING_SLOTS; | 454 | ring->num_slots = BGMAC_RX_RING_SLOTS; |
446 | ring->mmio_base = ring_base[i]; | 455 | ring->mmio_base = ring_base[i]; |
447 | if (bgmac_dma_unaligned(bgmac, ring, BGMAC_DMA_RING_RX)) | ||
448 | bgmac_warn(bgmac, "RX on ring 0x%X supports unaligned addressing but this feature is not implemented\n", | ||
449 | ring->mmio_base); | ||
450 | 456 | ||
451 | /* Alloc ring of descriptors */ | 457 | /* Alloc ring of descriptors */ |
452 | size = ring->num_slots * sizeof(struct bgmac_dma_desc); | 458 | size = ring->num_slots * sizeof(struct bgmac_dma_desc); |
@@ -462,6 +468,13 @@ static int bgmac_dma_alloc(struct bgmac *bgmac) | |||
462 | if (ring->dma_base & 0xC0000000) | 468 | if (ring->dma_base & 0xC0000000) |
463 | bgmac_warn(bgmac, "DMA address using 0xC0000000 bit(s), it may need translation trick\n"); | 469 | bgmac_warn(bgmac, "DMA address using 0xC0000000 bit(s), it may need translation trick\n"); |
464 | 470 | ||
471 | ring->unaligned = bgmac_dma_unaligned(bgmac, ring, | ||
472 | BGMAC_DMA_RING_RX); | ||
473 | if (ring->unaligned) | ||
474 | ring->index_base = lower_32_bits(ring->dma_base); | ||
475 | else | ||
476 | ring->index_base = 0; | ||
477 | |||
465 | /* Alloc RX slots */ | 478 | /* Alloc RX slots */ |
466 | for (j = 0; j < ring->num_slots; j++) { | 479 | for (j = 0; j < ring->num_slots; j++) { |
467 | err = bgmac_dma_rx_skb_for_slot(bgmac, &ring->slots[j]); | 480 | err = bgmac_dma_rx_skb_for_slot(bgmac, &ring->slots[j]); |
@@ -489,12 +502,14 @@ static void bgmac_dma_init(struct bgmac *bgmac) | |||
489 | for (i = 0; i < BGMAC_MAX_TX_RINGS; i++) { | 502 | for (i = 0; i < BGMAC_MAX_TX_RINGS; i++) { |
490 | ring = &bgmac->tx_ring[i]; | 503 | ring = &bgmac->tx_ring[i]; |
491 | 504 | ||
492 | /* We don't implement unaligned addressing, so enable first */ | 505 | if (!ring->unaligned) |
493 | bgmac_dma_tx_enable(bgmac, ring); | 506 | bgmac_dma_tx_enable(bgmac, ring); |
494 | bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_RINGLO, | 507 | bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_RINGLO, |
495 | lower_32_bits(ring->dma_base)); | 508 | lower_32_bits(ring->dma_base)); |
496 | bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_RINGHI, | 509 | bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_RINGHI, |
497 | upper_32_bits(ring->dma_base)); | 510 | upper_32_bits(ring->dma_base)); |
511 | if (ring->unaligned) | ||
512 | bgmac_dma_tx_enable(bgmac, ring); | ||
498 | 513 | ||
499 | ring->start = 0; | 514 | ring->start = 0; |
500 | ring->end = 0; /* Points the slot that should *not* be read */ | 515 | ring->end = 0; /* Points the slot that should *not* be read */ |
@@ -505,12 +520,14 @@ static void bgmac_dma_init(struct bgmac *bgmac) | |||
505 | 520 | ||
506 | ring = &bgmac->rx_ring[i]; | 521 | ring = &bgmac->rx_ring[i]; |
507 | 522 | ||
508 | /* We don't implement unaligned addressing, so enable first */ | 523 | if (!ring->unaligned) |
509 | bgmac_dma_rx_enable(bgmac, ring); | 524 | bgmac_dma_rx_enable(bgmac, ring); |
510 | bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_RINGLO, | 525 | bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_RINGLO, |
511 | lower_32_bits(ring->dma_base)); | 526 | lower_32_bits(ring->dma_base)); |
512 | bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_RINGHI, | 527 | bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_RINGHI, |
513 | upper_32_bits(ring->dma_base)); | 528 | upper_32_bits(ring->dma_base)); |
529 | if (ring->unaligned) | ||
530 | bgmac_dma_rx_enable(bgmac, ring); | ||
514 | 531 | ||
515 | for (j = 0, dma_desc = ring->cpu_base; j < ring->num_slots; | 532 | for (j = 0, dma_desc = ring->cpu_base; j < ring->num_slots; |
516 | j++, dma_desc++) { | 533 | j++, dma_desc++) { |
@@ -531,6 +548,7 @@ static void bgmac_dma_init(struct bgmac *bgmac) | |||
531 | } | 548 | } |
532 | 549 | ||
533 | bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_INDEX, | 550 | bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_INDEX, |
551 | ring->index_base + | ||
534 | ring->num_slots * sizeof(struct bgmac_dma_desc)); | 552 | ring->num_slots * sizeof(struct bgmac_dma_desc)); |
535 | 553 | ||
536 | ring->start = 0; | 554 | ring->start = 0; |
@@ -908,10 +926,10 @@ static void bgmac_chip_reset(struct bgmac *bgmac) | |||
908 | struct bcma_drv_cc *cc = &bgmac->core->bus->drv_cc; | 926 | struct bcma_drv_cc *cc = &bgmac->core->bus->drv_cc; |
909 | u8 et_swtype = 0; | 927 | u8 et_swtype = 0; |
910 | u8 sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHY | | 928 | u8 sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHY | |
911 | BGMAC_CHIPCTL_1_IF_TYPE_RMII; | 929 | BGMAC_CHIPCTL_1_IF_TYPE_MII; |
912 | char buf[2]; | 930 | char buf[4]; |
913 | 931 | ||
914 | if (bcm47xx_nvram_getenv("et_swtype", buf, 1) > 0) { | 932 | if (bcm47xx_nvram_getenv("et_swtype", buf, sizeof(buf)) > 0) { |
915 | if (kstrtou8(buf, 0, &et_swtype)) | 933 | if (kstrtou8(buf, 0, &et_swtype)) |
916 | bgmac_err(bgmac, "Failed to parse et_swtype (%s)\n", | 934 | bgmac_err(bgmac, "Failed to parse et_swtype (%s)\n", |
917 | buf); | 935 | buf); |
diff --git a/drivers/net/ethernet/broadcom/bgmac.h b/drivers/net/ethernet/broadcom/bgmac.h index 98d4b5fcc070..66c8afbdc8c7 100644 --- a/drivers/net/ethernet/broadcom/bgmac.h +++ b/drivers/net/ethernet/broadcom/bgmac.h | |||
@@ -333,7 +333,7 @@ | |||
333 | 333 | ||
334 | #define BGMAC_CHIPCTL_1_IF_TYPE_MASK 0x00000030 | 334 | #define BGMAC_CHIPCTL_1_IF_TYPE_MASK 0x00000030 |
335 | #define BGMAC_CHIPCTL_1_IF_TYPE_RMII 0x00000000 | 335 | #define BGMAC_CHIPCTL_1_IF_TYPE_RMII 0x00000000 |
336 | #define BGMAC_CHIPCTL_1_IF_TYPE_MI 0x00000010 | 336 | #define BGMAC_CHIPCTL_1_IF_TYPE_MII 0x00000010 |
337 | #define BGMAC_CHIPCTL_1_IF_TYPE_RGMII 0x00000020 | 337 | #define BGMAC_CHIPCTL_1_IF_TYPE_RGMII 0x00000020 |
338 | #define BGMAC_CHIPCTL_1_SW_TYPE_MASK 0x000000C0 | 338 | #define BGMAC_CHIPCTL_1_SW_TYPE_MASK 0x000000C0 |
339 | #define BGMAC_CHIPCTL_1_SW_TYPE_EPHY 0x00000000 | 339 | #define BGMAC_CHIPCTL_1_SW_TYPE_EPHY 0x00000000 |
@@ -384,6 +384,8 @@ struct bgmac_dma_ring { | |||
384 | u16 mmio_base; | 384 | u16 mmio_base; |
385 | struct bgmac_dma_desc *cpu_base; | 385 | struct bgmac_dma_desc *cpu_base; |
386 | dma_addr_t dma_base; | 386 | dma_addr_t dma_base; |
387 | u32 index_base; /* Used for unaligned rings only, otherwise 0 */ | ||
388 | bool unaligned; | ||
387 | 389 | ||
388 | struct bgmac_slot_info slots[BGMAC_RX_RING_SLOTS]; | 390 | struct bgmac_slot_info slots[BGMAC_RX_RING_SLOTS]; |
389 | }; | 391 | }; |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h index 0c338026ce01..97b3d32a98bd 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h | |||
@@ -246,8 +246,37 @@ enum { | |||
246 | BNX2X_MAX_CNIC_ETH_CL_ID_IDX, | 246 | BNX2X_MAX_CNIC_ETH_CL_ID_IDX, |
247 | }; | 247 | }; |
248 | 248 | ||
249 | #define BNX2X_CNIC_START_ETH_CID(bp) (BNX2X_NUM_NON_CNIC_QUEUES(bp) *\ | 249 | /* use a value high enough to be above all the PFs, which has least significant |
250 | * nibble as 8, so when cnic needs to come up with a CID for UIO to use to | ||
251 | * calculate doorbell address according to old doorbell configuration scheme | ||
252 | * (db_msg_sz 1 << 7 * cid + 0x40 DPM offset) it can come up with a valid number | ||
253 | * We must avoid coming up with cid 8 for iscsi since according to this method | ||
254 | * the designated UIO cid will come out 0 and it has a special handling for that | ||
255 | * case which doesn't suit us. Therefore will will cieling to closes cid which | ||
256 | * has least signigifcant nibble 8 and if it is 8 we will move forward to 0x18. | ||
257 | */ | ||
258 | |||
259 | #define BNX2X_1st_NON_L2_ETH_CID(bp) (BNX2X_NUM_NON_CNIC_QUEUES(bp) * \ | ||
250 | (bp)->max_cos) | 260 | (bp)->max_cos) |
261 | /* amount of cids traversed by UIO's DPM addition to doorbell */ | ||
262 | #define UIO_DPM 8 | ||
263 | /* roundup to DPM offset */ | ||
264 | #define UIO_ROUNDUP(bp) (roundup(BNX2X_1st_NON_L2_ETH_CID(bp), \ | ||
265 | UIO_DPM)) | ||
266 | /* offset to nearest value which has lsb nibble matching DPM */ | ||
267 | #define UIO_CID_OFFSET(bp) ((UIO_ROUNDUP(bp) + UIO_DPM) % \ | ||
268 | (UIO_DPM * 2)) | ||
269 | /* add offset to rounded-up cid to get a value which could be used with UIO */ | ||
270 | #define UIO_DPM_ALIGN(bp) (UIO_ROUNDUP(bp) + UIO_CID_OFFSET(bp)) | ||
271 | /* but wait - avoid UIO special case for cid 0 */ | ||
272 | #define UIO_DPM_CID0_OFFSET(bp) ((UIO_DPM * 2) * \ | ||
273 | (UIO_DPM_ALIGN(bp) == UIO_DPM)) | ||
274 | /* Properly DPM aligned CID dajusted to cid 0 secal case */ | ||
275 | #define BNX2X_CNIC_START_ETH_CID(bp) (UIO_DPM_ALIGN(bp) + \ | ||
276 | (UIO_DPM_CID0_OFFSET(bp))) | ||
277 | /* how many cids were wasted - need this value for cid allocation */ | ||
278 | #define UIO_CID_PAD(bp) (BNX2X_CNIC_START_ETH_CID(bp) - \ | ||
279 | BNX2X_1st_NON_L2_ETH_CID(bp)) | ||
251 | /* iSCSI L2 */ | 280 | /* iSCSI L2 */ |
252 | #define BNX2X_ISCSI_ETH_CID(bp) (BNX2X_CNIC_START_ETH_CID(bp)) | 281 | #define BNX2X_ISCSI_ETH_CID(bp) (BNX2X_CNIC_START_ETH_CID(bp)) |
253 | /* FCoE L2 */ | 282 | /* FCoE L2 */ |
@@ -1542,7 +1571,6 @@ struct bnx2x { | |||
1542 | */ | 1571 | */ |
1543 | bool fcoe_init; | 1572 | bool fcoe_init; |
1544 | 1573 | ||
1545 | int pm_cap; | ||
1546 | int mrrs; | 1574 | int mrrs; |
1547 | 1575 | ||
1548 | struct delayed_work sp_task; | 1576 | struct delayed_work sp_task; |
@@ -1681,10 +1709,11 @@ struct bnx2x { | |||
1681 | * Maximum CID count that might be required by the bnx2x: | 1709 | * Maximum CID count that might be required by the bnx2x: |
1682 | * Max RSS * Max_Tx_Multi_Cos + FCoE + iSCSI | 1710 | * Max RSS * Max_Tx_Multi_Cos + FCoE + iSCSI |
1683 | */ | 1711 | */ |
1712 | |||
1684 | #define BNX2X_L2_CID_COUNT(bp) (BNX2X_NUM_ETH_QUEUES(bp) * BNX2X_MULTI_TX_COS \ | 1713 | #define BNX2X_L2_CID_COUNT(bp) (BNX2X_NUM_ETH_QUEUES(bp) * BNX2X_MULTI_TX_COS \ |
1685 | + 2 * CNIC_SUPPORT(bp)) | 1714 | + CNIC_SUPPORT(bp) * (2 + UIO_CID_PAD(bp))) |
1686 | #define BNX2X_L2_MAX_CID(bp) (BNX2X_MAX_RSS_COUNT(bp) * BNX2X_MULTI_TX_COS \ | 1715 | #define BNX2X_L2_MAX_CID(bp) (BNX2X_MAX_RSS_COUNT(bp) * BNX2X_MULTI_TX_COS \ |
1687 | + 2 * CNIC_SUPPORT(bp)) | 1716 | + CNIC_SUPPORT(bp) * (2 + UIO_CID_PAD(bp))) |
1688 | #define L2_ILT_LINES(bp) (DIV_ROUND_UP(BNX2X_L2_CID_COUNT(bp),\ | 1717 | #define L2_ILT_LINES(bp) (DIV_ROUND_UP(BNX2X_L2_CID_COUNT(bp),\ |
1689 | ILT_PAGE_CIDS)) | 1718 | ILT_PAGE_CIDS)) |
1690 | 1719 | ||
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c index 90045c920d09..61726af1de6e 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | |||
@@ -3008,16 +3008,16 @@ int bnx2x_set_power_state(struct bnx2x *bp, pci_power_t state) | |||
3008 | u16 pmcsr; | 3008 | u16 pmcsr; |
3009 | 3009 | ||
3010 | /* If there is no power capability, silently succeed */ | 3010 | /* If there is no power capability, silently succeed */ |
3011 | if (!bp->pm_cap) { | 3011 | if (!bp->pdev->pm_cap) { |
3012 | BNX2X_DEV_INFO("No power capability. Breaking.\n"); | 3012 | BNX2X_DEV_INFO("No power capability. Breaking.\n"); |
3013 | return 0; | 3013 | return 0; |
3014 | } | 3014 | } |
3015 | 3015 | ||
3016 | pci_read_config_word(bp->pdev, bp->pm_cap + PCI_PM_CTRL, &pmcsr); | 3016 | pci_read_config_word(bp->pdev, bp->pdev->pm_cap + PCI_PM_CTRL, &pmcsr); |
3017 | 3017 | ||
3018 | switch (state) { | 3018 | switch (state) { |
3019 | case PCI_D0: | 3019 | case PCI_D0: |
3020 | pci_write_config_word(bp->pdev, bp->pm_cap + PCI_PM_CTRL, | 3020 | pci_write_config_word(bp->pdev, bp->pdev->pm_cap + PCI_PM_CTRL, |
3021 | ((pmcsr & ~PCI_PM_CTRL_STATE_MASK) | | 3021 | ((pmcsr & ~PCI_PM_CTRL_STATE_MASK) | |
3022 | PCI_PM_CTRL_PME_STATUS)); | 3022 | PCI_PM_CTRL_PME_STATUS)); |
3023 | 3023 | ||
@@ -3041,7 +3041,7 @@ int bnx2x_set_power_state(struct bnx2x *bp, pci_power_t state) | |||
3041 | if (bp->wol) | 3041 | if (bp->wol) |
3042 | pmcsr |= PCI_PM_CTRL_PME_ENABLE; | 3042 | pmcsr |= PCI_PM_CTRL_PME_ENABLE; |
3043 | 3043 | ||
3044 | pci_write_config_word(bp->pdev, bp->pm_cap + PCI_PM_CTRL, | 3044 | pci_write_config_word(bp->pdev, bp->pdev->pm_cap + PCI_PM_CTRL, |
3045 | pmcsr); | 3045 | pmcsr); |
3046 | 3046 | ||
3047 | /* No more memory access after this point until | 3047 | /* No more memory access after this point until |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c index 2612e3c715d4..324de5f05332 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c | |||
@@ -1387,9 +1387,9 @@ static bool bnx2x_is_nvm_accessible(struct bnx2x *bp) | |||
1387 | u16 pm = 0; | 1387 | u16 pm = 0; |
1388 | struct net_device *dev = pci_get_drvdata(bp->pdev); | 1388 | struct net_device *dev = pci_get_drvdata(bp->pdev); |
1389 | 1389 | ||
1390 | if (bp->pm_cap) | 1390 | if (bp->pdev->pm_cap) |
1391 | rc = pci_read_config_word(bp->pdev, | 1391 | rc = pci_read_config_word(bp->pdev, |
1392 | bp->pm_cap + PCI_PM_CTRL, &pm); | 1392 | bp->pdev->pm_cap + PCI_PM_CTRL, &pm); |
1393 | 1393 | ||
1394 | if ((rc && !netif_running(dev)) || | 1394 | if ((rc && !netif_running(dev)) || |
1395 | (!rc && ((pm & PCI_PM_CTRL_STATE_MASK) != (__force u16)PCI_D0))) | 1395 | (!rc && ((pm & PCI_PM_CTRL_STATE_MASK) != (__force u16)PCI_D0))) |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c index 2f8dbbbd7a86..a6704b555042 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | |||
@@ -8652,6 +8652,7 @@ u32 bnx2x_send_unload_req(struct bnx2x *bp, int unload_mode) | |||
8652 | else if (bp->wol) { | 8652 | else if (bp->wol) { |
8653 | u32 emac_base = port ? GRCBASE_EMAC1 : GRCBASE_EMAC0; | 8653 | u32 emac_base = port ? GRCBASE_EMAC1 : GRCBASE_EMAC0; |
8654 | u8 *mac_addr = bp->dev->dev_addr; | 8654 | u8 *mac_addr = bp->dev->dev_addr; |
8655 | struct pci_dev *pdev = bp->pdev; | ||
8655 | u32 val; | 8656 | u32 val; |
8656 | u16 pmc; | 8657 | u16 pmc; |
8657 | 8658 | ||
@@ -8668,9 +8669,9 @@ u32 bnx2x_send_unload_req(struct bnx2x *bp, int unload_mode) | |||
8668 | EMAC_WR(bp, EMAC_REG_EMAC_MAC_MATCH + entry + 4, val); | 8669 | EMAC_WR(bp, EMAC_REG_EMAC_MAC_MATCH + entry + 4, val); |
8669 | 8670 | ||
8670 | /* Enable the PME and clear the status */ | 8671 | /* Enable the PME and clear the status */ |
8671 | pci_read_config_word(bp->pdev, bp->pm_cap + PCI_PM_CTRL, &pmc); | 8672 | pci_read_config_word(pdev, pdev->pm_cap + PCI_PM_CTRL, &pmc); |
8672 | pmc |= PCI_PM_CTRL_PME_ENABLE | PCI_PM_CTRL_PME_STATUS; | 8673 | pmc |= PCI_PM_CTRL_PME_ENABLE | PCI_PM_CTRL_PME_STATUS; |
8673 | pci_write_config_word(bp->pdev, bp->pm_cap + PCI_PM_CTRL, pmc); | 8674 | pci_write_config_word(pdev, pdev->pm_cap + PCI_PM_CTRL, pmc); |
8674 | 8675 | ||
8675 | reset_code = DRV_MSG_CODE_UNLOAD_REQ_WOL_EN; | 8676 | reset_code = DRV_MSG_CODE_UNLOAD_REQ_WOL_EN; |
8676 | 8677 | ||
@@ -10399,7 +10400,7 @@ static void bnx2x_get_common_hwinfo(struct bnx2x *bp) | |||
10399 | break; | 10400 | break; |
10400 | } | 10401 | } |
10401 | 10402 | ||
10402 | pci_read_config_word(bp->pdev, bp->pm_cap + PCI_PM_PMC, &pmc); | 10403 | pci_read_config_word(bp->pdev, bp->pdev->pm_cap + PCI_PM_PMC, &pmc); |
10403 | bp->flags |= (pmc & PCI_PM_CAP_PME_D3cold) ? 0 : NO_WOL_FLAG; | 10404 | bp->flags |= (pmc & PCI_PM_CAP_PME_D3cold) ? 0 : NO_WOL_FLAG; |
10404 | 10405 | ||
10405 | BNX2X_DEV_INFO("%sWoL capable\n", | 10406 | BNX2X_DEV_INFO("%sWoL capable\n", |
@@ -12141,8 +12142,7 @@ static int bnx2x_init_dev(struct bnx2x *bp, struct pci_dev *pdev, | |||
12141 | } | 12142 | } |
12142 | 12143 | ||
12143 | if (IS_PF(bp)) { | 12144 | if (IS_PF(bp)) { |
12144 | bp->pm_cap = pdev->pm_cap; | 12145 | if (!pdev->pm_cap) { |
12145 | if (bp->pm_cap == 0) { | ||
12146 | dev_err(&bp->pdev->dev, | 12146 | dev_err(&bp->pdev->dev, |
12147 | "Cannot find power management capability, aborting\n"); | 12147 | "Cannot find power management capability, aborting\n"); |
12148 | rc = -EIO; | 12148 | rc = -EIO; |
@@ -13632,6 +13632,10 @@ void bnx2x_setup_cnic_info(struct bnx2x *bp) | |||
13632 | cp->fcoe_init_cid = BNX2X_FCOE_ETH_CID(bp); | 13632 | cp->fcoe_init_cid = BNX2X_FCOE_ETH_CID(bp); |
13633 | cp->iscsi_l2_cid = BNX2X_ISCSI_ETH_CID(bp); | 13633 | cp->iscsi_l2_cid = BNX2X_ISCSI_ETH_CID(bp); |
13634 | 13634 | ||
13635 | DP(NETIF_MSG_IFUP, "BNX2X_1st_NON_L2_ETH_CID(bp) %x, cp->starting_cid %x, cp->fcoe_init_cid %x, cp->iscsi_l2_cid %x\n", | ||
13636 | BNX2X_1st_NON_L2_ETH_CID(bp), cp->starting_cid, cp->fcoe_init_cid, | ||
13637 | cp->iscsi_l2_cid); | ||
13638 | |||
13635 | if (NO_ISCSI_OOO(bp)) | 13639 | if (NO_ISCSI_OOO(bp)) |
13636 | cp->drv_state |= CNIC_DRV_STATE_NO_ISCSI_OOO; | 13640 | cp->drv_state |= CNIC_DRV_STATE_NO_ISCSI_OOO; |
13637 | } | 13641 | } |
diff --git a/drivers/net/ethernet/broadcom/cnic.c b/drivers/net/ethernet/broadcom/cnic.c index 8142480d9770..99394bd49a13 100644 --- a/drivers/net/ethernet/broadcom/cnic.c +++ b/drivers/net/ethernet/broadcom/cnic.c | |||
@@ -3135,6 +3135,7 @@ static void cnic_service_bnx2x_bh(unsigned long data) | |||
3135 | { | 3135 | { |
3136 | struct cnic_dev *dev = (struct cnic_dev *) data; | 3136 | struct cnic_dev *dev = (struct cnic_dev *) data; |
3137 | struct cnic_local *cp = dev->cnic_priv; | 3137 | struct cnic_local *cp = dev->cnic_priv; |
3138 | struct bnx2x *bp = netdev_priv(dev->netdev); | ||
3138 | u32 status_idx, new_status_idx; | 3139 | u32 status_idx, new_status_idx; |
3139 | 3140 | ||
3140 | if (unlikely(!test_bit(CNIC_F_CNIC_UP, &dev->flags))) | 3141 | if (unlikely(!test_bit(CNIC_F_CNIC_UP, &dev->flags))) |
@@ -3146,7 +3147,7 @@ static void cnic_service_bnx2x_bh(unsigned long data) | |||
3146 | CNIC_WR16(dev, cp->kcq1.io_addr, | 3147 | CNIC_WR16(dev, cp->kcq1.io_addr, |
3147 | cp->kcq1.sw_prod_idx + MAX_KCQ_IDX); | 3148 | cp->kcq1.sw_prod_idx + MAX_KCQ_IDX); |
3148 | 3149 | ||
3149 | if (cp->ethdev->drv_state & CNIC_DRV_STATE_NO_FCOE) { | 3150 | if (!CNIC_SUPPORTS_FCOE(bp)) { |
3150 | cp->arm_int(dev, status_idx); | 3151 | cp->arm_int(dev, status_idx); |
3151 | break; | 3152 | break; |
3152 | } | 3153 | } |
@@ -5217,7 +5218,8 @@ static void cnic_init_rings(struct cnic_dev *dev) | |||
5217 | "iSCSI CLIENT_SETUP did not complete\n"); | 5218 | "iSCSI CLIENT_SETUP did not complete\n"); |
5218 | cnic_spq_completion(dev, DRV_CTL_RET_L2_SPQ_CREDIT_CMD, 1); | 5219 | cnic_spq_completion(dev, DRV_CTL_RET_L2_SPQ_CREDIT_CMD, 1); |
5219 | cnic_ring_ctl(dev, cid, cli, 1); | 5220 | cnic_ring_ctl(dev, cid, cli, 1); |
5220 | *cid_ptr = cid; | 5221 | *cid_ptr = cid >> 4; |
5222 | *(cid_ptr + 1) = cid * bp->db_size; | ||
5221 | } | 5223 | } |
5222 | } | 5224 | } |
5223 | 5225 | ||
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c index 5701f3d1a169..12d961c4ebca 100644 --- a/drivers/net/ethernet/broadcom/tg3.c +++ b/drivers/net/ethernet/broadcom/tg3.c | |||
@@ -3034,6 +3034,7 @@ static bool tg3_phy_led_bug(struct tg3 *tp) | |||
3034 | { | 3034 | { |
3035 | switch (tg3_asic_rev(tp)) { | 3035 | switch (tg3_asic_rev(tp)) { |
3036 | case ASIC_REV_5719: | 3036 | case ASIC_REV_5719: |
3037 | case ASIC_REV_5720: | ||
3037 | if ((tp->phy_flags & TG3_PHYFLG_MII_SERDES) && | 3038 | if ((tp->phy_flags & TG3_PHYFLG_MII_SERDES) && |
3038 | !tp->pci_fn) | 3039 | !tp->pci_fn) |
3039 | return true; | 3040 | return true; |
@@ -16192,12 +16193,12 @@ static int tg3_get_invariants(struct tg3 *tp, const struct pci_device_id *ent) | |||
16192 | * So explicitly force the chip into D0 here. | 16193 | * So explicitly force the chip into D0 here. |
16193 | */ | 16194 | */ |
16194 | pci_read_config_dword(tp->pdev, | 16195 | pci_read_config_dword(tp->pdev, |
16195 | tp->pm_cap + PCI_PM_CTRL, | 16196 | tp->pdev->pm_cap + PCI_PM_CTRL, |
16196 | &pm_reg); | 16197 | &pm_reg); |
16197 | pm_reg &= ~PCI_PM_CTRL_STATE_MASK; | 16198 | pm_reg &= ~PCI_PM_CTRL_STATE_MASK; |
16198 | pm_reg |= PCI_PM_CTRL_PME_ENABLE | 0 /* D0 */; | 16199 | pm_reg |= PCI_PM_CTRL_PME_ENABLE | 0 /* D0 */; |
16199 | pci_write_config_dword(tp->pdev, | 16200 | pci_write_config_dword(tp->pdev, |
16200 | tp->pm_cap + PCI_PM_CTRL, | 16201 | tp->pdev->pm_cap + PCI_PM_CTRL, |
16201 | pm_reg); | 16202 | pm_reg); |
16202 | 16203 | ||
16203 | /* Also, force SERR#/PERR# in PCI command. */ | 16204 | /* Also, force SERR#/PERR# in PCI command. */ |
@@ -17346,7 +17347,6 @@ static int tg3_init_one(struct pci_dev *pdev, | |||
17346 | tp = netdev_priv(dev); | 17347 | tp = netdev_priv(dev); |
17347 | tp->pdev = pdev; | 17348 | tp->pdev = pdev; |
17348 | tp->dev = dev; | 17349 | tp->dev = dev; |
17349 | tp->pm_cap = pdev->pm_cap; | ||
17350 | tp->rx_mode = TG3_DEF_RX_MODE; | 17350 | tp->rx_mode = TG3_DEF_RX_MODE; |
17351 | tp->tx_mode = TG3_DEF_TX_MODE; | 17351 | tp->tx_mode = TG3_DEF_TX_MODE; |
17352 | tp->irq_sync = 1; | 17352 | tp->irq_sync = 1; |
diff --git a/drivers/net/ethernet/broadcom/tg3.h b/drivers/net/ethernet/broadcom/tg3.h index ddb8be1298ea..70257808aa37 100644 --- a/drivers/net/ethernet/broadcom/tg3.h +++ b/drivers/net/ethernet/broadcom/tg3.h | |||
@@ -3234,7 +3234,6 @@ struct tg3 { | |||
3234 | u8 pci_lat_timer; | 3234 | u8 pci_lat_timer; |
3235 | 3235 | ||
3236 | int pci_fn; | 3236 | int pci_fn; |
3237 | int pm_cap; | ||
3238 | int msi_cap; | 3237 | int msi_cap; |
3239 | int pcix_cap; | 3238 | int pcix_cap; |
3240 | int pcie_readrq; | 3239 | int pcie_readrq; |