diff options
author | Jiri Kosina <jkosina@suse.cz> | 2010-02-02 17:10:39 -0500 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2010-02-02 17:10:39 -0500 |
commit | e1a0bdd8022317e98650e70850de73eccfcde5ad (patch) | |
tree | 462f63307118b95c8cbacee6954e4d09ee85b8d1 /drivers/net/netxen | |
parent | 8127f4e883666c9960cfa89cffd36313748f8bab (diff) | |
parent | 1a45dcfe2525e9432cb4aba461d4994fc2befe42 (diff) |
Merge branch 'master' into upstream
Conflicts:
drivers/hid/hid-ids.h
Diffstat (limited to 'drivers/net/netxen')
-rw-r--r-- | drivers/net/netxen/netxen_nic.h | 4 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_ethtool.c | 193 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_hw.c | 6 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_init.c | 18 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_main.c | 116 |
5 files changed, 134 insertions, 203 deletions
diff --git a/drivers/net/netxen/netxen_nic.h b/drivers/net/netxen/netxen_nic.h index 76cd1f3e9fc8..9bc5bd1d538a 100644 --- a/drivers/net/netxen/netxen_nic.h +++ b/drivers/net/netxen/netxen_nic.h | |||
@@ -53,8 +53,8 @@ | |||
53 | 53 | ||
54 | #define _NETXEN_NIC_LINUX_MAJOR 4 | 54 | #define _NETXEN_NIC_LINUX_MAJOR 4 |
55 | #define _NETXEN_NIC_LINUX_MINOR 0 | 55 | #define _NETXEN_NIC_LINUX_MINOR 0 |
56 | #define _NETXEN_NIC_LINUX_SUBVERSION 65 | 56 | #define _NETXEN_NIC_LINUX_SUBVERSION 72 |
57 | #define NETXEN_NIC_LINUX_VERSIONID "4.0.65" | 57 | #define NETXEN_NIC_LINUX_VERSIONID "4.0.72" |
58 | 58 | ||
59 | #define NETXEN_VERSION_CODE(a, b, c) (((a) << 24) + ((b) << 16) + (c)) | 59 | #define NETXEN_VERSION_CODE(a, b, c) (((a) << 24) + ((b) << 16) + (c)) |
60 | #define _major(v) (((v) >> 24) & 0xff) | 60 | #define _major(v) (((v) >> 24) & 0xff) |
diff --git a/drivers/net/netxen/netxen_nic_ethtool.c b/drivers/net/netxen/netxen_nic_ethtool.c index ddd704ae0188..542f408333ff 100644 --- a/drivers/net/netxen/netxen_nic_ethtool.c +++ b/drivers/net/netxen/netxen_nic_ethtool.c | |||
@@ -66,7 +66,7 @@ static const char netxen_nic_gstrings_test[][ETH_GSTRING_LEN] = { | |||
66 | 66 | ||
67 | #define NETXEN_NIC_TEST_LEN ARRAY_SIZE(netxen_nic_gstrings_test) | 67 | #define NETXEN_NIC_TEST_LEN ARRAY_SIZE(netxen_nic_gstrings_test) |
68 | 68 | ||
69 | #define NETXEN_NIC_REGS_COUNT 42 | 69 | #define NETXEN_NIC_REGS_COUNT 30 |
70 | #define NETXEN_NIC_REGS_LEN (NETXEN_NIC_REGS_COUNT * sizeof(__le32)) | 70 | #define NETXEN_NIC_REGS_LEN (NETXEN_NIC_REGS_COUNT * sizeof(__le32)) |
71 | #define NETXEN_MAX_EEPROM_LEN 1024 | 71 | #define NETXEN_MAX_EEPROM_LEN 1024 |
72 | 72 | ||
@@ -312,150 +312,91 @@ static int netxen_nic_get_regs_len(struct net_device *dev) | |||
312 | return NETXEN_NIC_REGS_LEN; | 312 | return NETXEN_NIC_REGS_LEN; |
313 | } | 313 | } |
314 | 314 | ||
315 | struct netxen_niu_regs { | ||
316 | __u32 reg[NETXEN_NIC_REGS_COUNT]; | ||
317 | }; | ||
318 | |||
319 | static struct netxen_niu_regs niu_registers[] = { | ||
320 | { | ||
321 | /* GB Mode */ | ||
322 | { | ||
323 | NETXEN_NIU_GB_SERDES_RESET, | ||
324 | NETXEN_NIU_GB0_MII_MODE, | ||
325 | NETXEN_NIU_GB1_MII_MODE, | ||
326 | NETXEN_NIU_GB2_MII_MODE, | ||
327 | NETXEN_NIU_GB3_MII_MODE, | ||
328 | NETXEN_NIU_GB0_GMII_MODE, | ||
329 | NETXEN_NIU_GB1_GMII_MODE, | ||
330 | NETXEN_NIU_GB2_GMII_MODE, | ||
331 | NETXEN_NIU_GB3_GMII_MODE, | ||
332 | NETXEN_NIU_REMOTE_LOOPBACK, | ||
333 | NETXEN_NIU_GB0_HALF_DUPLEX, | ||
334 | NETXEN_NIU_GB1_HALF_DUPLEX, | ||
335 | NETXEN_NIU_RESET_SYS_FIFOS, | ||
336 | NETXEN_NIU_GB_CRC_DROP, | ||
337 | NETXEN_NIU_GB_DROP_WRONGADDR, | ||
338 | NETXEN_NIU_TEST_MUX_CTL, | ||
339 | |||
340 | NETXEN_NIU_GB_MAC_CONFIG_0(0), | ||
341 | NETXEN_NIU_GB_MAC_CONFIG_1(0), | ||
342 | NETXEN_NIU_GB_HALF_DUPLEX_CTRL(0), | ||
343 | NETXEN_NIU_GB_MAX_FRAME_SIZE(0), | ||
344 | NETXEN_NIU_GB_TEST_REG(0), | ||
345 | NETXEN_NIU_GB_MII_MGMT_CONFIG(0), | ||
346 | NETXEN_NIU_GB_MII_MGMT_COMMAND(0), | ||
347 | NETXEN_NIU_GB_MII_MGMT_ADDR(0), | ||
348 | NETXEN_NIU_GB_MII_MGMT_CTRL(0), | ||
349 | NETXEN_NIU_GB_MII_MGMT_STATUS(0), | ||
350 | NETXEN_NIU_GB_MII_MGMT_INDICATE(0), | ||
351 | NETXEN_NIU_GB_INTERFACE_CTRL(0), | ||
352 | NETXEN_NIU_GB_INTERFACE_STATUS(0), | ||
353 | NETXEN_NIU_GB_STATION_ADDR_0(0), | ||
354 | NETXEN_NIU_GB_STATION_ADDR_1(0), | ||
355 | -1, | ||
356 | } | ||
357 | }, | ||
358 | { | ||
359 | /* XG Mode */ | ||
360 | { | ||
361 | NETXEN_NIU_XG_SINGLE_TERM, | ||
362 | NETXEN_NIU_XG_DRIVE_HI, | ||
363 | NETXEN_NIU_XG_DRIVE_LO, | ||
364 | NETXEN_NIU_XG_DTX, | ||
365 | NETXEN_NIU_XG_DEQ, | ||
366 | NETXEN_NIU_XG_WORD_ALIGN, | ||
367 | NETXEN_NIU_XG_RESET, | ||
368 | NETXEN_NIU_XG_POWER_DOWN, | ||
369 | NETXEN_NIU_XG_RESET_PLL, | ||
370 | NETXEN_NIU_XG_SERDES_LOOPBACK, | ||
371 | NETXEN_NIU_XG_DO_BYTE_ALIGN, | ||
372 | NETXEN_NIU_XG_TX_ENABLE, | ||
373 | NETXEN_NIU_XG_RX_ENABLE, | ||
374 | NETXEN_NIU_XG_STATUS, | ||
375 | NETXEN_NIU_XG_PAUSE_THRESHOLD, | ||
376 | NETXEN_NIU_XGE_CONFIG_0, | ||
377 | NETXEN_NIU_XGE_CONFIG_1, | ||
378 | NETXEN_NIU_XGE_IPG, | ||
379 | NETXEN_NIU_XGE_STATION_ADDR_0_HI, | ||
380 | NETXEN_NIU_XGE_STATION_ADDR_0_1, | ||
381 | NETXEN_NIU_XGE_STATION_ADDR_1_LO, | ||
382 | NETXEN_NIU_XGE_STATUS, | ||
383 | NETXEN_NIU_XGE_MAX_FRAME_SIZE, | ||
384 | NETXEN_NIU_XGE_PAUSE_FRAME_VALUE, | ||
385 | NETXEN_NIU_XGE_TX_BYTE_CNT, | ||
386 | NETXEN_NIU_XGE_TX_FRAME_CNT, | ||
387 | NETXEN_NIU_XGE_RX_BYTE_CNT, | ||
388 | NETXEN_NIU_XGE_RX_FRAME_CNT, | ||
389 | NETXEN_NIU_XGE_AGGR_ERROR_CNT, | ||
390 | NETXEN_NIU_XGE_MULTICAST_FRAME_CNT, | ||
391 | NETXEN_NIU_XGE_UNICAST_FRAME_CNT, | ||
392 | NETXEN_NIU_XGE_CRC_ERROR_CNT, | ||
393 | NETXEN_NIU_XGE_OVERSIZE_FRAME_ERR, | ||
394 | NETXEN_NIU_XGE_UNDERSIZE_FRAME_ERR, | ||
395 | NETXEN_NIU_XGE_LOCAL_ERROR_CNT, | ||
396 | NETXEN_NIU_XGE_REMOTE_ERROR_CNT, | ||
397 | NETXEN_NIU_XGE_CONTROL_CHAR_CNT, | ||
398 | NETXEN_NIU_XGE_PAUSE_FRAME_CNT, | ||
399 | -1, | ||
400 | } | ||
401 | } | ||
402 | }; | ||
403 | |||
404 | static void | 315 | static void |
405 | netxen_nic_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p) | 316 | netxen_nic_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p) |
406 | { | 317 | { |
407 | struct netxen_adapter *adapter = netdev_priv(dev); | 318 | struct netxen_adapter *adapter = netdev_priv(dev); |
408 | __u32 mode, *regs_buff = p; | 319 | struct netxen_recv_context *recv_ctx = &adapter->recv_ctx; |
409 | int i, window; | 320 | struct nx_host_sds_ring *sds_ring; |
321 | u32 *regs_buff = p; | ||
322 | int ring, i = 0; | ||
323 | int port = adapter->physical_port; | ||
410 | 324 | ||
411 | memset(p, 0, NETXEN_NIC_REGS_LEN); | 325 | memset(p, 0, NETXEN_NIC_REGS_LEN); |
326 | |||
412 | regs->version = (1 << 24) | (adapter->ahw.revision_id << 16) | | 327 | regs->version = (1 << 24) | (adapter->ahw.revision_id << 16) | |
413 | (adapter->pdev)->device; | 328 | (adapter->pdev)->device; |
414 | /* which mode */ | ||
415 | regs_buff[0] = NXRD32(adapter, NETXEN_NIU_MODE); | ||
416 | mode = regs_buff[0]; | ||
417 | |||
418 | /* Common registers to all the modes */ | ||
419 | regs_buff[2] = NXRD32(adapter, NETXEN_NIU_STRAP_VALUE_SAVE_HIGHER); | ||
420 | /* GB/XGB Mode */ | ||
421 | mode = (mode / 2) - 1; | ||
422 | window = 0; | ||
423 | if (mode <= 1) { | ||
424 | for (i = 3; niu_registers[mode].reg[i - 3] != -1; i++) { | ||
425 | /* GB: port specific registers */ | ||
426 | if (mode == 0 && i >= 19) | ||
427 | window = adapter->physical_port * | ||
428 | NETXEN_NIC_PORT_WINDOW; | ||
429 | |||
430 | regs_buff[i] = NXRD32(adapter, | ||
431 | niu_registers[mode].reg[i - 3] + window); | ||
432 | } | ||
433 | 329 | ||
330 | if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC) | ||
331 | return; | ||
332 | |||
333 | regs_buff[i++] = NXRD32(adapter, CRB_CMDPEG_STATE); | ||
334 | regs_buff[i++] = NXRD32(adapter, CRB_RCVPEG_STATE); | ||
335 | regs_buff[i++] = NXRD32(adapter, CRB_FW_CAPABILITIES_1); | ||
336 | regs_buff[i++] = NXRDIO(adapter, adapter->crb_int_state_reg); | ||
337 | regs_buff[i++] = NXRD32(adapter, NX_CRB_DEV_REF_COUNT); | ||
338 | regs_buff[i++] = NXRD32(adapter, NX_CRB_DEV_STATE); | ||
339 | regs_buff[i++] = NXRD32(adapter, NETXEN_PEG_ALIVE_COUNTER); | ||
340 | regs_buff[i++] = NXRD32(adapter, NETXEN_PEG_HALT_STATUS1); | ||
341 | regs_buff[i++] = NXRD32(adapter, NETXEN_PEG_HALT_STATUS2); | ||
342 | |||
343 | regs_buff[i++] = NXRD32(adapter, NETXEN_CRB_PEG_NET_0+0x3c); | ||
344 | regs_buff[i++] = NXRD32(adapter, NETXEN_CRB_PEG_NET_1+0x3c); | ||
345 | regs_buff[i++] = NXRD32(adapter, NETXEN_CRB_PEG_NET_2+0x3c); | ||
346 | regs_buff[i++] = NXRD32(adapter, NETXEN_CRB_PEG_NET_3+0x3c); | ||
347 | |||
348 | if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) { | ||
349 | |||
350 | regs_buff[i++] = NXRD32(adapter, NETXEN_CRB_PEG_NET_4+0x3c); | ||
351 | i += 2; | ||
352 | |||
353 | regs_buff[i++] = NXRD32(adapter, CRB_XG_STATE_P3); | ||
354 | regs_buff[i++] = le32_to_cpu(*(adapter->tx_ring->hw_consumer)); | ||
355 | |||
356 | } else { | ||
357 | i++; | ||
358 | |||
359 | regs_buff[i++] = NXRD32(adapter, | ||
360 | NETXEN_NIU_XGE_CONFIG_0+(0x10000*port)); | ||
361 | regs_buff[i++] = NXRD32(adapter, | ||
362 | NETXEN_NIU_XGE_CONFIG_1+(0x10000*port)); | ||
363 | |||
364 | regs_buff[i++] = NXRD32(adapter, CRB_XG_STATE); | ||
365 | regs_buff[i++] = NXRDIO(adapter, | ||
366 | adapter->tx_ring->crb_cmd_consumer); | ||
367 | } | ||
368 | |||
369 | regs_buff[i++] = NXRDIO(adapter, adapter->tx_ring->crb_cmd_producer); | ||
370 | |||
371 | regs_buff[i++] = NXRDIO(adapter, | ||
372 | recv_ctx->rds_rings[0].crb_rcv_producer); | ||
373 | regs_buff[i++] = NXRDIO(adapter, | ||
374 | recv_ctx->rds_rings[1].crb_rcv_producer); | ||
375 | |||
376 | regs_buff[i++] = adapter->max_sds_rings; | ||
377 | |||
378 | for (ring = 0; ring < adapter->max_sds_rings; ring++) { | ||
379 | sds_ring = &(recv_ctx->sds_rings[ring]); | ||
380 | regs_buff[i++] = NXRDIO(adapter, | ||
381 | sds_ring->crb_sts_consumer); | ||
434 | } | 382 | } |
435 | } | 383 | } |
436 | 384 | ||
437 | static u32 netxen_nic_test_link(struct net_device *dev) | 385 | static u32 netxen_nic_test_link(struct net_device *dev) |
438 | { | 386 | { |
439 | struct netxen_adapter *adapter = netdev_priv(dev); | 387 | struct netxen_adapter *adapter = netdev_priv(dev); |
440 | __u32 status; | 388 | u32 val, port; |
441 | int val; | ||
442 | 389 | ||
443 | /* read which mode */ | 390 | port = adapter->physical_port; |
444 | if (adapter->ahw.port_type == NETXEN_NIC_GBE) { | 391 | if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) { |
445 | if (adapter->phy_read && | 392 | val = NXRD32(adapter, CRB_XG_STATE_P3); |
446 | adapter->phy_read(adapter, | 393 | val = XG_LINK_STATE_P3(adapter->ahw.pci_func, val); |
447 | NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS, | 394 | return (val == XG_LINK_UP_P3) ? 0 : 1; |
448 | &status) != 0) | 395 | } else { |
449 | return -EIO; | ||
450 | else { | ||
451 | val = netxen_get_phy_link(status); | ||
452 | return !val; | ||
453 | } | ||
454 | } else if (adapter->ahw.port_type == NETXEN_NIC_XGBE) { | ||
455 | val = NXRD32(adapter, CRB_XG_STATE); | 396 | val = NXRD32(adapter, CRB_XG_STATE); |
397 | val = (val >> port*8) & 0xff; | ||
456 | return (val == XG_LINK_UP) ? 0 : 1; | 398 | return (val == XG_LINK_UP) ? 0 : 1; |
457 | } | 399 | } |
458 | return -EIO; | ||
459 | } | 400 | } |
460 | 401 | ||
461 | static int | 402 | static int |
diff --git a/drivers/net/netxen/netxen_nic_hw.c b/drivers/net/netxen/netxen_nic_hw.c index 2e364fee3cbb..85e28e60ecf1 100644 --- a/drivers/net/netxen/netxen_nic_hw.c +++ b/drivers/net/netxen/netxen_nic_hw.c | |||
@@ -345,8 +345,7 @@ netxen_pcie_sem_lock(struct netxen_adapter *adapter, int sem, u32 id_reg) | |||
345 | void | 345 | void |
346 | netxen_pcie_sem_unlock(struct netxen_adapter *adapter, int sem) | 346 | netxen_pcie_sem_unlock(struct netxen_adapter *adapter, int sem) |
347 | { | 347 | { |
348 | int val; | 348 | NXRD32(adapter, NETXEN_PCIE_REG(PCIE_SEM_UNLOCK(sem))); |
349 | val = NXRD32(adapter, NETXEN_PCIE_REG(PCIE_SEM_UNLOCK(sem))); | ||
350 | } | 349 | } |
351 | 350 | ||
352 | int netxen_niu_xg_init_port(struct netxen_adapter *adapter, int port) | 351 | int netxen_niu_xg_init_port(struct netxen_adapter *adapter, int port) |
@@ -691,6 +690,9 @@ void netxen_p3_nic_set_multi(struct net_device *netdev) | |||
691 | struct list_head *head; | 690 | struct list_head *head; |
692 | nx_mac_list_t *cur; | 691 | nx_mac_list_t *cur; |
693 | 692 | ||
693 | if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC) | ||
694 | return; | ||
695 | |||
694 | list_splice_tail_init(&adapter->mac_list, &del_list); | 696 | list_splice_tail_init(&adapter->mac_list, &del_list); |
695 | 697 | ||
696 | nx_p3_nic_add_mac(adapter, adapter->mac_addr, &del_list); | 698 | nx_p3_nic_add_mac(adapter, adapter->mac_addr, &del_list); |
diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c index 80a667460514..64cff68d372c 100644 --- a/drivers/net/netxen/netxen_nic_init.c +++ b/drivers/net/netxen/netxen_nic_init.c | |||
@@ -184,6 +184,8 @@ skip_rds: | |||
184 | 184 | ||
185 | tx_ring = adapter->tx_ring; | 185 | tx_ring = adapter->tx_ring; |
186 | vfree(tx_ring->cmd_buf_arr); | 186 | vfree(tx_ring->cmd_buf_arr); |
187 | kfree(tx_ring); | ||
188 | adapter->tx_ring = NULL; | ||
187 | } | 189 | } |
188 | 190 | ||
189 | int netxen_alloc_sw_resources(struct netxen_adapter *adapter) | 191 | int netxen_alloc_sw_resources(struct netxen_adapter *adapter) |
@@ -619,17 +621,20 @@ nx_set_product_offs(struct netxen_adapter *adapter) | |||
619 | uint32_t i; | 621 | uint32_t i; |
620 | __le32 entries; | 622 | __le32 entries; |
621 | 623 | ||
624 | int mn_present = (NX_IS_REVISION_P2(adapter->ahw.revision_id)) ? | ||
625 | 1 : netxen_p3_has_mn(adapter); | ||
626 | |||
622 | ptab_descr = nx_get_table_desc(unirom, NX_UNI_DIR_SECT_PRODUCT_TBL); | 627 | ptab_descr = nx_get_table_desc(unirom, NX_UNI_DIR_SECT_PRODUCT_TBL); |
623 | if (ptab_descr == NULL) | 628 | if (ptab_descr == NULL) |
624 | return -1; | 629 | return -1; |
625 | 630 | ||
626 | entries = cpu_to_le32(ptab_descr->num_entries); | 631 | entries = cpu_to_le32(ptab_descr->num_entries); |
627 | 632 | ||
633 | nomn: | ||
628 | for (i = 0; i < entries; i++) { | 634 | for (i = 0; i < entries; i++) { |
629 | 635 | ||
630 | __le32 flags, file_chiprev, offs; | 636 | __le32 flags, file_chiprev, offs; |
631 | u8 chiprev = adapter->ahw.revision_id; | 637 | u8 chiprev = adapter->ahw.revision_id; |
632 | int mn_present = netxen_p3_has_mn(adapter); | ||
633 | uint32_t flagbit; | 638 | uint32_t flagbit; |
634 | 639 | ||
635 | offs = cpu_to_le32(ptab_descr->findex) + | 640 | offs = cpu_to_le32(ptab_descr->findex) + |
@@ -647,6 +652,11 @@ nx_set_product_offs(struct netxen_adapter *adapter) | |||
647 | } | 652 | } |
648 | } | 653 | } |
649 | 654 | ||
655 | if (mn_present && NX_IS_REVISION_P3(adapter->ahw.revision_id)) { | ||
656 | mn_present = 0; | ||
657 | goto nomn; | ||
658 | } | ||
659 | |||
650 | return -1; | 660 | return -1; |
651 | } | 661 | } |
652 | 662 | ||
@@ -774,7 +784,7 @@ netxen_need_fw_reset(struct netxen_adapter *adapter) | |||
774 | if (NXRD32(adapter, CRB_CMDPEG_STATE) == PHAN_INITIALIZE_FAILED) | 784 | if (NXRD32(adapter, CRB_CMDPEG_STATE) == PHAN_INITIALIZE_FAILED) |
775 | return 1; | 785 | return 1; |
776 | 786 | ||
777 | old_count = count = NXRD32(adapter, NETXEN_PEG_ALIVE_COUNTER); | 787 | old_count = NXRD32(adapter, NETXEN_PEG_ALIVE_COUNTER); |
778 | 788 | ||
779 | for (i = 0; i < 10; i++) { | 789 | for (i = 0; i < 10; i++) { |
780 | 790 | ||
@@ -1021,6 +1031,10 @@ netxen_p3_has_mn(struct netxen_adapter *adapter) | |||
1021 | u32 capability, flashed_ver; | 1031 | u32 capability, flashed_ver; |
1022 | capability = 0; | 1032 | capability = 0; |
1023 | 1033 | ||
1034 | /* NX2031 always had MN */ | ||
1035 | if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) | ||
1036 | return 1; | ||
1037 | |||
1024 | netxen_rom_fast_read(adapter, | 1038 | netxen_rom_fast_read(adapter, |
1025 | NX_FW_VERSION_OFFSET, (int *)&flashed_ver); | 1039 | NX_FW_VERSION_OFFSET, (int *)&flashed_ver); |
1026 | flashed_ver = NETXEN_DECODE_VERSION(flashed_ver); | 1040 | flashed_ver = NETXEN_DECODE_VERSION(flashed_ver); |
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index e5d187fce51b..9f9d6081959b 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
@@ -57,7 +57,9 @@ static int use_msi = 1; | |||
57 | 57 | ||
58 | static int use_msi_x = 1; | 58 | static int use_msi_x = 1; |
59 | 59 | ||
60 | static unsigned long auto_fw_reset = AUTO_FW_RESET_ENABLED; | 60 | static int auto_fw_reset = AUTO_FW_RESET_ENABLED; |
61 | module_param(auto_fw_reset, int, 0644); | ||
62 | MODULE_PARM_DESC(auto_fw_reset,"Auto firmware reset (0=disabled, 1=enabled"); | ||
61 | 63 | ||
62 | static int __devinit netxen_nic_probe(struct pci_dev *pdev, | 64 | static int __devinit netxen_nic_probe(struct pci_dev *pdev, |
63 | const struct pci_device_id *ent); | 65 | const struct pci_device_id *ent); |
@@ -338,7 +340,7 @@ netxen_check_hw_init(struct netxen_adapter *adapter, int first_boot) | |||
338 | if (!(first_boot & 0x4)) { | 340 | if (!(first_boot & 0x4)) { |
339 | first_boot |= 0x4; | 341 | first_boot |= 0x4; |
340 | NXWR32(adapter, NETXEN_PCIE_REG(0x4), first_boot); | 342 | NXWR32(adapter, NETXEN_PCIE_REG(0x4), first_boot); |
341 | first_boot = NXRD32(adapter, NETXEN_PCIE_REG(0x4)); | 343 | NXRD32(adapter, NETXEN_PCIE_REG(0x4)); |
342 | } | 344 | } |
343 | 345 | ||
344 | /* This is the first boot after power up */ | 346 | /* This is the first boot after power up */ |
@@ -946,8 +948,9 @@ netxen_nic_init_coalesce_defaults(struct netxen_adapter *adapter) | |||
946 | NETXEN_DEFAULT_INTR_COALESCE_TX_PACKETS; | 948 | NETXEN_DEFAULT_INTR_COALESCE_TX_PACKETS; |
947 | } | 949 | } |
948 | 950 | ||
951 | /* with rtnl_lock */ | ||
949 | static int | 952 | static int |
950 | netxen_nic_up(struct netxen_adapter *adapter, struct net_device *netdev) | 953 | __netxen_nic_up(struct netxen_adapter *adapter, struct net_device *netdev) |
951 | { | 954 | { |
952 | int err; | 955 | int err; |
953 | 956 | ||
@@ -988,14 +991,32 @@ netxen_nic_up(struct netxen_adapter *adapter, struct net_device *netdev) | |||
988 | return 0; | 991 | return 0; |
989 | } | 992 | } |
990 | 993 | ||
994 | /* Usage: During resume and firmware recovery module.*/ | ||
995 | |||
996 | static inline int | ||
997 | netxen_nic_up(struct netxen_adapter *adapter, struct net_device *netdev) | ||
998 | { | ||
999 | int err = 0; | ||
1000 | |||
1001 | rtnl_lock(); | ||
1002 | if (netif_running(netdev)) | ||
1003 | err = __netxen_nic_up(adapter, netdev); | ||
1004 | rtnl_unlock(); | ||
1005 | |||
1006 | return err; | ||
1007 | } | ||
1008 | |||
1009 | /* with rtnl_lock */ | ||
991 | static void | 1010 | static void |
992 | netxen_nic_down(struct netxen_adapter *adapter, struct net_device *netdev) | 1011 | __netxen_nic_down(struct netxen_adapter *adapter, struct net_device *netdev) |
993 | { | 1012 | { |
994 | if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC) | 1013 | if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC) |
995 | return; | 1014 | return; |
996 | 1015 | ||
997 | clear_bit(__NX_DEV_UP, &adapter->state); | 1016 | if (!test_and_clear_bit(__NX_DEV_UP, &adapter->state)) |
1017 | return; | ||
998 | 1018 | ||
1019 | smp_mb(); | ||
999 | spin_lock(&adapter->tx_clean_lock); | 1020 | spin_lock(&adapter->tx_clean_lock); |
1000 | netif_carrier_off(netdev); | 1021 | netif_carrier_off(netdev); |
1001 | netif_tx_disable(netdev); | 1022 | netif_tx_disable(netdev); |
@@ -1014,6 +1035,17 @@ netxen_nic_down(struct netxen_adapter *adapter, struct net_device *netdev) | |||
1014 | spin_unlock(&adapter->tx_clean_lock); | 1035 | spin_unlock(&adapter->tx_clean_lock); |
1015 | } | 1036 | } |
1016 | 1037 | ||
1038 | /* Usage: During suspend and firmware recovery module */ | ||
1039 | |||
1040 | static inline void | ||
1041 | netxen_nic_down(struct netxen_adapter *adapter, struct net_device *netdev) | ||
1042 | { | ||
1043 | rtnl_lock(); | ||
1044 | if (netif_running(netdev)) | ||
1045 | __netxen_nic_down(adapter, netdev); | ||
1046 | rtnl_unlock(); | ||
1047 | |||
1048 | } | ||
1017 | 1049 | ||
1018 | static int | 1050 | static int |
1019 | netxen_nic_attach(struct netxen_adapter *adapter) | 1051 | netxen_nic_attach(struct netxen_adapter *adapter) |
@@ -1122,14 +1154,14 @@ netxen_nic_reset_context(struct netxen_adapter *adapter) | |||
1122 | netif_device_detach(netdev); | 1154 | netif_device_detach(netdev); |
1123 | 1155 | ||
1124 | if (netif_running(netdev)) | 1156 | if (netif_running(netdev)) |
1125 | netxen_nic_down(adapter, netdev); | 1157 | __netxen_nic_down(adapter, netdev); |
1126 | 1158 | ||
1127 | netxen_nic_detach(adapter); | 1159 | netxen_nic_detach(adapter); |
1128 | 1160 | ||
1129 | if (netif_running(netdev)) { | 1161 | if (netif_running(netdev)) { |
1130 | err = netxen_nic_attach(adapter); | 1162 | err = netxen_nic_attach(adapter); |
1131 | if (!err) | 1163 | if (!err) |
1132 | err = netxen_nic_up(adapter, netdev); | 1164 | err = __netxen_nic_up(adapter, netdev); |
1133 | 1165 | ||
1134 | if (err) | 1166 | if (err) |
1135 | goto done; | 1167 | goto done; |
@@ -1499,7 +1531,7 @@ static int netxen_nic_open(struct net_device *netdev) | |||
1499 | if (err) | 1531 | if (err) |
1500 | return err; | 1532 | return err; |
1501 | 1533 | ||
1502 | err = netxen_nic_up(adapter, netdev); | 1534 | err = __netxen_nic_up(adapter, netdev); |
1503 | if (err) | 1535 | if (err) |
1504 | goto err_out; | 1536 | goto err_out; |
1505 | 1537 | ||
@@ -1519,7 +1551,7 @@ static int netxen_nic_close(struct net_device *netdev) | |||
1519 | { | 1551 | { |
1520 | struct netxen_adapter *adapter = netdev_priv(netdev); | 1552 | struct netxen_adapter *adapter = netdev_priv(netdev); |
1521 | 1553 | ||
1522 | netxen_nic_down(adapter, netdev); | 1554 | __netxen_nic_down(adapter, netdev); |
1523 | return 0; | 1555 | return 0; |
1524 | } | 1556 | } |
1525 | 1557 | ||
@@ -1866,12 +1898,8 @@ static void netxen_nic_handle_phy_intr(struct netxen_adapter *adapter) | |||
1866 | linkup = (val == XG_LINK_UP_P3); | 1898 | linkup = (val == XG_LINK_UP_P3); |
1867 | } else { | 1899 | } else { |
1868 | val = NXRD32(adapter, CRB_XG_STATE); | 1900 | val = NXRD32(adapter, CRB_XG_STATE); |
1869 | if (adapter->ahw.port_type == NETXEN_NIC_GBE) | 1901 | val = (val >> port*8) & 0xff; |
1870 | linkup = (val >> port) & 1; | 1902 | linkup = (val == XG_LINK_UP); |
1871 | else { | ||
1872 | val = (val >> port*8) & 0xff; | ||
1873 | linkup = (val == XG_LINK_UP); | ||
1874 | } | ||
1875 | } | 1903 | } |
1876 | 1904 | ||
1877 | netxen_advert_link_change(adapter, linkup); | 1905 | netxen_advert_link_change(adapter, linkup); |
@@ -2025,7 +2053,7 @@ static int netxen_nic_poll(struct napi_struct *napi, int budget) | |||
2025 | 2053 | ||
2026 | if ((work_done < budget) && tx_complete) { | 2054 | if ((work_done < budget) && tx_complete) { |
2027 | napi_complete(&sds_ring->napi); | 2055 | napi_complete(&sds_ring->napi); |
2028 | if (netif_running(adapter->netdev)) | 2056 | if (test_bit(__NX_DEV_UP, &adapter->state)) |
2029 | netxen_nic_enable_int(sds_ring); | 2057 | netxen_nic_enable_int(sds_ring); |
2030 | } | 2058 | } |
2031 | 2059 | ||
@@ -2210,8 +2238,7 @@ netxen_detach_work(struct work_struct *work) | |||
2210 | 2238 | ||
2211 | netif_device_detach(netdev); | 2239 | netif_device_detach(netdev); |
2212 | 2240 | ||
2213 | if (netif_running(netdev)) | 2241 | netxen_nic_down(adapter, netdev); |
2214 | netxen_nic_down(adapter, netdev); | ||
2215 | 2242 | ||
2216 | netxen_nic_detach(adapter); | 2243 | netxen_nic_detach(adapter); |
2217 | 2244 | ||
@@ -2505,42 +2532,6 @@ static struct bin_attribute bin_attr_mem = { | |||
2505 | .write = netxen_sysfs_write_mem, | 2532 | .write = netxen_sysfs_write_mem, |
2506 | }; | 2533 | }; |
2507 | 2534 | ||
2508 | #ifdef CONFIG_MODULES | ||
2509 | static ssize_t | ||
2510 | netxen_store_auto_fw_reset(struct module_attribute *mattr, | ||
2511 | struct module *mod, const char *buf, size_t count) | ||
2512 | |||
2513 | { | ||
2514 | unsigned long new; | ||
2515 | |||
2516 | if (strict_strtoul(buf, 16, &new)) | ||
2517 | return -EINVAL; | ||
2518 | |||
2519 | if ((new == AUTO_FW_RESET_ENABLED) || (new == AUTO_FW_RESET_DISABLED)) { | ||
2520 | auto_fw_reset = new; | ||
2521 | return count; | ||
2522 | } | ||
2523 | |||
2524 | return -EINVAL; | ||
2525 | } | ||
2526 | |||
2527 | static ssize_t | ||
2528 | netxen_show_auto_fw_reset(struct module_attribute *mattr, | ||
2529 | struct module *mod, char *buf) | ||
2530 | |||
2531 | { | ||
2532 | if (auto_fw_reset == AUTO_FW_RESET_ENABLED) | ||
2533 | return sprintf(buf, "enabled\n"); | ||
2534 | else | ||
2535 | return sprintf(buf, "disabled\n"); | ||
2536 | } | ||
2537 | |||
2538 | static struct module_attribute mod_attr_fw_reset = { | ||
2539 | .attr = {.name = "auto_fw_reset", .mode = (S_IRUGO | S_IWUSR)}, | ||
2540 | .show = netxen_show_auto_fw_reset, | ||
2541 | .store = netxen_store_auto_fw_reset, | ||
2542 | }; | ||
2543 | #endif | ||
2544 | 2535 | ||
2545 | static void | 2536 | static void |
2546 | netxen_create_sysfs_entries(struct netxen_adapter *adapter) | 2537 | netxen_create_sysfs_entries(struct netxen_adapter *adapter) |
@@ -2746,23 +2737,12 @@ static struct pci_driver netxen_driver = { | |||
2746 | 2737 | ||
2747 | static int __init netxen_init_module(void) | 2738 | static int __init netxen_init_module(void) |
2748 | { | 2739 | { |
2749 | #ifdef CONFIG_MODULES | ||
2750 | struct module *mod = THIS_MODULE; | ||
2751 | #endif | ||
2752 | |||
2753 | printk(KERN_INFO "%s\n", netxen_nic_driver_string); | 2740 | printk(KERN_INFO "%s\n", netxen_nic_driver_string); |
2754 | 2741 | ||
2755 | #ifdef CONFIG_INET | 2742 | #ifdef CONFIG_INET |
2756 | register_netdevice_notifier(&netxen_netdev_cb); | 2743 | register_netdevice_notifier(&netxen_netdev_cb); |
2757 | register_inetaddr_notifier(&netxen_inetaddr_cb); | 2744 | register_inetaddr_notifier(&netxen_inetaddr_cb); |
2758 | #endif | 2745 | #endif |
2759 | |||
2760 | #ifdef CONFIG_MODULES | ||
2761 | if (sysfs_create_file(&mod->mkobj.kobj, &mod_attr_fw_reset.attr)) | ||
2762 | printk(KERN_ERR "%s: Failed to create auto_fw_reset " | ||
2763 | "sysfs entry.", netxen_nic_driver_name); | ||
2764 | #endif | ||
2765 | |||
2766 | return pci_register_driver(&netxen_driver); | 2746 | return pci_register_driver(&netxen_driver); |
2767 | } | 2747 | } |
2768 | 2748 | ||
@@ -2770,12 +2750,6 @@ module_init(netxen_init_module); | |||
2770 | 2750 | ||
2771 | static void __exit netxen_exit_module(void) | 2751 | static void __exit netxen_exit_module(void) |
2772 | { | 2752 | { |
2773 | #ifdef CONFIG_MODULES | ||
2774 | struct module *mod = THIS_MODULE; | ||
2775 | |||
2776 | sysfs_remove_file(&mod->mkobj.kobj, &mod_attr_fw_reset.attr); | ||
2777 | #endif | ||
2778 | |||
2779 | pci_unregister_driver(&netxen_driver); | 2753 | pci_unregister_driver(&netxen_driver); |
2780 | 2754 | ||
2781 | #ifdef CONFIG_INET | 2755 | #ifdef CONFIG_INET |