diff options
| -rw-r--r-- | drivers/net/netxen/netxen_nic_main.c | 37 |
1 files changed, 25 insertions, 12 deletions
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index 637ac8b89bac..3cd8cfcf627b 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
| @@ -221,7 +221,7 @@ netxen_napi_disable(struct netxen_adapter *adapter) | |||
| 221 | } | 221 | } |
| 222 | } | 222 | } |
| 223 | 223 | ||
| 224 | static int nx_set_dma_mask(struct netxen_adapter *adapter, uint8_t revision_id) | 224 | static int nx_set_dma_mask(struct netxen_adapter *adapter) |
| 225 | { | 225 | { |
| 226 | struct pci_dev *pdev = adapter->pdev; | 226 | struct pci_dev *pdev = adapter->pdev; |
| 227 | uint64_t mask, cmask; | 227 | uint64_t mask, cmask; |
| @@ -229,19 +229,17 @@ static int nx_set_dma_mask(struct netxen_adapter *adapter, uint8_t revision_id) | |||
| 229 | adapter->pci_using_dac = 0; | 229 | adapter->pci_using_dac = 0; |
| 230 | 230 | ||
| 231 | mask = DMA_BIT_MASK(32); | 231 | mask = DMA_BIT_MASK(32); |
| 232 | /* | ||
| 233 | * Consistent DMA mask is set to 32 bit because it cannot be set to | ||
| 234 | * 35 bits. For P3 also leave it at 32 bits for now. Only the rings | ||
| 235 | * come off this pool. | ||
| 236 | */ | ||
| 237 | cmask = DMA_BIT_MASK(32); | 232 | cmask = DMA_BIT_MASK(32); |
| 238 | 233 | ||
| 234 | if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) { | ||
| 239 | #ifndef CONFIG_IA64 | 235 | #ifndef CONFIG_IA64 |
| 240 | if (revision_id >= NX_P3_B0) | ||
| 241 | mask = DMA_BIT_MASK(39); | ||
| 242 | else if (revision_id == NX_P2_C1) | ||
| 243 | mask = DMA_BIT_MASK(35); | 236 | mask = DMA_BIT_MASK(35); |
| 244 | #endif | 237 | #endif |
| 238 | } else { | ||
| 239 | mask = DMA_BIT_MASK(39); | ||
| 240 | cmask = mask; | ||
| 241 | } | ||
| 242 | |||
| 245 | if (pci_set_dma_mask(pdev, mask) == 0 && | 243 | if (pci_set_dma_mask(pdev, mask) == 0 && |
| 246 | pci_set_consistent_dma_mask(pdev, cmask) == 0) { | 244 | pci_set_consistent_dma_mask(pdev, cmask) == 0) { |
| 247 | adapter->pci_using_dac = 1; | 245 | adapter->pci_using_dac = 1; |
| @@ -256,7 +254,7 @@ static int | |||
| 256 | nx_update_dma_mask(struct netxen_adapter *adapter) | 254 | nx_update_dma_mask(struct netxen_adapter *adapter) |
| 257 | { | 255 | { |
| 258 | int change, shift, err; | 256 | int change, shift, err; |
| 259 | uint64_t mask, old_mask; | 257 | uint64_t mask, old_mask, old_cmask; |
| 260 | struct pci_dev *pdev = adapter->pdev; | 258 | struct pci_dev *pdev = adapter->pdev; |
| 261 | 259 | ||
| 262 | change = 0; | 260 | change = 0; |
| @@ -272,14 +270,29 @@ nx_update_dma_mask(struct netxen_adapter *adapter) | |||
| 272 | 270 | ||
| 273 | if (change) { | 271 | if (change) { |
| 274 | old_mask = pdev->dma_mask; | 272 | old_mask = pdev->dma_mask; |
| 273 | old_cmask = pdev->dev.coherent_dma_mask; | ||
| 274 | |||
| 275 | mask = (1ULL<<(32+shift)) - 1; | 275 | mask = (1ULL<<(32+shift)) - 1; |
| 276 | 276 | ||
| 277 | err = pci_set_dma_mask(pdev, mask); | 277 | err = pci_set_dma_mask(pdev, mask); |
| 278 | if (err) | 278 | if (err) |
| 279 | return pci_set_dma_mask(pdev, old_mask); | 279 | goto err_out; |
| 280 | |||
| 281 | if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) { | ||
| 282 | |||
| 283 | err = pci_set_consistent_dma_mask(pdev, mask); | ||
| 284 | if (err) | ||
| 285 | goto err_out; | ||
| 286 | } | ||
| 287 | dev_info(&pdev->dev, "using %d-bit dma mask\n", 32+shift); | ||
| 280 | } | 288 | } |
| 281 | 289 | ||
| 282 | return 0; | 290 | return 0; |
| 291 | |||
| 292 | err_out: | ||
| 293 | pci_set_dma_mask(pdev, old_mask); | ||
| 294 | pci_set_consistent_dma_mask(pdev, old_cmask); | ||
| 295 | return err; | ||
| 283 | } | 296 | } |
| 284 | 297 | ||
| 285 | static void netxen_check_options(struct netxen_adapter *adapter) | 298 | static void netxen_check_options(struct netxen_adapter *adapter) |
| @@ -1006,7 +1019,7 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 1006 | revision_id = pdev->revision; | 1019 | revision_id = pdev->revision; |
| 1007 | adapter->ahw.revision_id = revision_id; | 1020 | adapter->ahw.revision_id = revision_id; |
| 1008 | 1021 | ||
| 1009 | err = nx_set_dma_mask(adapter, revision_id); | 1022 | err = nx_set_dma_mask(adapter); |
| 1010 | if (err) | 1023 | if (err) |
| 1011 | goto err_out_free_netdev; | 1024 | goto err_out_free_netdev; |
| 1012 | 1025 | ||
