diff options
Diffstat (limited to 'drivers/net/netxen/netxen_nic_main.c')
-rw-r--r-- | drivers/net/netxen/netxen_nic_main.c | 99 |
1 files changed, 56 insertions, 43 deletions
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index 91d209a8f6cb..7615c715e66e 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
@@ -166,7 +166,8 @@ static void netxen_nic_disable_int(struct netxen_adapter *adapter) | |||
166 | if (!NETXEN_IS_MSI_FAMILY(adapter)) { | 166 | if (!NETXEN_IS_MSI_FAMILY(adapter)) { |
167 | do { | 167 | do { |
168 | adapter->pci_write_immediate(adapter, | 168 | adapter->pci_write_immediate(adapter, |
169 | ISR_INT_TARGET_STATUS, 0xffffffff); | 169 | adapter->legacy_intr.tgt_status_reg, |
170 | 0xffffffff); | ||
170 | mask = adapter->pci_read_immediate(adapter, | 171 | mask = adapter->pci_read_immediate(adapter, |
171 | ISR_INT_VECTOR); | 172 | ISR_INT_VECTOR); |
172 | if (!(mask & 0x80)) | 173 | if (!(mask & 0x80)) |
@@ -175,7 +176,7 @@ static void netxen_nic_disable_int(struct netxen_adapter *adapter) | |||
175 | } while (--retries); | 176 | } while (--retries); |
176 | 177 | ||
177 | if (!retries) { | 178 | if (!retries) { |
178 | printk(KERN_NOTICE "%s: Failed to disable interrupt completely\n", | 179 | printk(KERN_NOTICE "%s: Failed to disable interrupt\n", |
179 | netxen_nic_driver_name); | 180 | netxen_nic_driver_name); |
180 | } | 181 | } |
181 | } else { | 182 | } else { |
@@ -190,8 +191,6 @@ static void netxen_nic_enable_int(struct netxen_adapter *adapter) | |||
190 | { | 191 | { |
191 | u32 mask; | 192 | u32 mask; |
192 | 193 | ||
193 | DPRINTK(1, INFO, "Entered ISR Enable \n"); | ||
194 | |||
195 | if (adapter->intr_scheme != -1 && | 194 | if (adapter->intr_scheme != -1 && |
196 | adapter->intr_scheme != INTR_SCHEME_PERPORT) { | 195 | adapter->intr_scheme != INTR_SCHEME_PERPORT) { |
197 | switch (adapter->ahw.board_type) { | 196 | switch (adapter->ahw.board_type) { |
@@ -213,16 +212,13 @@ static void netxen_nic_enable_int(struct netxen_adapter *adapter) | |||
213 | 212 | ||
214 | if (!NETXEN_IS_MSI_FAMILY(adapter)) { | 213 | if (!NETXEN_IS_MSI_FAMILY(adapter)) { |
215 | mask = 0xbff; | 214 | mask = 0xbff; |
216 | if (adapter->intr_scheme != -1 && | 215 | if (adapter->intr_scheme == INTR_SCHEME_PERPORT) |
217 | adapter->intr_scheme != INTR_SCHEME_PERPORT) { | 216 | adapter->pci_write_immediate(adapter, |
217 | adapter->legacy_intr.tgt_mask_reg, mask); | ||
218 | else | ||
218 | adapter->pci_write_normalize(adapter, | 219 | adapter->pci_write_normalize(adapter, |
219 | CRB_INT_VECTOR, 0); | 220 | CRB_INT_VECTOR, 0); |
220 | } | ||
221 | adapter->pci_write_immediate(adapter, | ||
222 | ISR_INT_TARGET_MASK, mask); | ||
223 | } | 221 | } |
224 | |||
225 | DPRINTK(1, INFO, "Done with enable Int\n"); | ||
226 | } | 222 | } |
227 | 223 | ||
228 | 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, uint8_t revision_id) |
@@ -284,6 +280,8 @@ static void netxen_check_options(struct netxen_adapter *adapter) | |||
284 | case NETXEN_BRDTYPE_P3_10G_CX4_LP: | 280 | case NETXEN_BRDTYPE_P3_10G_CX4_LP: |
285 | case NETXEN_BRDTYPE_P3_IMEZ: | 281 | case NETXEN_BRDTYPE_P3_IMEZ: |
286 | case NETXEN_BRDTYPE_P3_10G_SFP_PLUS: | 282 | case NETXEN_BRDTYPE_P3_10G_SFP_PLUS: |
283 | case NETXEN_BRDTYPE_P3_10G_SFP_QT: | ||
284 | case NETXEN_BRDTYPE_P3_10G_SFP_CT: | ||
287 | case NETXEN_BRDTYPE_P3_10G_XFP: | 285 | case NETXEN_BRDTYPE_P3_10G_XFP: |
288 | case NETXEN_BRDTYPE_P3_10000_BASE_T: | 286 | case NETXEN_BRDTYPE_P3_10000_BASE_T: |
289 | adapter->msix_supported = !!use_msi_x; | 287 | adapter->msix_supported = !!use_msi_x; |
@@ -301,6 +299,10 @@ static void netxen_check_options(struct netxen_adapter *adapter) | |||
301 | case NETXEN_BRDTYPE_P3_REF_QG: | 299 | case NETXEN_BRDTYPE_P3_REF_QG: |
302 | case NETXEN_BRDTYPE_P3_4_GB: | 300 | case NETXEN_BRDTYPE_P3_4_GB: |
303 | case NETXEN_BRDTYPE_P3_4_GB_MM: | 301 | case NETXEN_BRDTYPE_P3_4_GB_MM: |
302 | adapter->msix_supported = 0; | ||
303 | adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_10G; | ||
304 | break; | ||
305 | |||
304 | case NETXEN_BRDTYPE_P2_SB35_4G: | 306 | case NETXEN_BRDTYPE_P2_SB35_4G: |
305 | case NETXEN_BRDTYPE_P2_SB31_2G: | 307 | case NETXEN_BRDTYPE_P2_SB31_2G: |
306 | adapter->msix_supported = 0; | 308 | adapter->msix_supported = 0; |
@@ -700,13 +702,10 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
700 | adapter->status &= ~NETXEN_NETDEV_STATUS; | 702 | adapter->status &= ~NETXEN_NETDEV_STATUS; |
701 | adapter->rx_csum = 1; | 703 | adapter->rx_csum = 1; |
702 | adapter->mc_enabled = 0; | 704 | adapter->mc_enabled = 0; |
703 | if (NX_IS_REVISION_P3(revision_id)) { | 705 | if (NX_IS_REVISION_P3(revision_id)) |
704 | adapter->max_mc_count = 38; | 706 | adapter->max_mc_count = 38; |
705 | adapter->max_rds_rings = 2; | 707 | else |
706 | } else { | ||
707 | adapter->max_mc_count = 16; | 708 | adapter->max_mc_count = 16; |
708 | adapter->max_rds_rings = 3; | ||
709 | } | ||
710 | 709 | ||
711 | netdev->open = netxen_nic_open; | 710 | netdev->open = netxen_nic_open; |
712 | netdev->stop = netxen_nic_close; | 711 | netdev->stop = netxen_nic_close; |
@@ -779,10 +778,6 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
779 | if (adapter->portnum == 0) | 778 | if (adapter->portnum == 0) |
780 | first_driver = 1; | 779 | first_driver = 1; |
781 | } | 780 | } |
782 | adapter->crb_addr_cmd_producer = crb_cmd_producer[adapter->portnum]; | ||
783 | adapter->crb_addr_cmd_consumer = crb_cmd_consumer[adapter->portnum]; | ||
784 | netxen_nic_update_cmd_producer(adapter, 0); | ||
785 | netxen_nic_update_cmd_consumer(adapter, 0); | ||
786 | 781 | ||
787 | if (first_driver) { | 782 | if (first_driver) { |
788 | first_boot = adapter->pci_read_normalize(adapter, | 783 | first_boot = adapter->pci_read_normalize(adapter, |
@@ -1053,6 +1048,11 @@ static int netxen_nic_open(struct net_device *netdev) | |||
1053 | return -EIO; | 1048 | return -EIO; |
1054 | } | 1049 | } |
1055 | 1050 | ||
1051 | if (adapter->fw_major < 4) | ||
1052 | adapter->max_rds_rings = 3; | ||
1053 | else | ||
1054 | adapter->max_rds_rings = 2; | ||
1055 | |||
1056 | err = netxen_alloc_sw_resources(adapter); | 1056 | err = netxen_alloc_sw_resources(adapter); |
1057 | if (err) { | 1057 | if (err) { |
1058 | printk(KERN_ERR "%s: Error in setting sw resources\n", | 1058 | printk(KERN_ERR "%s: Error in setting sw resources\n", |
@@ -1074,10 +1074,10 @@ static int netxen_nic_open(struct net_device *netdev) | |||
1074 | crb_cmd_producer[adapter->portnum]; | 1074 | crb_cmd_producer[adapter->portnum]; |
1075 | adapter->crb_addr_cmd_consumer = | 1075 | adapter->crb_addr_cmd_consumer = |
1076 | crb_cmd_consumer[adapter->portnum]; | 1076 | crb_cmd_consumer[adapter->portnum]; |
1077 | } | ||
1078 | 1077 | ||
1079 | netxen_nic_update_cmd_producer(adapter, 0); | 1078 | netxen_nic_update_cmd_producer(adapter, 0); |
1080 | netxen_nic_update_cmd_consumer(adapter, 0); | 1079 | netxen_nic_update_cmd_consumer(adapter, 0); |
1080 | } | ||
1081 | 1081 | ||
1082 | for (ctx = 0; ctx < MAX_RCV_CTX; ++ctx) { | 1082 | for (ctx = 0; ctx < MAX_RCV_CTX; ++ctx) { |
1083 | for (ring = 0; ring < adapter->max_rds_rings; ring++) | 1083 | for (ring = 0; ring < adapter->max_rds_rings; ring++) |
@@ -1113,9 +1113,7 @@ static int netxen_nic_open(struct net_device *netdev) | |||
1113 | netxen_nic_set_link_parameters(adapter); | 1113 | netxen_nic_set_link_parameters(adapter); |
1114 | 1114 | ||
1115 | netdev->set_multicast_list(netdev); | 1115 | netdev->set_multicast_list(netdev); |
1116 | if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) | 1116 | if (adapter->set_mtu) |
1117 | nx_fw_cmd_set_mtu(adapter, netdev->mtu); | ||
1118 | else | ||
1119 | adapter->set_mtu(adapter, netdev->mtu); | 1117 | adapter->set_mtu(adapter, netdev->mtu); |
1120 | 1118 | ||
1121 | mod_timer(&adapter->watchdog_timer, jiffies); | 1119 | mod_timer(&adapter->watchdog_timer, jiffies); |
@@ -1410,20 +1408,17 @@ static void netxen_nic_handle_phy_intr(struct netxen_adapter *adapter) | |||
1410 | 1408 | ||
1411 | port = adapter->physical_port; | 1409 | port = adapter->physical_port; |
1412 | 1410 | ||
1413 | if (adapter->ahw.board_type == NETXEN_NIC_GBE) { | 1411 | if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) { |
1414 | val = adapter->pci_read_normalize(adapter, CRB_XG_STATE); | 1412 | val = adapter->pci_read_normalize(adapter, CRB_XG_STATE_P3); |
1415 | linkup = (val >> port) & 1; | 1413 | val = XG_LINK_STATE_P3(adapter->ahw.pci_func, val); |
1414 | linkup = (val == XG_LINK_UP_P3); | ||
1416 | } else { | 1415 | } else { |
1417 | if (adapter->fw_major < 4) { | 1416 | val = adapter->pci_read_normalize(adapter, CRB_XG_STATE); |
1418 | val = adapter->pci_read_normalize(adapter, | 1417 | if (adapter->ahw.board_type == NETXEN_NIC_GBE) |
1419 | CRB_XG_STATE); | 1418 | linkup = (val >> port) & 1; |
1419 | else { | ||
1420 | val = (val >> port*8) & 0xff; | 1420 | val = (val >> port*8) & 0xff; |
1421 | linkup = (val == XG_LINK_UP); | 1421 | linkup = (val == XG_LINK_UP); |
1422 | } else { | ||
1423 | val = adapter->pci_read_normalize(adapter, | ||
1424 | CRB_XG_STATE_P3); | ||
1425 | val = XG_LINK_STATE_P3(adapter->ahw.pci_func, val); | ||
1426 | linkup = (val == XG_LINK_UP_P3); | ||
1427 | } | 1422 | } |
1428 | } | 1423 | } |
1429 | 1424 | ||
@@ -1535,15 +1530,33 @@ static irqreturn_t netxen_intr(int irq, void *data) | |||
1535 | struct netxen_adapter *adapter = data; | 1530 | struct netxen_adapter *adapter = data; |
1536 | u32 our_int = 0; | 1531 | u32 our_int = 0; |
1537 | 1532 | ||
1538 | our_int = adapter->pci_read_normalize(adapter, CRB_INT_VECTOR); | 1533 | u32 status = 0; |
1539 | /* not our interrupt */ | 1534 | |
1540 | if ((our_int & (0x80 << adapter->portnum)) == 0) | 1535 | status = adapter->pci_read_immediate(adapter, ISR_INT_VECTOR); |
1536 | |||
1537 | if (!(status & adapter->legacy_intr.int_vec_bit)) | ||
1541 | return IRQ_NONE; | 1538 | return IRQ_NONE; |
1542 | 1539 | ||
1543 | if (adapter->intr_scheme == INTR_SCHEME_PERPORT) { | 1540 | if (adapter->ahw.revision_id >= NX_P3_B1) { |
1544 | /* claim interrupt */ | 1541 | /* check interrupt state machine, to be sure */ |
1545 | adapter->pci_write_normalize(adapter, CRB_INT_VECTOR, | 1542 | status = adapter->pci_read_immediate(adapter, |
1543 | ISR_INT_STATE_REG); | ||
1544 | if (!ISR_LEGACY_INT_TRIGGERED(status)) | ||
1545 | return IRQ_NONE; | ||
1546 | |||
1547 | } else if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) { | ||
1548 | |||
1549 | our_int = adapter->pci_read_normalize(adapter, CRB_INT_VECTOR); | ||
1550 | /* not our interrupt */ | ||
1551 | if ((our_int & (0x80 << adapter->portnum)) == 0) | ||
1552 | return IRQ_NONE; | ||
1553 | |||
1554 | if (adapter->intr_scheme == INTR_SCHEME_PERPORT) { | ||
1555 | /* claim interrupt */ | ||
1556 | adapter->pci_write_normalize(adapter, | ||
1557 | CRB_INT_VECTOR, | ||
1546 | our_int & ~((u32)(0x80 << adapter->portnum))); | 1558 | our_int & ~((u32)(0x80 << adapter->portnum))); |
1559 | } | ||
1547 | } | 1560 | } |
1548 | 1561 | ||
1549 | netxen_handle_int(adapter); | 1562 | netxen_handle_int(adapter); |