[BNX2]: Add 40-bit DMA workaround for 5708.
The internal PCIE-to-PCIX bridge of the 5708 has the same 40-bit DMA limitation as some of the tg3 chips. Set dma_mask and persistent DMA mask to 40-bit to workaround. Signed-off-by: Michael Chan <mchan@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
5bae30c96a
commit
40453c839f
|
@ -5711,6 +5711,7 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev)
|
||||||
unsigned long mem_len;
|
unsigned long mem_len;
|
||||||
int rc;
|
int rc;
|
||||||
u32 reg;
|
u32 reg;
|
||||||
|
u64 dma_mask, persist_dma_mask;
|
||||||
|
|
||||||
SET_MODULE_OWNER(dev);
|
SET_MODULE_OWNER(dev);
|
||||||
SET_NETDEV_DEV(dev, &pdev->dev);
|
SET_NETDEV_DEV(dev, &pdev->dev);
|
||||||
|
@ -5749,21 +5750,6 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev)
|
||||||
goto err_out_release;
|
goto err_out_release;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pci_set_dma_mask(pdev, DMA_64BIT_MASK) == 0) {
|
|
||||||
bp->flags |= USING_DAC_FLAG;
|
|
||||||
if (pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK) != 0) {
|
|
||||||
dev_err(&pdev->dev,
|
|
||||||
"pci_set_consistent_dma_mask failed, aborting.\n");
|
|
||||||
rc = -EIO;
|
|
||||||
goto err_out_release;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (pci_set_dma_mask(pdev, DMA_32BIT_MASK) != 0) {
|
|
||||||
dev_err(&pdev->dev, "System does not support DMA, aborting.\n");
|
|
||||||
rc = -EIO;
|
|
||||||
goto err_out_release;
|
|
||||||
}
|
|
||||||
|
|
||||||
bp->dev = dev;
|
bp->dev = dev;
|
||||||
bp->pdev = pdev;
|
bp->pdev = pdev;
|
||||||
|
|
||||||
|
@ -5805,6 +5791,26 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 5708 cannot support DMA addresses > 40-bit. */
|
||||||
|
if (CHIP_NUM(bp) == CHIP_NUM_5708)
|
||||||
|
persist_dma_mask = dma_mask = DMA_40BIT_MASK;
|
||||||
|
else
|
||||||
|
persist_dma_mask = dma_mask = DMA_64BIT_MASK;
|
||||||
|
|
||||||
|
/* Configure DMA attributes. */
|
||||||
|
if (pci_set_dma_mask(pdev, dma_mask) == 0) {
|
||||||
|
dev->features |= NETIF_F_HIGHDMA;
|
||||||
|
rc = pci_set_consistent_dma_mask(pdev, persist_dma_mask);
|
||||||
|
if (rc) {
|
||||||
|
dev_err(&pdev->dev,
|
||||||
|
"pci_set_consistent_dma_mask failed, aborting.\n");
|
||||||
|
goto err_out_unmap;
|
||||||
|
}
|
||||||
|
} else if ((rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK)) != 0) {
|
||||||
|
dev_err(&pdev->dev, "System does not support DMA, aborting.\n");
|
||||||
|
goto err_out_unmap;
|
||||||
|
}
|
||||||
|
|
||||||
/* Get bus information. */
|
/* Get bus information. */
|
||||||
reg = REG_RD(bp, BNX2_PCICFG_MISC_STATUS);
|
reg = REG_RD(bp, BNX2_PCICFG_MISC_STATUS);
|
||||||
if (reg & BNX2_PCICFG_MISC_STATUS_PCIX_DET) {
|
if (reg & BNX2_PCICFG_MISC_STATUS_PCIX_DET) {
|
||||||
|
@ -6114,8 +6120,6 @@ bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||||
printk("\n");
|
printk("\n");
|
||||||
|
|
||||||
dev->features |= NETIF_F_SG;
|
dev->features |= NETIF_F_SG;
|
||||||
if (bp->flags & USING_DAC_FLAG)
|
|
||||||
dev->features |= NETIF_F_HIGHDMA;
|
|
||||||
dev->features |= NETIF_F_IP_CSUM;
|
dev->features |= NETIF_F_IP_CSUM;
|
||||||
#ifdef BCM_VLAN
|
#ifdef BCM_VLAN
|
||||||
dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
|
dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
|
||||||
|
|
|
@ -6433,7 +6433,6 @@ struct bnx2 {
|
||||||
#define PCI_32BIT_FLAG 2
|
#define PCI_32BIT_FLAG 2
|
||||||
#define ONE_TDMA_FLAG 4 /* no longer used */
|
#define ONE_TDMA_FLAG 4 /* no longer used */
|
||||||
#define NO_WOL_FLAG 8
|
#define NO_WOL_FLAG 8
|
||||||
#define USING_DAC_FLAG 0x10
|
|
||||||
#define USING_MSI_FLAG 0x20
|
#define USING_MSI_FLAG 0x20
|
||||||
#define ASF_ENABLE_FLAG 0x40
|
#define ASF_ENABLE_FLAG 0x40
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue