diff options
Diffstat (limited to 'drivers/net/netxen/netxen_nic_main.c')
-rw-r--r-- | drivers/net/netxen/netxen_nic_main.c | 79 |
1 files changed, 13 insertions, 66 deletions
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index 645d384fe87..9f33e442f40 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
@@ -76,6 +76,7 @@ static void netxen_nic_poll_controller(struct net_device *netdev); | |||
76 | #endif | 76 | #endif |
77 | static irqreturn_t netxen_intr(int irq, void *data); | 77 | static irqreturn_t netxen_intr(int irq, void *data); |
78 | static irqreturn_t netxen_msi_intr(int irq, void *data); | 78 | static irqreturn_t netxen_msi_intr(int irq, void *data); |
79 | static irqreturn_t netxen_msix_intr(int irq, void *data); | ||
79 | 80 | ||
80 | /* PCI Device ID Table */ | 81 | /* PCI Device ID Table */ |
81 | #define ENTRY(device) \ | 82 | #define ENTRY(device) \ |
@@ -200,9 +201,9 @@ static int nx_set_dma_mask(struct netxen_adapter *adapter, uint8_t revision_id) | |||
200 | adapter->pci_using_dac = 1; | 201 | adapter->pci_using_dac = 1; |
201 | return 0; | 202 | return 0; |
202 | } | 203 | } |
204 | set_32_bit_mask: | ||
203 | #endif /* CONFIG_IA64 */ | 205 | #endif /* CONFIG_IA64 */ |
204 | 206 | ||
205 | set_32_bit_mask: | ||
206 | err = pci_set_dma_mask(pdev, DMA_32BIT_MASK); | 207 | err = pci_set_dma_mask(pdev, DMA_32BIT_MASK); |
207 | if (!err) | 208 | if (!err) |
208 | err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK); | 209 | err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK); |
@@ -371,67 +372,6 @@ static void netxen_set_port_mode(struct netxen_adapter *adapter) | |||
371 | } | 372 | } |
372 | } | 373 | } |
373 | 374 | ||
374 | #define PCI_CAP_ID_GEN 0x10 | ||
375 | |||
376 | static void netxen_pcie_strap_init(struct netxen_adapter *adapter) | ||
377 | { | ||
378 | u32 pdevfuncsave; | ||
379 | u32 c8c9value = 0; | ||
380 | u32 chicken = 0; | ||
381 | u32 control = 0; | ||
382 | int i, pos; | ||
383 | struct pci_dev *pdev; | ||
384 | |||
385 | pdev = adapter->pdev; | ||
386 | |||
387 | adapter->hw_read_wx(adapter, | ||
388 | NETXEN_PCIE_REG(PCIE_CHICKEN3), &chicken, 4); | ||
389 | /* clear chicken3.25:24 */ | ||
390 | chicken &= 0xFCFFFFFF; | ||
391 | /* | ||
392 | * if gen1 and B0, set F1020 - if gen 2, do nothing | ||
393 | * if gen2 set to F1000 | ||
394 | */ | ||
395 | pos = pci_find_capability(pdev, PCI_CAP_ID_GEN); | ||
396 | if (pos == 0xC0) { | ||
397 | pci_read_config_dword(pdev, pos + 0x10, &control); | ||
398 | if ((control & 0x000F0000) != 0x00020000) { | ||
399 | /* set chicken3.24 if gen1 */ | ||
400 | chicken |= 0x01000000; | ||
401 | } | ||
402 | printk(KERN_INFO "%s Gen2 strapping detected\n", | ||
403 | netxen_nic_driver_name); | ||
404 | c8c9value = 0xF1000; | ||
405 | } else { | ||
406 | /* set chicken3.24 if gen1 */ | ||
407 | chicken |= 0x01000000; | ||
408 | printk(KERN_INFO "%s Gen1 strapping detected\n", | ||
409 | netxen_nic_driver_name); | ||
410 | if (adapter->ahw.revision_id == NX_P3_B0) | ||
411 | c8c9value = 0xF1020; | ||
412 | else | ||
413 | c8c9value = 0; | ||
414 | |||
415 | } | ||
416 | adapter->hw_write_wx(adapter, | ||
417 | NETXEN_PCIE_REG(PCIE_CHICKEN3), &chicken, 4); | ||
418 | |||
419 | if (!c8c9value) | ||
420 | return; | ||
421 | |||
422 | pdevfuncsave = pdev->devfn; | ||
423 | if (pdevfuncsave & 0x07) | ||
424 | return; | ||
425 | |||
426 | for (i = 0; i < 8; i++) { | ||
427 | pci_read_config_dword(pdev, pos + 8, &control); | ||
428 | pci_read_config_dword(pdev, pos + 8, &control); | ||
429 | pci_write_config_dword(pdev, pos + 8, c8c9value); | ||
430 | pdev->devfn++; | ||
431 | } | ||
432 | pdev->devfn = pdevfuncsave; | ||
433 | } | ||
434 | |||
435 | static void netxen_set_msix_bit(struct pci_dev *pdev, int enable) | 375 | static void netxen_set_msix_bit(struct pci_dev *pdev, int enable) |
436 | { | 376 | { |
437 | u32 control; | 377 | u32 control; |
@@ -811,9 +751,6 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
811 | } | 751 | } |
812 | netxen_load_firmware(adapter); | 752 | netxen_load_firmware(adapter); |
813 | 753 | ||
814 | if (NX_IS_REVISION_P3(revision_id)) | ||
815 | netxen_pcie_strap_init(adapter); | ||
816 | |||
817 | if (NX_IS_REVISION_P2(revision_id)) { | 754 | if (NX_IS_REVISION_P2(revision_id)) { |
818 | 755 | ||
819 | /* Initialize multicast addr pool owners */ | 756 | /* Initialize multicast addr pool owners */ |
@@ -1084,7 +1021,9 @@ static int netxen_nic_open(struct net_device *netdev) | |||
1084 | for (ring = 0; ring < adapter->max_rds_rings; ring++) | 1021 | for (ring = 0; ring < adapter->max_rds_rings; ring++) |
1085 | netxen_post_rx_buffers(adapter, ctx, ring); | 1022 | netxen_post_rx_buffers(adapter, ctx, ring); |
1086 | } | 1023 | } |
1087 | if (NETXEN_IS_MSI_FAMILY(adapter)) | 1024 | if (adapter->flags & NETXEN_NIC_MSIX_ENABLED) |
1025 | handler = netxen_msix_intr; | ||
1026 | else if (adapter->flags & NETXEN_NIC_MSI_ENABLED) | ||
1088 | handler = netxen_msi_intr; | 1027 | handler = netxen_msi_intr; |
1089 | else { | 1028 | else { |
1090 | flags |= IRQF_SHARED; | 1029 | flags |= IRQF_SHARED; |
@@ -1612,6 +1551,14 @@ static irqreturn_t netxen_msi_intr(int irq, void *data) | |||
1612 | return IRQ_HANDLED; | 1551 | return IRQ_HANDLED; |
1613 | } | 1552 | } |
1614 | 1553 | ||
1554 | static irqreturn_t netxen_msix_intr(int irq, void *data) | ||
1555 | { | ||
1556 | struct netxen_adapter *adapter = data; | ||
1557 | |||
1558 | napi_schedule(&adapter->napi); | ||
1559 | return IRQ_HANDLED; | ||
1560 | } | ||
1561 | |||
1615 | static int netxen_nic_poll(struct napi_struct *napi, int budget) | 1562 | static int netxen_nic_poll(struct napi_struct *napi, int budget) |
1616 | { | 1563 | { |
1617 | struct netxen_adapter *adapter = container_of(napi, struct netxen_adapter, napi); | 1564 | struct netxen_adapter *adapter = container_of(napi, struct netxen_adapter, napi); |