aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/netxen
diff options
context:
space:
mode:
authorJiri Kosina <jkosina@suse.cz>2010-02-02 17:10:39 -0500
committerJiri Kosina <jkosina@suse.cz>2010-02-02 17:10:39 -0500
commite1a0bdd8022317e98650e70850de73eccfcde5ad (patch)
tree462f63307118b95c8cbacee6954e4d09ee85b8d1 /drivers/net/netxen
parent8127f4e883666c9960cfa89cffd36313748f8bab (diff)
parent1a45dcfe2525e9432cb4aba461d4994fc2befe42 (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.h4
-rw-r--r--drivers/net/netxen/netxen_nic_ethtool.c193
-rw-r--r--drivers/net/netxen/netxen_nic_hw.c6
-rw-r--r--drivers/net/netxen/netxen_nic_init.c18
-rw-r--r--drivers/net/netxen/netxen_nic_main.c116
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
315struct netxen_niu_regs {
316 __u32 reg[NETXEN_NIC_REGS_COUNT];
317};
318
319static 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
404static void 315static void
405netxen_nic_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p) 316netxen_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
437static u32 netxen_nic_test_link(struct net_device *dev) 385static 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
461static int 402static 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)
345void 345void
346netxen_pcie_sem_unlock(struct netxen_adapter *adapter, int sem) 346netxen_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
352int netxen_niu_xg_init_port(struct netxen_adapter *adapter, int port) 351int 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
189int netxen_alloc_sw_resources(struct netxen_adapter *adapter) 191int 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
633nomn:
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
58static int use_msi_x = 1; 58static int use_msi_x = 1;
59 59
60static unsigned long auto_fw_reset = AUTO_FW_RESET_ENABLED; 60static int auto_fw_reset = AUTO_FW_RESET_ENABLED;
61module_param(auto_fw_reset, int, 0644);
62MODULE_PARM_DESC(auto_fw_reset,"Auto firmware reset (0=disabled, 1=enabled");
61 63
62static int __devinit netxen_nic_probe(struct pci_dev *pdev, 64static 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 */
949static int 952static int
950netxen_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
996static inline int
997netxen_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 */
991static void 1010static void
992netxen_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
1040static inline void
1041netxen_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
1018static int 1050static int
1019netxen_nic_attach(struct netxen_adapter *adapter) 1051netxen_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
2509static ssize_t
2510netxen_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
2527static ssize_t
2528netxen_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
2538static 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
2545static void 2536static void
2546netxen_create_sysfs_entries(struct netxen_adapter *adapter) 2537netxen_create_sysfs_entries(struct netxen_adapter *adapter)
@@ -2746,23 +2737,12 @@ static struct pci_driver netxen_driver = {
2746 2737
2747static int __init netxen_init_module(void) 2738static 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
2771static void __exit netxen_exit_module(void) 2751static 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