diff options
25 files changed, 830 insertions, 575 deletions
diff --git a/drivers/net/8139cp.c b/drivers/net/8139cp.c index 458dd9f830c4..e2cb19b582a1 100644 --- a/drivers/net/8139cp.c +++ b/drivers/net/8139cp.c | |||
| @@ -617,13 +617,15 @@ rx_next: | |||
| 617 | * this round of polling | 617 | * this round of polling |
| 618 | */ | 618 | */ |
| 619 | if (rx_work) { | 619 | if (rx_work) { |
| 620 | unsigned long flags; | ||
| 621 | |||
| 620 | if (cpr16(IntrStatus) & cp_rx_intr_mask) | 622 | if (cpr16(IntrStatus) & cp_rx_intr_mask) |
| 621 | goto rx_status_loop; | 623 | goto rx_status_loop; |
| 622 | 624 | ||
| 623 | local_irq_disable(); | 625 | local_irq_save(flags); |
| 624 | cpw16_f(IntrMask, cp_intr_mask); | 626 | cpw16_f(IntrMask, cp_intr_mask); |
| 625 | __netif_rx_complete(dev); | 627 | __netif_rx_complete(dev); |
| 626 | local_irq_enable(); | 628 | local_irq_restore(flags); |
| 627 | 629 | ||
| 628 | return 0; /* done */ | 630 | return 0; /* done */ |
| 629 | } | 631 | } |
diff --git a/drivers/net/arm/ep93xx_eth.c b/drivers/net/arm/ep93xx_eth.c index 8ebd68e2af98..dd698b033a62 100644 --- a/drivers/net/arm/ep93xx_eth.c +++ b/drivers/net/arm/ep93xx_eth.c | |||
| @@ -780,12 +780,10 @@ static struct ethtool_ops ep93xx_ethtool_ops = { | |||
| 780 | struct net_device *ep93xx_dev_alloc(struct ep93xx_eth_data *data) | 780 | struct net_device *ep93xx_dev_alloc(struct ep93xx_eth_data *data) |
| 781 | { | 781 | { |
| 782 | struct net_device *dev; | 782 | struct net_device *dev; |
| 783 | struct ep93xx_priv *ep; | ||
| 784 | 783 | ||
| 785 | dev = alloc_etherdev(sizeof(struct ep93xx_priv)); | 784 | dev = alloc_etherdev(sizeof(struct ep93xx_priv)); |
| 786 | if (dev == NULL) | 785 | if (dev == NULL) |
| 787 | return NULL; | 786 | return NULL; |
| 788 | ep = netdev_priv(dev); | ||
| 789 | 787 | ||
| 790 | memcpy(dev->dev_addr, data->dev_addr, ETH_ALEN); | 788 | memcpy(dev->dev_addr, data->dev_addr, ETH_ALEN); |
| 791 | 789 | ||
| @@ -840,9 +838,9 @@ static int ep93xx_eth_probe(struct platform_device *pdev) | |||
| 840 | struct ep93xx_priv *ep; | 838 | struct ep93xx_priv *ep; |
| 841 | int err; | 839 | int err; |
| 842 | 840 | ||
| 843 | data = pdev->dev.platform_data; | ||
| 844 | if (pdev == NULL) | 841 | if (pdev == NULL) |
| 845 | return -ENODEV; | 842 | return -ENODEV; |
| 843 | data = pdev->dev.platform_data; | ||
| 846 | 844 | ||
| 847 | dev = ep93xx_dev_alloc(data); | 845 | dev = ep93xx_dev_alloc(data); |
| 848 | if (dev == NULL) { | 846 | if (dev == NULL) { |
diff --git a/drivers/net/b44.c b/drivers/net/b44.c index 474a4e3438db..5eb2ec68393f 100644 --- a/drivers/net/b44.c +++ b/drivers/net/b44.c | |||
| @@ -879,12 +879,14 @@ static int b44_poll(struct net_device *netdev, int *budget) | |||
| 879 | } | 879 | } |
| 880 | 880 | ||
| 881 | if (bp->istat & ISTAT_ERRORS) { | 881 | if (bp->istat & ISTAT_ERRORS) { |
| 882 | spin_lock_irq(&bp->lock); | 882 | unsigned long flags; |
| 883 | |||
| 884 | spin_lock_irqsave(&bp->lock, flags); | ||
| 883 | b44_halt(bp); | 885 | b44_halt(bp); |
| 884 | b44_init_rings(bp); | 886 | b44_init_rings(bp); |
| 885 | b44_init_hw(bp, 1); | 887 | b44_init_hw(bp, 1); |
| 886 | netif_wake_queue(bp->dev); | 888 | netif_wake_queue(bp->dev); |
| 887 | spin_unlock_irq(&bp->lock); | 889 | spin_unlock_irqrestore(&bp->lock, flags); |
| 888 | done = 1; | 890 | done = 1; |
| 889 | } | 891 | } |
| 890 | 892 | ||
diff --git a/drivers/net/e1000/e1000_ethtool.c b/drivers/net/e1000/e1000_ethtool.c index da459f7177c6..fb96c87f9e56 100644 --- a/drivers/net/e1000/e1000_ethtool.c +++ b/drivers/net/e1000/e1000_ethtool.c | |||
| @@ -100,6 +100,9 @@ static const struct e1000_stats e1000_gstrings_stats[] = { | |||
| 100 | { "rx_csum_offload_errors", E1000_STAT(hw_csum_err) }, | 100 | { "rx_csum_offload_errors", E1000_STAT(hw_csum_err) }, |
| 101 | { "rx_header_split", E1000_STAT(rx_hdr_split) }, | 101 | { "rx_header_split", E1000_STAT(rx_hdr_split) }, |
| 102 | { "alloc_rx_buff_failed", E1000_STAT(alloc_rx_buff_failed) }, | 102 | { "alloc_rx_buff_failed", E1000_STAT(alloc_rx_buff_failed) }, |
| 103 | { "tx_smbus", E1000_STAT(stats.mgptc) }, | ||
| 104 | { "rx_smbus", E1000_STAT(stats.mgprc) }, | ||
| 105 | { "dropped_smbus", E1000_STAT(stats.mgpdc) }, | ||
| 103 | }; | 106 | }; |
| 104 | 107 | ||
| 105 | #define E1000_QUEUE_STATS_LEN 0 | 108 | #define E1000_QUEUE_STATS_LEN 0 |
diff --git a/drivers/net/e1000/e1000_hw.c b/drivers/net/e1000/e1000_hw.c index 3655d902b0bd..9be44699300b 100644 --- a/drivers/net/e1000/e1000_hw.c +++ b/drivers/net/e1000/e1000_hw.c | |||
| @@ -308,141 +308,160 @@ e1000_phy_init_script(struct e1000_hw *hw) | |||
| 308 | int32_t | 308 | int32_t |
| 309 | e1000_set_mac_type(struct e1000_hw *hw) | 309 | e1000_set_mac_type(struct e1000_hw *hw) |
| 310 | { | 310 | { |
| 311 | DEBUGFUNC("e1000_set_mac_type"); | 311 | DEBUGFUNC("e1000_set_mac_type"); |
| 312 | 312 | ||
| 313 | switch (hw->device_id) { | 313 | switch (hw->device_id) { |
| 314 | case E1000_DEV_ID_82542: | 314 | case E1000_DEV_ID_82542: |
| 315 | switch (hw->revision_id) { | 315 | switch (hw->revision_id) { |
| 316 | case E1000_82542_2_0_REV_ID: | 316 | case E1000_82542_2_0_REV_ID: |
| 317 | hw->mac_type = e1000_82542_rev2_0; | 317 | hw->mac_type = e1000_82542_rev2_0; |
| 318 | break; | 318 | break; |
| 319 | case E1000_82542_2_1_REV_ID: | 319 | case E1000_82542_2_1_REV_ID: |
| 320 | hw->mac_type = e1000_82542_rev2_1; | 320 | hw->mac_type = e1000_82542_rev2_1; |
| 321 | break; | 321 | break; |
| 322 | default: | 322 | default: |
| 323 | /* Invalid 82542 revision ID */ | 323 | /* Invalid 82542 revision ID */ |
| 324 | return -E1000_ERR_MAC_TYPE; | 324 | return -E1000_ERR_MAC_TYPE; |
| 325 | } | 325 | } |
| 326 | break; | 326 | break; |
| 327 | case E1000_DEV_ID_82543GC_FIBER: | 327 | case E1000_DEV_ID_82543GC_FIBER: |
| 328 | case E1000_DEV_ID_82543GC_COPPER: | 328 | case E1000_DEV_ID_82543GC_COPPER: |
| 329 | hw->mac_type = e1000_82543; | 329 | hw->mac_type = e1000_82543; |
| 330 | break; | 330 | break; |
| 331 | case E1000_DEV_ID_82544EI_COPPER: | 331 | case E1000_DEV_ID_82544EI_COPPER: |
| 332 | case E1000_DEV_ID_82544EI_FIBER: | 332 | case E1000_DEV_ID_82544EI_FIBER: |
| 333 | case E1000_DEV_ID_82544GC_COPPER: | 333 | case E1000_DEV_ID_82544GC_COPPER: |
| 334 | case E1000_DEV_ID_82544GC_LOM: | 334 | case E1000_DEV_ID_82544GC_LOM: |
| 335 | hw->mac_type = e1000_82544; | 335 | hw->mac_type = e1000_82544; |
| 336 | break; | 336 | break; |
| 337 | case E1000_DEV_ID_82540EM: | 337 | case E1000_DEV_ID_82540EM: |
| 338 | case E1000_DEV_ID_82540EM_LOM: | 338 | case E1000_DEV_ID_82540EM_LOM: |
| 339 | case E1000_DEV_ID_82540EP: | 339 | case E1000_DEV_ID_82540EP: |
| 340 | case E1000_DEV_ID_82540EP_LOM: | 340 | case E1000_DEV_ID_82540EP_LOM: |
| 341 | case E1000_DEV_ID_82540EP_LP: | 341 | case E1000_DEV_ID_82540EP_LP: |
| 342 | hw->mac_type = e1000_82540; | 342 | hw->mac_type = e1000_82540; |
| 343 | break; | 343 | break; |
| 344 | case E1000_DEV_ID_82545EM_COPPER: | 344 | case E1000_DEV_ID_82545EM_COPPER: |
| 345 | case E1000_DEV_ID_82545EM_FIBER: | 345 | case E1000_DEV_ID_82545EM_FIBER: |
| 346 | hw->mac_type = e1000_82545; | 346 | hw->mac_type = e1000_82545; |
| 347 | break; | 347 | break; |
| 348 | case E1000_DEV_ID_82545GM_COPPER: | 348 | case E1000_DEV_ID_82545GM_COPPER: |
| 349 | case E1000_DEV_ID_82545GM_FIBER: | 349 | case E1000_DEV_ID_82545GM_FIBER: |
| 350 | case E1000_DEV_ID_82545GM_SERDES: | 350 | case E1000_DEV_ID_82545GM_SERDES: |
| 351 | hw->mac_type = e1000_82545_rev_3; | 351 | hw->mac_type = e1000_82545_rev_3; |
| 352 | break; | 352 | break; |
| 353 | case E1000_DEV_ID_82546EB_COPPER: | 353 | case E1000_DEV_ID_82546EB_COPPER: |
| 354 | case E1000_DEV_ID_82546EB_FIBER: | 354 | case E1000_DEV_ID_82546EB_FIBER: |
| 355 | case E1000_DEV_ID_82546EB_QUAD_COPPER: | 355 | case E1000_DEV_ID_82546EB_QUAD_COPPER: |
| 356 | hw->mac_type = e1000_82546; | 356 | hw->mac_type = e1000_82546; |
| 357 | break; | 357 | break; |
| 358 | case E1000_DEV_ID_82546GB_COPPER: | 358 | case E1000_DEV_ID_82546GB_COPPER: |
| 359 | case E1000_DEV_ID_82546GB_FIBER: | 359 | case E1000_DEV_ID_82546GB_FIBER: |
| 360 | case E1000_DEV_ID_82546GB_SERDES: | 360 | case E1000_DEV_ID_82546GB_SERDES: |
| 361 | case E1000_DEV_ID_82546GB_PCIE: | 361 | case E1000_DEV_ID_82546GB_PCIE: |
| 362 | case E1000_DEV_ID_82546GB_QUAD_COPPER: | 362 | case E1000_DEV_ID_82546GB_QUAD_COPPER: |
| 363 | case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3: | 363 | case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3: |
| 364 | hw->mac_type = e1000_82546_rev_3; | 364 | hw->mac_type = e1000_82546_rev_3; |
| 365 | break; | 365 | break; |
| 366 | case E1000_DEV_ID_82541EI: | 366 | case E1000_DEV_ID_82541EI: |
| 367 | case E1000_DEV_ID_82541EI_MOBILE: | 367 | case E1000_DEV_ID_82541EI_MOBILE: |
| 368 | case E1000_DEV_ID_82541ER_LOM: | 368 | case E1000_DEV_ID_82541ER_LOM: |
| 369 | hw->mac_type = e1000_82541; | 369 | hw->mac_type = e1000_82541; |
| 370 | break; | 370 | break; |
| 371 | case E1000_DEV_ID_82541ER: | 371 | case E1000_DEV_ID_82541ER: |
| 372 | case E1000_DEV_ID_82541GI: | 372 | case E1000_DEV_ID_82541GI: |
| 373 | case E1000_DEV_ID_82541GI_LF: | 373 | case E1000_DEV_ID_82541GI_LF: |
| 374 | case E1000_DEV_ID_82541GI_MOBILE: | 374 | case E1000_DEV_ID_82541GI_MOBILE: |
| 375 | hw->mac_type = e1000_82541_rev_2; | 375 | hw->mac_type = e1000_82541_rev_2; |
| 376 | break; | 376 | break; |
| 377 | case E1000_DEV_ID_82547EI: | 377 | case E1000_DEV_ID_82547EI: |
| 378 | case E1000_DEV_ID_82547EI_MOBILE: | 378 | case E1000_DEV_ID_82547EI_MOBILE: |
| 379 | hw->mac_type = e1000_82547; | 379 | hw->mac_type = e1000_82547; |
| 380 | break; | 380 | break; |
| 381 | case E1000_DEV_ID_82547GI: | 381 | case E1000_DEV_ID_82547GI: |
| 382 | hw->mac_type = e1000_82547_rev_2; | 382 | hw->mac_type = e1000_82547_rev_2; |
| 383 | break; | 383 | break; |
| 384 | case E1000_DEV_ID_82571EB_COPPER: | 384 | case E1000_DEV_ID_82571EB_COPPER: |
| 385 | case E1000_DEV_ID_82571EB_FIBER: | 385 | case E1000_DEV_ID_82571EB_FIBER: |
| 386 | case E1000_DEV_ID_82571EB_SERDES: | 386 | case E1000_DEV_ID_82571EB_SERDES: |
| 387 | case E1000_DEV_ID_82571EB_QUAD_COPPER: | 387 | case E1000_DEV_ID_82571EB_QUAD_COPPER: |
| 388 | case E1000_DEV_ID_82571EB_QUAD_COPPER_LOWPROFILE: | 388 | case E1000_DEV_ID_82571EB_QUAD_COPPER_LOWPROFILE: |
| 389 | hw->mac_type = e1000_82571; | 389 | hw->mac_type = e1000_82571; |
| 390 | break; | 390 | break; |
| 391 | case E1000_DEV_ID_82572EI_COPPER: | 391 | case E1000_DEV_ID_82572EI_COPPER: |
| 392 | case E1000_DEV_ID_82572EI_FIBER: | 392 | case E1000_DEV_ID_82572EI_FIBER: |
| 393 | case E1000_DEV_ID_82572EI_SERDES: | 393 | case E1000_DEV_ID_82572EI_SERDES: |
| 394 | case E1000_DEV_ID_82572EI: | 394 | case E1000_DEV_ID_82572EI: |
| 395 | hw->mac_type = e1000_82572; | 395 | hw->mac_type = e1000_82572; |
| 396 | break; | 396 | break; |
| 397 | case E1000_DEV_ID_82573E: | 397 | case E1000_DEV_ID_82573E: |
| 398 | case E1000_DEV_ID_82573E_IAMT: | 398 | case E1000_DEV_ID_82573E_IAMT: |
| 399 | case E1000_DEV_ID_82573L: | 399 | case E1000_DEV_ID_82573L: |
| 400 | hw->mac_type = e1000_82573; | 400 | hw->mac_type = e1000_82573; |
| 401 | break; | 401 | break; |
| 402 | case E1000_DEV_ID_80003ES2LAN_COPPER_SPT: | 402 | case E1000_DEV_ID_80003ES2LAN_COPPER_SPT: |
| 403 | case E1000_DEV_ID_80003ES2LAN_SERDES_SPT: | 403 | case E1000_DEV_ID_80003ES2LAN_SERDES_SPT: |
| 404 | case E1000_DEV_ID_80003ES2LAN_COPPER_DPT: | 404 | case E1000_DEV_ID_80003ES2LAN_COPPER_DPT: |
| 405 | case E1000_DEV_ID_80003ES2LAN_SERDES_DPT: | 405 | case E1000_DEV_ID_80003ES2LAN_SERDES_DPT: |
| 406 | hw->mac_type = e1000_80003es2lan; | 406 | hw->mac_type = e1000_80003es2lan; |
| 407 | break; | 407 | break; |
| 408 | case E1000_DEV_ID_ICH8_IGP_M_AMT: | 408 | case E1000_DEV_ID_ICH8_IGP_M_AMT: |
| 409 | case E1000_DEV_ID_ICH8_IGP_AMT: | 409 | case E1000_DEV_ID_ICH8_IGP_AMT: |
| 410 | case E1000_DEV_ID_ICH8_IGP_C: | 410 | case E1000_DEV_ID_ICH8_IGP_C: |
| 411 | case E1000_DEV_ID_ICH8_IFE: | 411 | case E1000_DEV_ID_ICH8_IFE: |
| 412 | case E1000_DEV_ID_ICH8_IFE_GT: | 412 | case E1000_DEV_ID_ICH8_IFE_GT: |
| 413 | case E1000_DEV_ID_ICH8_IFE_G: | 413 | case E1000_DEV_ID_ICH8_IFE_G: |
| 414 | case E1000_DEV_ID_ICH8_IGP_M: | 414 | case E1000_DEV_ID_ICH8_IGP_M: |
| 415 | hw->mac_type = e1000_ich8lan; | 415 | hw->mac_type = e1000_ich8lan; |
| 416 | break; | 416 | break; |
| 417 | default: | 417 | default: |
| 418 | /* Should never have loaded on this device */ | 418 | /* Should never have loaded on this device */ |
| 419 | return -E1000_ERR_MAC_TYPE; | 419 | return -E1000_ERR_MAC_TYPE; |
| 420 | } | 420 | } |
| 421 | 421 | ||
| 422 | switch (hw->mac_type) { | 422 | switch (hw->mac_type) { |
| 423 | case e1000_ich8lan: | 423 | case e1000_ich8lan: |
| 424 | hw->swfwhw_semaphore_present = TRUE; | 424 | hw->swfwhw_semaphore_present = TRUE; |
| 425 | hw->asf_firmware_present = TRUE; | 425 | hw->asf_firmware_present = TRUE; |
| 426 | break; | 426 | break; |
| 427 | case e1000_80003es2lan: | 427 | case e1000_80003es2lan: |
| 428 | hw->swfw_sync_present = TRUE; | 428 | hw->swfw_sync_present = TRUE; |
| 429 | /* fall through */ | 429 | /* fall through */ |
| 430 | case e1000_82571: | 430 | case e1000_82571: |
| 431 | case e1000_82572: | 431 | case e1000_82572: |
| 432 | case e1000_82573: | 432 | case e1000_82573: |
| 433 | hw->eeprom_semaphore_present = TRUE; | 433 | hw->eeprom_semaphore_present = TRUE; |
| 434 | /* fall through */ | 434 | /* fall through */ |
| 435 | case e1000_82541: | 435 | case e1000_82541: |
| 436 | case e1000_82547: | 436 | case e1000_82547: |
| 437 | case e1000_82541_rev_2: | 437 | case e1000_82541_rev_2: |
| 438 | case e1000_82547_rev_2: | 438 | case e1000_82547_rev_2: |
| 439 | hw->asf_firmware_present = TRUE; | 439 | hw->asf_firmware_present = TRUE; |
| 440 | break; | 440 | break; |
| 441 | default: | 441 | default: |
| 442 | break; | 442 | break; |
| 443 | } | 443 | } |
| 444 | 444 | ||
| 445 | return E1000_SUCCESS; | 445 | /* The 82543 chip does not count tx_carrier_errors properly in |
| 446 | * FD mode | ||
| 447 | */ | ||
| 448 | if (hw->mac_type == e1000_82543) | ||
| 449 | hw->bad_tx_carr_stats_fd = TRUE; | ||
| 450 | |||
| 451 | /* capable of receiving management packets to the host */ | ||
| 452 | if (hw->mac_type >= e1000_82571) | ||
| 453 | hw->has_manc2h = TRUE; | ||
| 454 | |||
| 455 | /* In rare occasions, ESB2 systems would end up started without | ||
| 456 | * the RX unit being turned on. | ||
| 457 | */ | ||
| 458 | if (hw->mac_type == e1000_80003es2lan) | ||
| 459 | hw->rx_needs_kicking = TRUE; | ||
| 460 | |||
| 461 | if (hw->mac_type > e1000_82544) | ||
| 462 | hw->has_smbus = TRUE; | ||
| 463 | |||
| 464 | return E1000_SUCCESS; | ||
| 446 | } | 465 | } |
| 447 | 466 | ||
| 448 | /***************************************************************************** | 467 | /***************************************************************************** |
| @@ -6575,7 +6594,7 @@ e1000_get_bus_info(struct e1000_hw *hw) | |||
| 6575 | switch (hw->mac_type) { | 6594 | switch (hw->mac_type) { |
| 6576 | case e1000_82542_rev2_0: | 6595 | case e1000_82542_rev2_0: |
| 6577 | case e1000_82542_rev2_1: | 6596 | case e1000_82542_rev2_1: |
| 6578 | hw->bus_type = e1000_bus_type_unknown; | 6597 | hw->bus_type = e1000_bus_type_pci; |
| 6579 | hw->bus_speed = e1000_bus_speed_unknown; | 6598 | hw->bus_speed = e1000_bus_speed_unknown; |
| 6580 | hw->bus_width = e1000_bus_width_unknown; | 6599 | hw->bus_width = e1000_bus_width_unknown; |
| 6581 | break; | 6600 | break; |
| @@ -7817,9 +7836,8 @@ e1000_enable_mng_pass_thru(struct e1000_hw *hw) | |||
| 7817 | fwsm = E1000_READ_REG(hw, FWSM); | 7836 | fwsm = E1000_READ_REG(hw, FWSM); |
| 7818 | factps = E1000_READ_REG(hw, FACTPS); | 7837 | factps = E1000_READ_REG(hw, FACTPS); |
| 7819 | 7838 | ||
| 7820 | if (((fwsm & E1000_FWSM_MODE_MASK) == | 7839 | if ((((fwsm & E1000_FWSM_MODE_MASK) >> E1000_FWSM_MODE_SHIFT) == |
| 7821 | (e1000_mng_mode_pt << E1000_FWSM_MODE_SHIFT)) && | 7840 | e1000_mng_mode_pt) && !(factps & E1000_FACTPS_MNGCG)) |
| 7822 | (factps & E1000_FACTPS_MNGCG)) | ||
| 7823 | return TRUE; | 7841 | return TRUE; |
| 7824 | } else | 7842 | } else |
| 7825 | if ((manc & E1000_MANC_SMBUS_EN) && !(manc & E1000_MANC_ASF_EN)) | 7843 | if ((manc & E1000_MANC_SMBUS_EN) && !(manc & E1000_MANC_ASF_EN)) |
diff --git a/drivers/net/e1000/e1000_hw.h b/drivers/net/e1000/e1000_hw.h index 3321fb13bfa9..d67105883341 100644 --- a/drivers/net/e1000/e1000_hw.h +++ b/drivers/net/e1000/e1000_hw.h | |||
| @@ -1301,165 +1301,170 @@ struct e1000_ffvt_entry { | |||
| 1301 | #define E1000_82542_RSSIR E1000_RSSIR | 1301 | #define E1000_82542_RSSIR E1000_RSSIR |
| 1302 | #define E1000_82542_KUMCTRLSTA E1000_KUMCTRLSTA | 1302 | #define E1000_82542_KUMCTRLSTA E1000_KUMCTRLSTA |
| 1303 | #define E1000_82542_SW_FW_SYNC E1000_SW_FW_SYNC | 1303 | #define E1000_82542_SW_FW_SYNC E1000_SW_FW_SYNC |
| 1304 | #define E1000_82542_MANC2H E1000_MANC2H | ||
| 1304 | 1305 | ||
| 1305 | /* Statistics counters collected by the MAC */ | 1306 | /* Statistics counters collected by the MAC */ |
| 1306 | struct e1000_hw_stats { | 1307 | struct e1000_hw_stats { |
| 1307 | uint64_t crcerrs; | 1308 | uint64_t crcerrs; |
| 1308 | uint64_t algnerrc; | 1309 | uint64_t algnerrc; |
| 1309 | uint64_t symerrs; | 1310 | uint64_t symerrs; |
| 1310 | uint64_t rxerrc; | 1311 | uint64_t rxerrc; |
| 1311 | uint64_t txerrc; | 1312 | uint64_t txerrc; |
| 1312 | uint64_t mpc; | 1313 | uint64_t mpc; |
| 1313 | uint64_t scc; | 1314 | uint64_t scc; |
| 1314 | uint64_t ecol; | 1315 | uint64_t ecol; |
| 1315 | uint64_t mcc; | 1316 | uint64_t mcc; |
| 1316 | uint64_t latecol; | 1317 | uint64_t latecol; |
| 1317 | uint64_t colc; | 1318 | uint64_t colc; |
| 1318 | uint64_t dc; | 1319 | uint64_t dc; |
| 1319 | uint64_t tncrs; | 1320 | uint64_t tncrs; |
| 1320 | uint64_t sec; | 1321 | uint64_t sec; |
| 1321 | uint64_t cexterr; | 1322 | uint64_t cexterr; |
| 1322 | uint64_t rlec; | 1323 | uint64_t rlec; |
| 1323 | uint64_t xonrxc; | 1324 | uint64_t xonrxc; |
| 1324 | uint64_t xontxc; | 1325 | uint64_t xontxc; |
| 1325 | uint64_t xoffrxc; | 1326 | uint64_t xoffrxc; |
| 1326 | uint64_t xofftxc; | 1327 | uint64_t xofftxc; |
| 1327 | uint64_t fcruc; | 1328 | uint64_t fcruc; |
| 1328 | uint64_t prc64; | 1329 | uint64_t prc64; |
| 1329 | uint64_t prc127; | 1330 | uint64_t prc127; |
| 1330 | uint64_t prc255; | 1331 | uint64_t prc255; |
| 1331 | uint64_t prc511; | 1332 | uint64_t prc511; |
| 1332 | uint64_t prc1023; | 1333 | uint64_t prc1023; |
| 1333 | uint64_t prc1522; | 1334 | uint64_t prc1522; |
| 1334 | uint64_t gprc; | 1335 | uint64_t gprc; |
| 1335 | uint64_t bprc; | 1336 | uint64_t bprc; |
| 1336 | uint64_t mprc; | 1337 | uint64_t mprc; |
| 1337 | uint64_t gptc; | 1338 | uint64_t gptc; |
| 1338 | uint64_t gorcl; | 1339 | uint64_t gorcl; |
| 1339 | uint64_t gorch; | 1340 | uint64_t gorch; |
| 1340 | uint64_t gotcl; | 1341 | uint64_t gotcl; |
| 1341 | uint64_t gotch; | 1342 | uint64_t gotch; |
| 1342 | uint64_t rnbc; | 1343 | uint64_t rnbc; |
| 1343 | uint64_t ruc; | 1344 | uint64_t ruc; |
| 1344 | uint64_t rfc; | 1345 | uint64_t rfc; |
| 1345 | uint64_t roc; | 1346 | uint64_t roc; |
| 1346 | uint64_t rlerrc; | 1347 | uint64_t rlerrc; |
| 1347 | uint64_t rjc; | 1348 | uint64_t rjc; |
| 1348 | uint64_t mgprc; | 1349 | uint64_t mgprc; |
| 1349 | uint64_t mgpdc; | 1350 | uint64_t mgpdc; |
| 1350 | uint64_t mgptc; | 1351 | uint64_t mgptc; |
| 1351 | uint64_t torl; | 1352 | uint64_t torl; |
| 1352 | uint64_t torh; | 1353 | uint64_t torh; |
| 1353 | uint64_t totl; | 1354 | uint64_t totl; |
| 1354 | uint64_t toth; | 1355 | uint64_t toth; |
| 1355 | uint64_t tpr; | 1356 | uint64_t tpr; |
| 1356 | uint64_t tpt; | 1357 | uint64_t tpt; |
| 1357 | uint64_t ptc64; | 1358 | uint64_t ptc64; |
| 1358 | uint64_t ptc127; | 1359 | uint64_t ptc127; |
| 1359 | uint64_t ptc255; | 1360 | uint64_t ptc255; |
| 1360 | uint64_t ptc511; | 1361 | uint64_t ptc511; |
| 1361 | uint64_t ptc1023; | 1362 | uint64_t ptc1023; |
| 1362 | uint64_t ptc1522; | 1363 | uint64_t ptc1522; |
| 1363 | uint64_t mptc; | 1364 | uint64_t mptc; |
| 1364 | uint64_t bptc; | 1365 | uint64_t bptc; |
| 1365 | uint64_t tsctc; | 1366 | uint64_t tsctc; |
| 1366 | uint64_t tsctfc; | 1367 | uint64_t tsctfc; |
| 1367 | uint64_t iac; | 1368 | uint64_t iac; |
| 1368 | uint64_t icrxptc; | 1369 | uint64_t icrxptc; |
| 1369 | uint64_t icrxatc; | 1370 | uint64_t icrxatc; |
| 1370 | uint64_t ictxptc; | 1371 | uint64_t ictxptc; |
| 1371 | uint64_t ictxatc; | 1372 | uint64_t ictxatc; |
| 1372 | uint64_t ictxqec; | 1373 | uint64_t ictxqec; |
| 1373 | uint64_t ictxqmtc; | 1374 | uint64_t ictxqmtc; |
| 1374 | uint64_t icrxdmtc; | 1375 | uint64_t icrxdmtc; |
| 1375 | uint64_t icrxoc; | 1376 | uint64_t icrxoc; |
| 1376 | }; | 1377 | }; |
| 1377 | 1378 | ||
| 1378 | /* Structure containing variables used by the shared code (e1000_hw.c) */ | 1379 | /* Structure containing variables used by the shared code (e1000_hw.c) */ |
| 1379 | struct e1000_hw { | 1380 | struct e1000_hw { |
| 1380 | uint8_t __iomem *hw_addr; | 1381 | uint8_t __iomem *hw_addr; |
| 1381 | uint8_t __iomem *flash_address; | 1382 | uint8_t __iomem *flash_address; |
| 1382 | e1000_mac_type mac_type; | 1383 | e1000_mac_type mac_type; |
| 1383 | e1000_phy_type phy_type; | 1384 | e1000_phy_type phy_type; |
| 1384 | uint32_t phy_init_script; | 1385 | uint32_t phy_init_script; |
| 1385 | e1000_media_type media_type; | 1386 | e1000_media_type media_type; |
| 1386 | void *back; | 1387 | void *back; |
| 1387 | struct e1000_shadow_ram *eeprom_shadow_ram; | 1388 | struct e1000_shadow_ram *eeprom_shadow_ram; |
| 1388 | uint32_t flash_bank_size; | 1389 | uint32_t flash_bank_size; |
| 1389 | uint32_t flash_base_addr; | 1390 | uint32_t flash_base_addr; |
| 1390 | e1000_fc_type fc; | 1391 | e1000_fc_type fc; |
| 1391 | e1000_bus_speed bus_speed; | 1392 | e1000_bus_speed bus_speed; |
| 1392 | e1000_bus_width bus_width; | 1393 | e1000_bus_width bus_width; |
| 1393 | e1000_bus_type bus_type; | 1394 | e1000_bus_type bus_type; |
| 1394 | struct e1000_eeprom_info eeprom; | 1395 | struct e1000_eeprom_info eeprom; |
| 1395 | e1000_ms_type master_slave; | 1396 | e1000_ms_type master_slave; |
| 1396 | e1000_ms_type original_master_slave; | 1397 | e1000_ms_type original_master_slave; |
| 1397 | e1000_ffe_config ffe_config_state; | 1398 | e1000_ffe_config ffe_config_state; |
| 1398 | uint32_t asf_firmware_present; | 1399 | uint32_t asf_firmware_present; |
| 1399 | uint32_t eeprom_semaphore_present; | 1400 | uint32_t eeprom_semaphore_present; |
| 1400 | uint32_t swfw_sync_present; | 1401 | uint32_t swfw_sync_present; |
| 1401 | uint32_t swfwhw_semaphore_present; | 1402 | uint32_t swfwhw_semaphore_present; |
| 1402 | unsigned long io_base; | 1403 | unsigned long io_base; |
| 1403 | uint32_t phy_id; | 1404 | uint32_t phy_id; |
| 1404 | uint32_t phy_revision; | 1405 | uint32_t phy_revision; |
| 1405 | uint32_t phy_addr; | 1406 | uint32_t phy_addr; |
| 1406 | uint32_t original_fc; | 1407 | uint32_t original_fc; |
| 1407 | uint32_t txcw; | 1408 | uint32_t txcw; |
| 1408 | uint32_t autoneg_failed; | 1409 | uint32_t autoneg_failed; |
| 1409 | uint32_t max_frame_size; | 1410 | uint32_t max_frame_size; |
| 1410 | uint32_t min_frame_size; | 1411 | uint32_t min_frame_size; |
| 1411 | uint32_t mc_filter_type; | 1412 | uint32_t mc_filter_type; |
| 1412 | uint32_t num_mc_addrs; | 1413 | uint32_t num_mc_addrs; |
| 1413 | uint32_t collision_delta; | 1414 | uint32_t collision_delta; |
| 1414 | uint32_t tx_packet_delta; | 1415 | uint32_t tx_packet_delta; |
| 1415 | uint32_t ledctl_default; | 1416 | uint32_t ledctl_default; |
| 1416 | uint32_t ledctl_mode1; | 1417 | uint32_t ledctl_mode1; |
| 1417 | uint32_t ledctl_mode2; | 1418 | uint32_t ledctl_mode2; |
| 1418 | boolean_t tx_pkt_filtering; | 1419 | boolean_t tx_pkt_filtering; |
| 1419 | struct e1000_host_mng_dhcp_cookie mng_cookie; | 1420 | struct e1000_host_mng_dhcp_cookie mng_cookie; |
| 1420 | uint16_t phy_spd_default; | 1421 | uint16_t phy_spd_default; |
| 1421 | uint16_t autoneg_advertised; | 1422 | uint16_t autoneg_advertised; |
| 1422 | uint16_t pci_cmd_word; | 1423 | uint16_t pci_cmd_word; |
| 1423 | uint16_t fc_high_water; | 1424 | uint16_t fc_high_water; |
| 1424 | uint16_t fc_low_water; | 1425 | uint16_t fc_low_water; |
| 1425 | uint16_t fc_pause_time; | 1426 | uint16_t fc_pause_time; |
| 1426 | uint16_t current_ifs_val; | 1427 | uint16_t current_ifs_val; |
| 1427 | uint16_t ifs_min_val; | 1428 | uint16_t ifs_min_val; |
| 1428 | uint16_t ifs_max_val; | 1429 | uint16_t ifs_max_val; |
| 1429 | uint16_t ifs_step_size; | 1430 | uint16_t ifs_step_size; |
| 1430 | uint16_t ifs_ratio; | 1431 | uint16_t ifs_ratio; |
| 1431 | uint16_t device_id; | 1432 | uint16_t device_id; |
| 1432 | uint16_t vendor_id; | 1433 | uint16_t vendor_id; |
| 1433 | uint16_t subsystem_id; | 1434 | uint16_t subsystem_id; |
| 1434 | uint16_t subsystem_vendor_id; | 1435 | uint16_t subsystem_vendor_id; |
| 1435 | uint8_t revision_id; | 1436 | uint8_t revision_id; |
| 1436 | uint8_t autoneg; | 1437 | uint8_t autoneg; |
| 1437 | uint8_t mdix; | 1438 | uint8_t mdix; |
| 1438 | uint8_t forced_speed_duplex; | 1439 | uint8_t forced_speed_duplex; |
| 1439 | uint8_t wait_autoneg_complete; | 1440 | uint8_t wait_autoneg_complete; |
| 1440 | uint8_t dma_fairness; | 1441 | uint8_t dma_fairness; |
| 1441 | uint8_t mac_addr[NODE_ADDRESS_SIZE]; | 1442 | uint8_t mac_addr[NODE_ADDRESS_SIZE]; |
| 1442 | uint8_t perm_mac_addr[NODE_ADDRESS_SIZE]; | 1443 | uint8_t perm_mac_addr[NODE_ADDRESS_SIZE]; |
| 1443 | boolean_t disable_polarity_correction; | 1444 | boolean_t disable_polarity_correction; |
| 1444 | boolean_t speed_downgraded; | 1445 | boolean_t speed_downgraded; |
| 1445 | e1000_smart_speed smart_speed; | 1446 | e1000_smart_speed smart_speed; |
| 1446 | e1000_dsp_config dsp_config_state; | 1447 | e1000_dsp_config dsp_config_state; |
| 1447 | boolean_t get_link_status; | 1448 | boolean_t get_link_status; |
| 1448 | boolean_t serdes_link_down; | 1449 | boolean_t serdes_link_down; |
| 1449 | boolean_t tbi_compatibility_en; | 1450 | boolean_t tbi_compatibility_en; |
| 1450 | boolean_t tbi_compatibility_on; | 1451 | boolean_t tbi_compatibility_on; |
| 1451 | boolean_t laa_is_present; | 1452 | boolean_t laa_is_present; |
| 1452 | boolean_t phy_reset_disable; | 1453 | boolean_t phy_reset_disable; |
| 1453 | boolean_t initialize_hw_bits_disable; | 1454 | boolean_t initialize_hw_bits_disable; |
| 1454 | boolean_t fc_send_xon; | 1455 | boolean_t fc_send_xon; |
| 1455 | boolean_t fc_strict_ieee; | 1456 | boolean_t fc_strict_ieee; |
| 1456 | boolean_t report_tx_early; | 1457 | boolean_t report_tx_early; |
| 1457 | boolean_t adaptive_ifs; | 1458 | boolean_t adaptive_ifs; |
| 1458 | boolean_t ifs_params_forced; | 1459 | boolean_t ifs_params_forced; |
| 1459 | boolean_t in_ifs_mode; | 1460 | boolean_t in_ifs_mode; |
| 1460 | boolean_t mng_reg_access_disabled; | 1461 | boolean_t mng_reg_access_disabled; |
| 1461 | boolean_t leave_av_bit_off; | 1462 | boolean_t leave_av_bit_off; |
| 1462 | boolean_t kmrn_lock_loss_workaround_disabled; | 1463 | boolean_t kmrn_lock_loss_workaround_disabled; |
| 1464 | boolean_t bad_tx_carr_stats_fd; | ||
| 1465 | boolean_t has_manc2h; | ||
| 1466 | boolean_t rx_needs_kicking; | ||
| 1467 | boolean_t has_smbus; | ||
| 1463 | }; | 1468 | }; |
| 1464 | 1469 | ||
| 1465 | 1470 | ||
| @@ -2418,6 +2423,7 @@ struct e1000_host_command_info { | |||
| 2418 | #define E1000_PBA_8K 0x0008 /* 8KB, default Rx allocation */ | 2423 | #define E1000_PBA_8K 0x0008 /* 8KB, default Rx allocation */ |
| 2419 | #define E1000_PBA_12K 0x000C /* 12KB, default Rx allocation */ | 2424 | #define E1000_PBA_12K 0x000C /* 12KB, default Rx allocation */ |
| 2420 | #define E1000_PBA_16K 0x0010 /* 16KB, default TX allocation */ | 2425 | #define E1000_PBA_16K 0x0010 /* 16KB, default TX allocation */ |
| 2426 | #define E1000_PBA_20K 0x0014 | ||
| 2421 | #define E1000_PBA_22K 0x0016 | 2427 | #define E1000_PBA_22K 0x0016 |
| 2422 | #define E1000_PBA_24K 0x0018 | 2428 | #define E1000_PBA_24K 0x0018 |
| 2423 | #define E1000_PBA_30K 0x001E | 2429 | #define E1000_PBA_30K 0x001E |
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index 73f3a85fd238..4c1ff752048c 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c | |||
| @@ -213,6 +213,12 @@ static void e1000_netpoll (struct net_device *netdev); | |||
| 213 | 213 | ||
| 214 | extern void e1000_check_options(struct e1000_adapter *adapter); | 214 | extern void e1000_check_options(struct e1000_adapter *adapter); |
| 215 | 215 | ||
| 216 | #define COPYBREAK_DEFAULT 256 | ||
| 217 | static unsigned int copybreak __read_mostly = COPYBREAK_DEFAULT; | ||
| 218 | module_param(copybreak, uint, 0644); | ||
| 219 | MODULE_PARM_DESC(copybreak, | ||
| 220 | "Maximum size of packet that is copied to a new buffer on receive"); | ||
| 221 | |||
| 216 | static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev, | 222 | static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev, |
| 217 | pci_channel_state_t state); | 223 | pci_channel_state_t state); |
| 218 | static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev); | 224 | static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev); |
| @@ -264,7 +270,13 @@ e1000_init_module(void) | |||
| 264 | printk(KERN_INFO "%s\n", e1000_copyright); | 270 | printk(KERN_INFO "%s\n", e1000_copyright); |
| 265 | 271 | ||
| 266 | ret = pci_register_driver(&e1000_driver); | 272 | ret = pci_register_driver(&e1000_driver); |
| 267 | 273 | if (copybreak != COPYBREAK_DEFAULT) { | |
| 274 | if (copybreak == 0) | ||
| 275 | printk(KERN_INFO "e1000: copybreak disabled\n"); | ||
| 276 | else | ||
| 277 | printk(KERN_INFO "e1000: copybreak enabled for " | ||
| 278 | "packets <= %u bytes\n", copybreak); | ||
| 279 | } | ||
| 268 | return ret; | 280 | return ret; |
| 269 | } | 281 | } |
| 270 | 282 | ||
| @@ -464,6 +476,52 @@ e1000_get_hw_control(struct e1000_adapter *adapter) | |||
| 464 | } | 476 | } |
| 465 | } | 477 | } |
| 466 | 478 | ||
| 479 | static void | ||
| 480 | e1000_init_manageability(struct e1000_adapter *adapter) | ||
| 481 | { | ||
| 482 | if (adapter->en_mng_pt) { | ||
| 483 | uint32_t manc = E1000_READ_REG(&adapter->hw, MANC); | ||
| 484 | |||
| 485 | /* disable hardware interception of ARP */ | ||
| 486 | manc &= ~(E1000_MANC_ARP_EN); | ||
| 487 | |||
| 488 | /* enable receiving management packets to the host */ | ||
| 489 | /* this will probably generate destination unreachable messages | ||
| 490 | * from the host OS, but the packets will be handled on SMBUS */ | ||
| 491 | if (adapter->hw.has_manc2h) { | ||
| 492 | uint32_t manc2h = E1000_READ_REG(&adapter->hw, MANC2H); | ||
| 493 | |||
| 494 | manc |= E1000_MANC_EN_MNG2HOST; | ||
| 495 | #define E1000_MNG2HOST_PORT_623 (1 << 5) | ||
| 496 | #define E1000_MNG2HOST_PORT_664 (1 << 6) | ||
| 497 | manc2h |= E1000_MNG2HOST_PORT_623; | ||
| 498 | manc2h |= E1000_MNG2HOST_PORT_664; | ||
| 499 | E1000_WRITE_REG(&adapter->hw, MANC2H, manc2h); | ||
| 500 | } | ||
| 501 | |||
| 502 | E1000_WRITE_REG(&adapter->hw, MANC, manc); | ||
| 503 | } | ||
| 504 | } | ||
| 505 | |||
| 506 | static void | ||
| 507 | e1000_release_manageability(struct e1000_adapter *adapter) | ||
| 508 | { | ||
| 509 | if (adapter->en_mng_pt) { | ||
| 510 | uint32_t manc = E1000_READ_REG(&adapter->hw, MANC); | ||
| 511 | |||
| 512 | /* re-enable hardware interception of ARP */ | ||
| 513 | manc |= E1000_MANC_ARP_EN; | ||
| 514 | |||
| 515 | if (adapter->hw.has_manc2h) | ||
| 516 | manc &= ~E1000_MANC_EN_MNG2HOST; | ||
| 517 | |||
| 518 | /* don't explicitly have to mess with MANC2H since | ||
| 519 | * MANC has an enable disable that gates MANC2H */ | ||
| 520 | |||
| 521 | E1000_WRITE_REG(&adapter->hw, MANC, manc); | ||
| 522 | } | ||
| 523 | } | ||
| 524 | |||
| 467 | int | 525 | int |
| 468 | e1000_up(struct e1000_adapter *adapter) | 526 | e1000_up(struct e1000_adapter *adapter) |
| 469 | { | 527 | { |
| @@ -475,6 +533,7 @@ e1000_up(struct e1000_adapter *adapter) | |||
| 475 | e1000_set_multi(netdev); | 533 | e1000_set_multi(netdev); |
| 476 | 534 | ||
| 477 | e1000_restore_vlan(adapter); | 535 | e1000_restore_vlan(adapter); |
| 536 | e1000_init_manageability(adapter); | ||
| 478 | 537 | ||
| 479 | e1000_configure_tx(adapter); | 538 | e1000_configure_tx(adapter); |
| 480 | e1000_setup_rctl(adapter); | 539 | e1000_setup_rctl(adapter); |
| @@ -497,7 +556,8 @@ e1000_up(struct e1000_adapter *adapter) | |||
| 497 | 556 | ||
| 498 | clear_bit(__E1000_DOWN, &adapter->flags); | 557 | clear_bit(__E1000_DOWN, &adapter->flags); |
| 499 | 558 | ||
| 500 | mod_timer(&adapter->watchdog_timer, jiffies + 2 * HZ); | 559 | /* fire a link change interrupt to start the watchdog */ |
| 560 | E1000_WRITE_REG(&adapter->hw, ICS, E1000_ICS_LSC); | ||
| 501 | return 0; | 561 | return 0; |
| 502 | } | 562 | } |
| 503 | 563 | ||
| @@ -614,16 +674,34 @@ e1000_reinit_locked(struct e1000_adapter *adapter) | |||
| 614 | void | 674 | void |
| 615 | e1000_reset(struct e1000_adapter *adapter) | 675 | e1000_reset(struct e1000_adapter *adapter) |
| 616 | { | 676 | { |
| 617 | uint32_t pba, manc; | 677 | uint32_t pba = 0, tx_space, min_tx_space, min_rx_space; |
| 618 | uint16_t fc_high_water_mark = E1000_FC_HIGH_DIFF; | 678 | uint16_t fc_high_water_mark = E1000_FC_HIGH_DIFF; |
| 679 | boolean_t legacy_pba_adjust = FALSE; | ||
| 619 | 680 | ||
| 620 | /* Repartition Pba for greater than 9k mtu | 681 | /* Repartition Pba for greater than 9k mtu |
| 621 | * To take effect CTRL.RST is required. | 682 | * To take effect CTRL.RST is required. |
| 622 | */ | 683 | */ |
| 623 | 684 | ||
| 624 | switch (adapter->hw.mac_type) { | 685 | switch (adapter->hw.mac_type) { |
| 686 | case e1000_82542_rev2_0: | ||
| 687 | case e1000_82542_rev2_1: | ||
| 688 | case e1000_82543: | ||
| 689 | case e1000_82544: | ||
| 690 | case e1000_82540: | ||
| 691 | case e1000_82541: | ||
| 692 | case e1000_82541_rev_2: | ||
| 693 | legacy_pba_adjust = TRUE; | ||
| 694 | pba = E1000_PBA_48K; | ||
| 695 | break; | ||
| 696 | case e1000_82545: | ||
| 697 | case e1000_82545_rev_3: | ||
| 698 | case e1000_82546: | ||
| 699 | case e1000_82546_rev_3: | ||
| 700 | pba = E1000_PBA_48K; | ||
| 701 | break; | ||
| 625 | case e1000_82547: | 702 | case e1000_82547: |
| 626 | case e1000_82547_rev_2: | 703 | case e1000_82547_rev_2: |
| 704 | legacy_pba_adjust = TRUE; | ||
| 627 | pba = E1000_PBA_30K; | 705 | pba = E1000_PBA_30K; |
| 628 | break; | 706 | break; |
| 629 | case e1000_82571: | 707 | case e1000_82571: |
| @@ -632,27 +710,80 @@ e1000_reset(struct e1000_adapter *adapter) | |||
| 632 | pba = E1000_PBA_38K; | 710 | pba = E1000_PBA_38K; |
| 633 | break; | 711 | break; |
| 634 | case e1000_82573: | 712 | case e1000_82573: |
| 635 | pba = E1000_PBA_12K; | 713 | pba = E1000_PBA_20K; |
| 636 | break; | 714 | break; |
| 637 | case e1000_ich8lan: | 715 | case e1000_ich8lan: |
| 638 | pba = E1000_PBA_8K; | 716 | pba = E1000_PBA_8K; |
| 639 | break; | 717 | case e1000_undefined: |
| 640 | default: | 718 | case e1000_num_macs: |
| 641 | pba = E1000_PBA_48K; | ||
| 642 | break; | 719 | break; |
| 643 | } | 720 | } |
| 644 | 721 | ||
| 645 | if ((adapter->hw.mac_type != e1000_82573) && | 722 | if (legacy_pba_adjust == TRUE) { |
| 646 | (adapter->netdev->mtu > E1000_RXBUFFER_8192)) | 723 | if (adapter->netdev->mtu > E1000_RXBUFFER_8192) |
| 647 | pba -= 8; /* allocate more FIFO for Tx */ | 724 | pba -= 8; /* allocate more FIFO for Tx */ |
| 648 | 725 | ||
| 726 | if (adapter->hw.mac_type == e1000_82547) { | ||
| 727 | adapter->tx_fifo_head = 0; | ||
| 728 | adapter->tx_head_addr = pba << E1000_TX_HEAD_ADDR_SHIFT; | ||
| 729 | adapter->tx_fifo_size = | ||
| 730 | (E1000_PBA_40K - pba) << E1000_PBA_BYTES_SHIFT; | ||
| 731 | atomic_set(&adapter->tx_fifo_stall, 0); | ||
| 732 | } | ||
| 733 | } else if (adapter->hw.max_frame_size > MAXIMUM_ETHERNET_FRAME_SIZE) { | ||
| 734 | /* adjust PBA for jumbo frames */ | ||
| 735 | E1000_WRITE_REG(&adapter->hw, PBA, pba); | ||
| 736 | |||
| 737 | /* To maintain wire speed transmits, the Tx FIFO should be | ||
| 738 | * large enough to accomodate two full transmit packets, | ||
| 739 | * rounded up to the next 1KB and expressed in KB. Likewise, | ||
| 740 | * the Rx FIFO should be large enough to accomodate at least | ||
| 741 | * one full receive packet and is similarly rounded up and | ||
| 742 | * expressed in KB. */ | ||
| 743 | pba = E1000_READ_REG(&adapter->hw, PBA); | ||
| 744 | /* upper 16 bits has Tx packet buffer allocation size in KB */ | ||
| 745 | tx_space = pba >> 16; | ||
| 746 | /* lower 16 bits has Rx packet buffer allocation size in KB */ | ||
| 747 | pba &= 0xffff; | ||
| 748 | /* don't include ethernet FCS because hardware appends/strips */ | ||
| 749 | min_rx_space = adapter->netdev->mtu + ENET_HEADER_SIZE + | ||
| 750 | VLAN_TAG_SIZE; | ||
| 751 | min_tx_space = min_rx_space; | ||
| 752 | min_tx_space *= 2; | ||
| 753 | E1000_ROUNDUP(min_tx_space, 1024); | ||
| 754 | min_tx_space >>= 10; | ||
| 755 | E1000_ROUNDUP(min_rx_space, 1024); | ||
| 756 | min_rx_space >>= 10; | ||
| 757 | |||
| 758 | /* If current Tx allocation is less than the min Tx FIFO size, | ||
| 759 | * and the min Tx FIFO size is less than the current Rx FIFO | ||
| 760 | * allocation, take space away from current Rx allocation */ | ||
| 761 | if (tx_space < min_tx_space && | ||
| 762 | ((min_tx_space - tx_space) < pba)) { | ||
| 763 | pba = pba - (min_tx_space - tx_space); | ||
| 764 | |||
| 765 | /* PCI/PCIx hardware has PBA alignment constraints */ | ||
| 766 | switch (adapter->hw.mac_type) { | ||
| 767 | case e1000_82545 ... e1000_82546_rev_3: | ||
| 768 | pba &= ~(E1000_PBA_8K - 1); | ||
| 769 | break; | ||
| 770 | default: | ||
| 771 | break; | ||
| 772 | } | ||
| 649 | 773 | ||
| 650 | if (adapter->hw.mac_type == e1000_82547) { | 774 | /* if short on rx space, rx wins and must trump tx |
| 651 | adapter->tx_fifo_head = 0; | 775 | * adjustment or use Early Receive if available */ |
| 652 | adapter->tx_head_addr = pba << E1000_TX_HEAD_ADDR_SHIFT; | 776 | if (pba < min_rx_space) { |
| 653 | adapter->tx_fifo_size = | 777 | switch (adapter->hw.mac_type) { |
| 654 | (E1000_PBA_40K - pba) << E1000_PBA_BYTES_SHIFT; | 778 | case e1000_82573: |
| 655 | atomic_set(&adapter->tx_fifo_stall, 0); | 779 | /* ERT enabled in e1000_configure_rx */ |
| 780 | break; | ||
| 781 | default: | ||
| 782 | pba = min_rx_space; | ||
| 783 | break; | ||
| 784 | } | ||
| 785 | } | ||
| 786 | } | ||
| 656 | } | 787 | } |
| 657 | 788 | ||
| 658 | E1000_WRITE_REG(&adapter->hw, PBA, pba); | 789 | E1000_WRITE_REG(&adapter->hw, PBA, pba); |
| @@ -685,6 +816,20 @@ e1000_reset(struct e1000_adapter *adapter) | |||
| 685 | if (e1000_init_hw(&adapter->hw)) | 816 | if (e1000_init_hw(&adapter->hw)) |
| 686 | DPRINTK(PROBE, ERR, "Hardware Error\n"); | 817 | DPRINTK(PROBE, ERR, "Hardware Error\n"); |
| 687 | e1000_update_mng_vlan(adapter); | 818 | e1000_update_mng_vlan(adapter); |
| 819 | |||
| 820 | /* if (adapter->hwflags & HWFLAGS_PHY_PWR_BIT) { */ | ||
| 821 | if (adapter->hw.mac_type >= e1000_82544 && | ||
| 822 | adapter->hw.mac_type <= e1000_82547_rev_2 && | ||
| 823 | adapter->hw.autoneg == 1 && | ||
| 824 | adapter->hw.autoneg_advertised == ADVERTISE_1000_FULL) { | ||
| 825 | uint32_t ctrl = E1000_READ_REG(&adapter->hw, CTRL); | ||
| 826 | /* clear phy power management bit if we are in gig only mode, | ||
| 827 | * which if enabled will attempt negotiation to 100Mb, which | ||
| 828 | * can cause a loss of link at power off or driver unload */ | ||
| 829 | ctrl &= ~E1000_CTRL_SWDPIN3; | ||
| 830 | E1000_WRITE_REG(&adapter->hw, CTRL, ctrl); | ||
| 831 | } | ||
| 832 | |||
| 688 | /* Enable h/w to recognize an 802.1Q VLAN Ethernet packet */ | 833 | /* Enable h/w to recognize an 802.1Q VLAN Ethernet packet */ |
| 689 | E1000_WRITE_REG(&adapter->hw, VET, ETHERNET_IEEE_VLAN_TYPE); | 834 | E1000_WRITE_REG(&adapter->hw, VET, ETHERNET_IEEE_VLAN_TYPE); |
| 690 | 835 | ||
| @@ -705,14 +850,7 @@ e1000_reset(struct e1000_adapter *adapter) | |||
| 705 | phy_data); | 850 | phy_data); |
| 706 | } | 851 | } |
| 707 | 852 | ||
| 708 | if ((adapter->en_mng_pt) && | 853 | e1000_release_manageability(adapter); |
| 709 | (adapter->hw.mac_type >= e1000_82540) && | ||
| 710 | (adapter->hw.mac_type < e1000_82571) && | ||
| 711 | (adapter->hw.media_type == e1000_media_type_copper)) { | ||
| 712 | manc = E1000_READ_REG(&adapter->hw, MANC); | ||
| 713 | manc |= (E1000_MANC_ARP_EN | E1000_MANC_EN_MNG2HOST); | ||
| 714 | E1000_WRITE_REG(&adapter->hw, MANC, manc); | ||
| 715 | } | ||
| 716 | } | 854 | } |
| 717 | 855 | ||
| 718 | /** | 856 | /** |
| @@ -857,6 +995,12 @@ e1000_probe(struct pci_dev *pdev, | |||
| 857 | (adapter->hw.mac_type != e1000_82547)) | 995 | (adapter->hw.mac_type != e1000_82547)) |
| 858 | netdev->features |= NETIF_F_TSO; | 996 | netdev->features |= NETIF_F_TSO; |
| 859 | 997 | ||
| 998 | #ifdef CONFIG_DEBUG_SLAB | ||
| 999 | /* 82544's work arounds do not play nicely with DEBUG SLAB */ | ||
| 1000 | if (adapter->hw.mac_type == e1000_82544) | ||
| 1001 | netdev->features &= ~NETIF_F_TSO; | ||
| 1002 | #endif | ||
| 1003 | |||
| 860 | #ifdef NETIF_F_TSO6 | 1004 | #ifdef NETIF_F_TSO6 |
| 861 | if (adapter->hw.mac_type > e1000_82547_rev_2) | 1005 | if (adapter->hw.mac_type > e1000_82547_rev_2) |
| 862 | netdev->features |= NETIF_F_TSO6; | 1006 | netdev->features |= NETIF_F_TSO6; |
| @@ -1078,22 +1222,13 @@ e1000_remove(struct pci_dev *pdev) | |||
| 1078 | { | 1222 | { |
| 1079 | struct net_device *netdev = pci_get_drvdata(pdev); | 1223 | struct net_device *netdev = pci_get_drvdata(pdev); |
| 1080 | struct e1000_adapter *adapter = netdev_priv(netdev); | 1224 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 1081 | uint32_t manc; | ||
| 1082 | #ifdef CONFIG_E1000_NAPI | 1225 | #ifdef CONFIG_E1000_NAPI |
| 1083 | int i; | 1226 | int i; |
| 1084 | #endif | 1227 | #endif |
| 1085 | 1228 | ||
| 1086 | flush_scheduled_work(); | 1229 | flush_scheduled_work(); |
| 1087 | 1230 | ||
| 1088 | if (adapter->hw.mac_type >= e1000_82540 && | 1231 | e1000_release_manageability(adapter); |
| 1089 | adapter->hw.mac_type < e1000_82571 && | ||
| 1090 | adapter->hw.media_type == e1000_media_type_copper) { | ||
| 1091 | manc = E1000_READ_REG(&adapter->hw, MANC); | ||
| 1092 | if (manc & E1000_MANC_SMBUS_EN) { | ||
| 1093 | manc |= E1000_MANC_ARP_EN; | ||
| 1094 | E1000_WRITE_REG(&adapter->hw, MANC, manc); | ||
| 1095 | } | ||
| 1096 | } | ||
| 1097 | 1232 | ||
| 1098 | /* Release control of h/w to f/w. If f/w is AMT enabled, this | 1233 | /* Release control of h/w to f/w. If f/w is AMT enabled, this |
| 1099 | * would have already happened in close and is redundant. */ | 1234 | * would have already happened in close and is redundant. */ |
| @@ -1531,9 +1666,9 @@ e1000_configure_tx(struct e1000_adapter *adapter) | |||
| 1531 | } | 1666 | } |
| 1532 | 1667 | ||
| 1533 | /* Set the default values for the Tx Inter Packet Gap timer */ | 1668 | /* Set the default values for the Tx Inter Packet Gap timer */ |
| 1534 | 1669 | if (adapter->hw.mac_type <= e1000_82547_rev_2 && | |
| 1535 | if (hw->media_type == e1000_media_type_fiber || | 1670 | (hw->media_type == e1000_media_type_fiber || |
| 1536 | hw->media_type == e1000_media_type_internal_serdes) | 1671 | hw->media_type == e1000_media_type_internal_serdes)) |
| 1537 | tipg = DEFAULT_82543_TIPG_IPGT_FIBER; | 1672 | tipg = DEFAULT_82543_TIPG_IPGT_FIBER; |
| 1538 | else | 1673 | else |
| 1539 | tipg = DEFAULT_82543_TIPG_IPGT_COPPER; | 1674 | tipg = DEFAULT_82543_TIPG_IPGT_COPPER; |
| @@ -2528,6 +2663,13 @@ e1000_watchdog(unsigned long data) | |||
| 2528 | netif_wake_queue(netdev); | 2663 | netif_wake_queue(netdev); |
| 2529 | mod_timer(&adapter->phy_info_timer, jiffies + 2 * HZ); | 2664 | mod_timer(&adapter->phy_info_timer, jiffies + 2 * HZ); |
| 2530 | adapter->smartspeed = 0; | 2665 | adapter->smartspeed = 0; |
| 2666 | } else { | ||
| 2667 | /* make sure the receive unit is started */ | ||
| 2668 | if (adapter->hw.rx_needs_kicking) { | ||
| 2669 | struct e1000_hw *hw = &adapter->hw; | ||
| 2670 | uint32_t rctl = E1000_READ_REG(hw, RCTL); | ||
| 2671 | E1000_WRITE_REG(hw, RCTL, rctl | E1000_RCTL_EN); | ||
| 2672 | } | ||
| 2531 | } | 2673 | } |
| 2532 | } else { | 2674 | } else { |
| 2533 | if (netif_carrier_ok(netdev)) { | 2675 | if (netif_carrier_ok(netdev)) { |
| @@ -2628,29 +2770,34 @@ static unsigned int e1000_update_itr(struct e1000_adapter *adapter, | |||
| 2628 | if (packets == 0) | 2770 | if (packets == 0) |
| 2629 | goto update_itr_done; | 2771 | goto update_itr_done; |
| 2630 | 2772 | ||
| 2631 | |||
| 2632 | switch (itr_setting) { | 2773 | switch (itr_setting) { |
| 2633 | case lowest_latency: | 2774 | case lowest_latency: |
| 2634 | if ((packets < 5) && (bytes > 512)) | 2775 | /* jumbo frames get bulk treatment*/ |
| 2776 | if (bytes/packets > 8000) | ||
| 2777 | retval = bulk_latency; | ||
| 2778 | else if ((packets < 5) && (bytes > 512)) | ||
| 2635 | retval = low_latency; | 2779 | retval = low_latency; |
| 2636 | break; | 2780 | break; |
| 2637 | case low_latency: /* 50 usec aka 20000 ints/s */ | 2781 | case low_latency: /* 50 usec aka 20000 ints/s */ |
| 2638 | if (bytes > 10000) { | 2782 | if (bytes > 10000) { |
| 2639 | if ((packets < 10) || | 2783 | /* jumbo frames need bulk latency setting */ |
| 2640 | ((bytes/packets) > 1200)) | 2784 | if (bytes/packets > 8000) |
| 2785 | retval = bulk_latency; | ||
| 2786 | else if ((packets < 10) || ((bytes/packets) > 1200)) | ||
| 2641 | retval = bulk_latency; | 2787 | retval = bulk_latency; |
| 2642 | else if ((packets > 35)) | 2788 | else if ((packets > 35)) |
| 2643 | retval = lowest_latency; | 2789 | retval = lowest_latency; |
| 2644 | } else if (packets <= 2 && bytes < 512) | 2790 | } else if (bytes/packets > 2000) |
| 2791 | retval = bulk_latency; | ||
| 2792 | else if (packets <= 2 && bytes < 512) | ||
| 2645 | retval = lowest_latency; | 2793 | retval = lowest_latency; |
| 2646 | break; | 2794 | break; |
| 2647 | case bulk_latency: /* 250 usec aka 4000 ints/s */ | 2795 | case bulk_latency: /* 250 usec aka 4000 ints/s */ |
| 2648 | if (bytes > 25000) { | 2796 | if (bytes > 25000) { |
| 2649 | if (packets > 35) | 2797 | if (packets > 35) |
| 2650 | retval = low_latency; | 2798 | retval = low_latency; |
| 2651 | } else { | 2799 | } else if (bytes < 6000) { |
| 2652 | if (bytes < 6000) | 2800 | retval = low_latency; |
| 2653 | retval = low_latency; | ||
| 2654 | } | 2801 | } |
| 2655 | break; | 2802 | break; |
| 2656 | } | 2803 | } |
| @@ -2679,17 +2826,20 @@ static void e1000_set_itr(struct e1000_adapter *adapter) | |||
| 2679 | adapter->tx_itr, | 2826 | adapter->tx_itr, |
| 2680 | adapter->total_tx_packets, | 2827 | adapter->total_tx_packets, |
| 2681 | adapter->total_tx_bytes); | 2828 | adapter->total_tx_bytes); |
| 2829 | /* conservative mode (itr 3) eliminates the lowest_latency setting */ | ||
| 2830 | if (adapter->itr_setting == 3 && adapter->tx_itr == lowest_latency) | ||
| 2831 | adapter->tx_itr = low_latency; | ||
| 2832 | |||
| 2682 | adapter->rx_itr = e1000_update_itr(adapter, | 2833 | adapter->rx_itr = e1000_update_itr(adapter, |
| 2683 | adapter->rx_itr, | 2834 | adapter->rx_itr, |
| 2684 | adapter->total_rx_packets, | 2835 | adapter->total_rx_packets, |
| 2685 | adapter->total_rx_bytes); | 2836 | adapter->total_rx_bytes); |
| 2837 | /* conservative mode (itr 3) eliminates the lowest_latency setting */ | ||
| 2838 | if (adapter->itr_setting == 3 && adapter->rx_itr == lowest_latency) | ||
| 2839 | adapter->rx_itr = low_latency; | ||
| 2686 | 2840 | ||
| 2687 | current_itr = max(adapter->rx_itr, adapter->tx_itr); | 2841 | current_itr = max(adapter->rx_itr, adapter->tx_itr); |
| 2688 | 2842 | ||
| 2689 | /* conservative mode eliminates the lowest_latency setting */ | ||
| 2690 | if (current_itr == lowest_latency && (adapter->itr_setting == 3)) | ||
| 2691 | current_itr = low_latency; | ||
| 2692 | |||
| 2693 | switch (current_itr) { | 2843 | switch (current_itr) { |
| 2694 | /* counts and packets in update_itr are dependent on these numbers */ | 2844 | /* counts and packets in update_itr are dependent on these numbers */ |
| 2695 | case lowest_latency: | 2845 | case lowest_latency: |
| @@ -3168,6 +3318,16 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
| 3168 | if (skb->data_len && (hdr_len == (skb->len - skb->data_len))) { | 3318 | if (skb->data_len && (hdr_len == (skb->len - skb->data_len))) { |
| 3169 | switch (adapter->hw.mac_type) { | 3319 | switch (adapter->hw.mac_type) { |
| 3170 | unsigned int pull_size; | 3320 | unsigned int pull_size; |
| 3321 | case e1000_82544: | ||
| 3322 | /* Make sure we have room to chop off 4 bytes, | ||
| 3323 | * and that the end alignment will work out to | ||
| 3324 | * this hardware's requirements | ||
| 3325 | * NOTE: this is a TSO only workaround | ||
| 3326 | * if end byte alignment not correct move us | ||
| 3327 | * into the next dword */ | ||
| 3328 | if ((unsigned long)(skb->tail - 1) & 4) | ||
| 3329 | break; | ||
| 3330 | /* fall through */ | ||
| 3171 | case e1000_82571: | 3331 | case e1000_82571: |
| 3172 | case e1000_82572: | 3332 | case e1000_82572: |
| 3173 | case e1000_82573: | 3333 | case e1000_82573: |
| @@ -3419,12 +3579,11 @@ e1000_change_mtu(struct net_device *netdev, int new_mtu) | |||
| 3419 | adapter->rx_buffer_len = MAXIMUM_ETHERNET_VLAN_SIZE; | 3579 | adapter->rx_buffer_len = MAXIMUM_ETHERNET_VLAN_SIZE; |
| 3420 | 3580 | ||
| 3421 | netdev->mtu = new_mtu; | 3581 | netdev->mtu = new_mtu; |
| 3582 | adapter->hw.max_frame_size = max_frame; | ||
| 3422 | 3583 | ||
| 3423 | if (netif_running(netdev)) | 3584 | if (netif_running(netdev)) |
| 3424 | e1000_reinit_locked(adapter); | 3585 | e1000_reinit_locked(adapter); |
| 3425 | 3586 | ||
| 3426 | adapter->hw.max_frame_size = max_frame; | ||
| 3427 | |||
| 3428 | return 0; | 3587 | return 0; |
| 3429 | } | 3588 | } |
| 3430 | 3589 | ||
| @@ -3573,6 +3732,11 @@ e1000_update_stats(struct e1000_adapter *adapter) | |||
| 3573 | adapter->net_stats.tx_aborted_errors = adapter->stats.ecol; | 3732 | adapter->net_stats.tx_aborted_errors = adapter->stats.ecol; |
| 3574 | adapter->net_stats.tx_window_errors = adapter->stats.latecol; | 3733 | adapter->net_stats.tx_window_errors = adapter->stats.latecol; |
| 3575 | adapter->net_stats.tx_carrier_errors = adapter->stats.tncrs; | 3734 | adapter->net_stats.tx_carrier_errors = adapter->stats.tncrs; |
| 3735 | if (adapter->hw.bad_tx_carr_stats_fd && | ||
| 3736 | adapter->link_duplex == FULL_DUPLEX) { | ||
| 3737 | adapter->net_stats.tx_carrier_errors = 0; | ||
| 3738 | adapter->stats.tncrs = 0; | ||
| 3739 | } | ||
| 3576 | 3740 | ||
| 3577 | /* Tx Dropped needs to be maintained elsewhere */ | 3741 | /* Tx Dropped needs to be maintained elsewhere */ |
| 3578 | 3742 | ||
| @@ -3590,6 +3754,13 @@ e1000_update_stats(struct e1000_adapter *adapter) | |||
| 3590 | adapter->phy_stats.receive_errors += phy_tmp; | 3754 | adapter->phy_stats.receive_errors += phy_tmp; |
| 3591 | } | 3755 | } |
| 3592 | 3756 | ||
| 3757 | /* Management Stats */ | ||
| 3758 | if (adapter->hw.has_smbus) { | ||
| 3759 | adapter->stats.mgptc += E1000_READ_REG(hw, MGTPTC); | ||
| 3760 | adapter->stats.mgprc += E1000_READ_REG(hw, MGTPRC); | ||
| 3761 | adapter->stats.mgpdc += E1000_READ_REG(hw, MGTPDC); | ||
| 3762 | } | ||
| 3763 | |||
| 3593 | spin_unlock_irqrestore(&adapter->stats_lock, flags); | 3764 | spin_unlock_irqrestore(&adapter->stats_lock, flags); |
| 3594 | } | 3765 | } |
| 3595 | #ifdef CONFIG_PCI_MSI | 3766 | #ifdef CONFIG_PCI_MSI |
| @@ -3868,11 +4039,11 @@ e1000_clean_tx_irq(struct e1000_adapter *adapter, | |||
| 3868 | cleaned = (i == eop); | 4039 | cleaned = (i == eop); |
| 3869 | 4040 | ||
| 3870 | if (cleaned) { | 4041 | if (cleaned) { |
| 3871 | /* this packet count is wrong for TSO but has a | 4042 | struct sk_buff *skb = buffer_info->skb; |
| 3872 | * tendency to make dynamic ITR change more | 4043 | unsigned int segs = skb_shinfo(skb)->gso_segs; |
| 3873 | * towards bulk */ | 4044 | total_tx_packets += segs; |
| 3874 | total_tx_packets++; | 4045 | total_tx_packets++; |
| 3875 | total_tx_bytes += buffer_info->skb->len; | 4046 | total_tx_bytes += skb->len; |
| 3876 | } | 4047 | } |
| 3877 | e1000_unmap_and_free_tx_resource(adapter, buffer_info); | 4048 | e1000_unmap_and_free_tx_resource(adapter, buffer_info); |
| 3878 | tx_desc->upper.data = 0; | 4049 | tx_desc->upper.data = 0; |
| @@ -4094,8 +4265,7 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter, | |||
| 4094 | /* code added for copybreak, this should improve | 4265 | /* code added for copybreak, this should improve |
| 4095 | * performance for small packets with large amounts | 4266 | * performance for small packets with large amounts |
| 4096 | * of reassembly being done in the stack */ | 4267 | * of reassembly being done in the stack */ |
| 4097 | #define E1000_CB_LENGTH 256 | 4268 | if (length < copybreak) { |
| 4098 | if (length < E1000_CB_LENGTH) { | ||
| 4099 | struct sk_buff *new_skb = | 4269 | struct sk_buff *new_skb = |
| 4100 | netdev_alloc_skb(netdev, length + NET_IP_ALIGN); | 4270 | netdev_alloc_skb(netdev, length + NET_IP_ALIGN); |
| 4101 | if (new_skb) { | 4271 | if (new_skb) { |
| @@ -4253,7 +4423,7 @@ e1000_clean_rx_irq_ps(struct e1000_adapter *adapter, | |||
| 4253 | 4423 | ||
| 4254 | /* page alloc/put takes too long and effects small packet | 4424 | /* page alloc/put takes too long and effects small packet |
| 4255 | * throughput, so unsplit small packets and save the alloc/put*/ | 4425 | * throughput, so unsplit small packets and save the alloc/put*/ |
| 4256 | if (l1 && ((length + l1) <= adapter->rx_ps_bsize0)) { | 4426 | if (l1 && (l1 <= copybreak) && ((length + l1) <= adapter->rx_ps_bsize0)) { |
| 4257 | u8 *vaddr; | 4427 | u8 *vaddr; |
| 4258 | /* there is no documentation about how to call | 4428 | /* there is no documentation about how to call |
| 4259 | * kmap_atomic, so we can't hold the mapping | 4429 | * kmap_atomic, so we can't hold the mapping |
| @@ -4998,7 +5168,7 @@ e1000_suspend(struct pci_dev *pdev, pm_message_t state) | |||
| 4998 | { | 5168 | { |
| 4999 | struct net_device *netdev = pci_get_drvdata(pdev); | 5169 | struct net_device *netdev = pci_get_drvdata(pdev); |
| 5000 | struct e1000_adapter *adapter = netdev_priv(netdev); | 5170 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 5001 | uint32_t ctrl, ctrl_ext, rctl, manc, status; | 5171 | uint32_t ctrl, ctrl_ext, rctl, status; |
| 5002 | uint32_t wufc = adapter->wol; | 5172 | uint32_t wufc = adapter->wol; |
| 5003 | #ifdef CONFIG_PM | 5173 | #ifdef CONFIG_PM |
| 5004 | int retval = 0; | 5174 | int retval = 0; |
| @@ -5067,16 +5237,12 @@ e1000_suspend(struct pci_dev *pdev, pm_message_t state) | |||
| 5067 | pci_enable_wake(pdev, PCI_D3cold, 0); | 5237 | pci_enable_wake(pdev, PCI_D3cold, 0); |
| 5068 | } | 5238 | } |
| 5069 | 5239 | ||
| 5070 | if (adapter->hw.mac_type >= e1000_82540 && | 5240 | e1000_release_manageability(adapter); |
| 5071 | adapter->hw.mac_type < e1000_82571 && | 5241 | |
| 5072 | adapter->hw.media_type == e1000_media_type_copper) { | 5242 | /* make sure adapter isn't asleep if manageability is enabled */ |
| 5073 | manc = E1000_READ_REG(&adapter->hw, MANC); | 5243 | if (adapter->en_mng_pt) { |
| 5074 | if (manc & E1000_MANC_SMBUS_EN) { | 5244 | pci_enable_wake(pdev, PCI_D3hot, 1); |
| 5075 | manc |= E1000_MANC_ARP_EN; | 5245 | pci_enable_wake(pdev, PCI_D3cold, 1); |
| 5076 | E1000_WRITE_REG(&adapter->hw, MANC, manc); | ||
| 5077 | pci_enable_wake(pdev, PCI_D3hot, 1); | ||
| 5078 | pci_enable_wake(pdev, PCI_D3cold, 1); | ||
| 5079 | } | ||
| 5080 | } | 5246 | } |
| 5081 | 5247 | ||
| 5082 | if (adapter->hw.phy_type == e1000_phy_igp_3) | 5248 | if (adapter->hw.phy_type == e1000_phy_igp_3) |
| @@ -5102,7 +5268,7 @@ e1000_resume(struct pci_dev *pdev) | |||
| 5102 | { | 5268 | { |
| 5103 | struct net_device *netdev = pci_get_drvdata(pdev); | 5269 | struct net_device *netdev = pci_get_drvdata(pdev); |
| 5104 | struct e1000_adapter *adapter = netdev_priv(netdev); | 5270 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 5105 | uint32_t manc, err; | 5271 | uint32_t err; |
| 5106 | 5272 | ||
| 5107 | pci_set_power_state(pdev, PCI_D0); | 5273 | pci_set_power_state(pdev, PCI_D0); |
| 5108 | e1000_pci_restore_state(adapter); | 5274 | e1000_pci_restore_state(adapter); |
| @@ -5122,19 +5288,13 @@ e1000_resume(struct pci_dev *pdev) | |||
| 5122 | e1000_reset(adapter); | 5288 | e1000_reset(adapter); |
| 5123 | E1000_WRITE_REG(&adapter->hw, WUS, ~0); | 5289 | E1000_WRITE_REG(&adapter->hw, WUS, ~0); |
| 5124 | 5290 | ||
| 5291 | e1000_init_manageability(adapter); | ||
| 5292 | |||
| 5125 | if (netif_running(netdev)) | 5293 | if (netif_running(netdev)) |
| 5126 | e1000_up(adapter); | 5294 | e1000_up(adapter); |
| 5127 | 5295 | ||
| 5128 | netif_device_attach(netdev); | 5296 | netif_device_attach(netdev); |
| 5129 | 5297 | ||
| 5130 | if (adapter->hw.mac_type >= e1000_82540 && | ||
| 5131 | adapter->hw.mac_type < e1000_82571 && | ||
| 5132 | adapter->hw.media_type == e1000_media_type_copper) { | ||
| 5133 | manc = E1000_READ_REG(&adapter->hw, MANC); | ||
| 5134 | manc &= ~(E1000_MANC_ARP_EN); | ||
| 5135 | E1000_WRITE_REG(&adapter->hw, MANC, manc); | ||
| 5136 | } | ||
| 5137 | |||
| 5138 | /* If the controller is 82573 and f/w is AMT, do not set | 5298 | /* If the controller is 82573 and f/w is AMT, do not set |
| 5139 | * DRV_LOAD until the interface is up. For all other cases, | 5299 | * DRV_LOAD until the interface is up. For all other cases, |
| 5140 | * let the f/w know that the h/w is now under the control | 5300 | * let the f/w know that the h/w is now under the control |
| @@ -5235,7 +5395,8 @@ static void e1000_io_resume(struct pci_dev *pdev) | |||
| 5235 | { | 5395 | { |
| 5236 | struct net_device *netdev = pci_get_drvdata(pdev); | 5396 | struct net_device *netdev = pci_get_drvdata(pdev); |
| 5237 | struct e1000_adapter *adapter = netdev->priv; | 5397 | struct e1000_adapter *adapter = netdev->priv; |
| 5238 | uint32_t manc, swsm; | 5398 | |
| 5399 | e1000_init_manageability(adapter); | ||
| 5239 | 5400 | ||
| 5240 | if (netif_running(netdev)) { | 5401 | if (netif_running(netdev)) { |
| 5241 | if (e1000_up(adapter)) { | 5402 | if (e1000_up(adapter)) { |
| @@ -5246,26 +5407,14 @@ static void e1000_io_resume(struct pci_dev *pdev) | |||
| 5246 | 5407 | ||
| 5247 | netif_device_attach(netdev); | 5408 | netif_device_attach(netdev); |
| 5248 | 5409 | ||
| 5249 | if (adapter->hw.mac_type >= e1000_82540 && | 5410 | /* If the controller is 82573 and f/w is AMT, do not set |
| 5250 | adapter->hw.mac_type < e1000_82571 && | 5411 | * DRV_LOAD until the interface is up. For all other cases, |
| 5251 | adapter->hw.media_type == e1000_media_type_copper) { | 5412 | * let the f/w know that the h/w is now under the control |
| 5252 | manc = E1000_READ_REG(&adapter->hw, MANC); | 5413 | * of the driver. */ |
| 5253 | manc &= ~(E1000_MANC_ARP_EN); | 5414 | if (adapter->hw.mac_type != e1000_82573 || |
| 5254 | E1000_WRITE_REG(&adapter->hw, MANC, manc); | 5415 | !e1000_check_mng_mode(&adapter->hw)) |
| 5255 | } | 5416 | e1000_get_hw_control(adapter); |
| 5256 | |||
| 5257 | switch (adapter->hw.mac_type) { | ||
| 5258 | case e1000_82573: | ||
| 5259 | swsm = E1000_READ_REG(&adapter->hw, SWSM); | ||
| 5260 | E1000_WRITE_REG(&adapter->hw, SWSM, | ||
| 5261 | swsm | E1000_SWSM_DRV_LOAD); | ||
| 5262 | break; | ||
| 5263 | default: | ||
| 5264 | break; | ||
| 5265 | } | ||
| 5266 | 5417 | ||
| 5267 | if (netif_running(netdev)) | ||
| 5268 | mod_timer(&adapter->watchdog_timer, jiffies); | ||
| 5269 | } | 5418 | } |
| 5270 | 5419 | ||
| 5271 | /* e1000_main.c */ | 5420 | /* e1000_main.c */ |
diff --git a/drivers/net/e1000/e1000_param.c b/drivers/net/e1000/e1000_param.c index cbfcd7f2889f..cf2a279307e1 100644 --- a/drivers/net/e1000/e1000_param.c +++ b/drivers/net/e1000/e1000_param.c | |||
| @@ -487,7 +487,9 @@ e1000_check_options(struct e1000_adapter *adapter) | |||
| 487 | e1000_validate_option(&adapter->itr, &opt, | 487 | e1000_validate_option(&adapter->itr, &opt, |
| 488 | adapter); | 488 | adapter); |
| 489 | /* save the setting, because the dynamic bits change itr */ | 489 | /* save the setting, because the dynamic bits change itr */ |
| 490 | adapter->itr_setting = adapter->itr; | 490 | /* clear the lower two bits because they are |
| 491 | * used as control */ | ||
| 492 | adapter->itr_setting = adapter->itr & ~3; | ||
| 491 | break; | 493 | break; |
| 492 | } | 494 | } |
| 493 | } else { | 495 | } else { |
diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c index 439f41338291..2f48fe9a29a7 100644 --- a/drivers/net/forcedeth.c +++ b/drivers/net/forcedeth.c | |||
| @@ -3,8 +3,7 @@ | |||
| 3 | * | 3 | * |
| 4 | * Note: This driver is a cleanroom reimplementation based on reverse | 4 | * Note: This driver is a cleanroom reimplementation based on reverse |
| 5 | * engineered documentation written by Carl-Daniel Hailfinger | 5 | * engineered documentation written by Carl-Daniel Hailfinger |
| 6 | * and Andrew de Quincey. It's neither supported nor endorsed | 6 | * and Andrew de Quincey. |
| 7 | * by NVIDIA Corp. Use at your own risk. | ||
| 8 | * | 7 | * |
| 9 | * NVIDIA, nForce and other NVIDIA marks are trademarks or registered | 8 | * NVIDIA, nForce and other NVIDIA marks are trademarks or registered |
| 10 | * trademarks of NVIDIA Corporation in the United States and other | 9 | * trademarks of NVIDIA Corporation in the United States and other |
| @@ -14,7 +13,7 @@ | |||
| 14 | * Copyright (C) 2004 Andrew de Quincey (wol support) | 13 | * Copyright (C) 2004 Andrew de Quincey (wol support) |
| 15 | * Copyright (C) 2004 Carl-Daniel Hailfinger (invalid MAC handling, insane | 14 | * Copyright (C) 2004 Carl-Daniel Hailfinger (invalid MAC handling, insane |
| 16 | * IRQ rate fixes, bigendian fixes, cleanups, verification) | 15 | * IRQ rate fixes, bigendian fixes, cleanups, verification) |
| 17 | * Copyright (c) 2004 NVIDIA Corporation | 16 | * Copyright (c) 2004,5,6 NVIDIA Corporation |
| 18 | * | 17 | * |
| 19 | * This program is free software; you can redistribute it and/or modify | 18 | * This program is free software; you can redistribute it and/or modify |
| 20 | * it under the terms of the GNU General Public License as published by | 19 | * it under the terms of the GNU General Public License as published by |
| @@ -2576,14 +2575,15 @@ static int nv_napi_poll(struct net_device *dev, int *budget) | |||
| 2576 | int pkts, limit = min(*budget, dev->quota); | 2575 | int pkts, limit = min(*budget, dev->quota); |
| 2577 | struct fe_priv *np = netdev_priv(dev); | 2576 | struct fe_priv *np = netdev_priv(dev); |
| 2578 | u8 __iomem *base = get_hwbase(dev); | 2577 | u8 __iomem *base = get_hwbase(dev); |
| 2578 | unsigned long flags; | ||
| 2579 | 2579 | ||
| 2580 | pkts = nv_rx_process(dev, limit); | 2580 | pkts = nv_rx_process(dev, limit); |
| 2581 | 2581 | ||
| 2582 | if (nv_alloc_rx(dev)) { | 2582 | if (nv_alloc_rx(dev)) { |
| 2583 | spin_lock_irq(&np->lock); | 2583 | spin_lock_irqsave(&np->lock, flags); |
| 2584 | if (!np->in_shutdown) | 2584 | if (!np->in_shutdown) |
| 2585 | mod_timer(&np->oom_kick, jiffies + OOM_REFILL); | 2585 | mod_timer(&np->oom_kick, jiffies + OOM_REFILL); |
| 2586 | spin_unlock_irq(&np->lock); | 2586 | spin_unlock_irqrestore(&np->lock, flags); |
| 2587 | } | 2587 | } |
| 2588 | 2588 | ||
| 2589 | if (pkts < limit) { | 2589 | if (pkts < limit) { |
| @@ -2591,13 +2591,15 @@ static int nv_napi_poll(struct net_device *dev, int *budget) | |||
| 2591 | netif_rx_complete(dev); | 2591 | netif_rx_complete(dev); |
| 2592 | 2592 | ||
| 2593 | /* re-enable receive interrupts */ | 2593 | /* re-enable receive interrupts */ |
| 2594 | spin_lock_irq(&np->lock); | 2594 | spin_lock_irqsave(&np->lock, flags); |
| 2595 | |||
| 2595 | np->irqmask |= NVREG_IRQ_RX_ALL; | 2596 | np->irqmask |= NVREG_IRQ_RX_ALL; |
| 2596 | if (np->msi_flags & NV_MSI_X_ENABLED) | 2597 | if (np->msi_flags & NV_MSI_X_ENABLED) |
| 2597 | writel(NVREG_IRQ_RX_ALL, base + NvRegIrqMask); | 2598 | writel(NVREG_IRQ_RX_ALL, base + NvRegIrqMask); |
| 2598 | else | 2599 | else |
| 2599 | writel(np->irqmask, base + NvRegIrqMask); | 2600 | writel(np->irqmask, base + NvRegIrqMask); |
| 2600 | spin_unlock_irq(&np->lock); | 2601 | |
| 2602 | spin_unlock_irqrestore(&np->lock, flags); | ||
| 2601 | return 0; | 2603 | return 0; |
| 2602 | } else { | 2604 | } else { |
| 2603 | /* used up our quantum, so reschedule */ | 2605 | /* used up our quantum, so reschedule */ |
diff --git a/drivers/net/ibm_emac/ibm_emac_phy.c b/drivers/net/ibm_emac/ibm_emac_phy.c index 4a97024061e5..9074f76ee2bf 100644 --- a/drivers/net/ibm_emac/ibm_emac_phy.c +++ b/drivers/net/ibm_emac/ibm_emac_phy.c | |||
| @@ -309,7 +309,7 @@ int mii_phy_probe(struct mii_phy *phy, int address) | |||
| 309 | { | 309 | { |
| 310 | struct mii_phy_def *def; | 310 | struct mii_phy_def *def; |
| 311 | int i; | 311 | int i; |
| 312 | u32 id; | 312 | int id; |
| 313 | 313 | ||
| 314 | phy->autoneg = AUTONEG_DISABLE; | 314 | phy->autoneg = AUTONEG_DISABLE; |
| 315 | phy->advertising = 0; | 315 | phy->advertising = 0; |
| @@ -324,6 +324,8 @@ int mii_phy_probe(struct mii_phy *phy, int address) | |||
| 324 | 324 | ||
| 325 | /* Read ID and find matching entry */ | 325 | /* Read ID and find matching entry */ |
| 326 | id = (phy_read(phy, MII_PHYSID1) << 16) | phy_read(phy, MII_PHYSID2); | 326 | id = (phy_read(phy, MII_PHYSID1) << 16) | phy_read(phy, MII_PHYSID2); |
| 327 | if (id < 0) | ||
| 328 | return -ENODEV; | ||
| 327 | for (i = 0; (def = mii_phy_table[i]) != NULL; i++) | 329 | for (i = 0; (def = mii_phy_table[i]) != NULL; i++) |
| 328 | if ((id & def->phy_id_mask) == def->phy_id) | 330 | if ((id & def->phy_id_mask) == def->phy_id) |
| 329 | break; | 331 | break; |
diff --git a/drivers/net/myri10ge/myri10ge.c b/drivers/net/myri10ge/myri10ge.c index 94ac168be593..07cf574197e5 100644 --- a/drivers/net/myri10ge/myri10ge.c +++ b/drivers/net/myri10ge/myri10ge.c | |||
| @@ -199,8 +199,6 @@ struct myri10ge_priv { | |||
| 199 | unsigned long serial_number; | 199 | unsigned long serial_number; |
| 200 | int vendor_specific_offset; | 200 | int vendor_specific_offset; |
| 201 | int fw_multicast_support; | 201 | int fw_multicast_support; |
| 202 | u32 devctl; | ||
| 203 | u16 msi_flags; | ||
| 204 | u32 read_dma; | 202 | u32 read_dma; |
| 205 | u32 write_dma; | 203 | u32 write_dma; |
| 206 | u32 read_write_dma; | 204 | u32 read_write_dma; |
| @@ -228,7 +226,7 @@ module_param(myri10ge_small_bytes, int, S_IRUGO | S_IWUSR); | |||
| 228 | MODULE_PARM_DESC(myri10ge_small_bytes, "Threshold of small packets\n"); | 226 | MODULE_PARM_DESC(myri10ge_small_bytes, "Threshold of small packets\n"); |
| 229 | 227 | ||
| 230 | static int myri10ge_msi = 1; /* enable msi by default */ | 228 | static int myri10ge_msi = 1; /* enable msi by default */ |
| 231 | module_param(myri10ge_msi, int, S_IRUGO); | 229 | module_param(myri10ge_msi, int, S_IRUGO | S_IWUSR); |
| 232 | MODULE_PARM_DESC(myri10ge_msi, "Enable Message Signalled Interrupts\n"); | 230 | MODULE_PARM_DESC(myri10ge_msi, "Enable Message Signalled Interrupts\n"); |
| 233 | 231 | ||
| 234 | static int myri10ge_intr_coal_delay = 25; | 232 | static int myri10ge_intr_coal_delay = 25; |
| @@ -721,12 +719,10 @@ static int myri10ge_reset(struct myri10ge_priv *mgp) | |||
| 721 | status |= | 719 | status |= |
| 722 | myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_IRQ_ACK_OFFSET, &cmd, 0); | 720 | myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_IRQ_ACK_OFFSET, &cmd, 0); |
| 723 | mgp->irq_claim = (__iomem __be32 *) (mgp->sram + cmd.data0); | 721 | mgp->irq_claim = (__iomem __be32 *) (mgp->sram + cmd.data0); |
| 724 | if (!mgp->msi_enabled) { | 722 | status |= myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_IRQ_DEASSERT_OFFSET, |
| 725 | status |= myri10ge_send_cmd | 723 | &cmd, 0); |
| 726 | (mgp, MXGEFW_CMD_GET_IRQ_DEASSERT_OFFSET, &cmd, 0); | 724 | mgp->irq_deassert = (__iomem __be32 *) (mgp->sram + cmd.data0); |
| 727 | mgp->irq_deassert = (__iomem __be32 *) (mgp->sram + cmd.data0); | ||
| 728 | 725 | ||
| 729 | } | ||
| 730 | status |= myri10ge_send_cmd | 726 | status |= myri10ge_send_cmd |
| 731 | (mgp, MXGEFW_CMD_GET_INTR_COAL_DELAY_OFFSET, &cmd, 0); | 727 | (mgp, MXGEFW_CMD_GET_INTR_COAL_DELAY_OFFSET, &cmd, 0); |
| 732 | mgp->intr_coal_delay_ptr = (__iomem __be32 *) (mgp->sram + cmd.data0); | 728 | mgp->intr_coal_delay_ptr = (__iomem __be32 *) (mgp->sram + cmd.data0); |
| @@ -1619,6 +1615,41 @@ static void myri10ge_free_rings(struct net_device *dev) | |||
| 1619 | mgp->tx.req_list = NULL; | 1615 | mgp->tx.req_list = NULL; |
| 1620 | } | 1616 | } |
| 1621 | 1617 | ||
| 1618 | static int myri10ge_request_irq(struct myri10ge_priv *mgp) | ||
| 1619 | { | ||
| 1620 | struct pci_dev *pdev = mgp->pdev; | ||
| 1621 | int status; | ||
| 1622 | |||
| 1623 | if (myri10ge_msi) { | ||
| 1624 | status = pci_enable_msi(pdev); | ||
| 1625 | if (status != 0) | ||
| 1626 | dev_err(&pdev->dev, | ||
| 1627 | "Error %d setting up MSI; falling back to xPIC\n", | ||
| 1628 | status); | ||
| 1629 | else | ||
| 1630 | mgp->msi_enabled = 1; | ||
| 1631 | } else { | ||
| 1632 | mgp->msi_enabled = 0; | ||
| 1633 | } | ||
| 1634 | status = request_irq(pdev->irq, myri10ge_intr, IRQF_SHARED, | ||
| 1635 | mgp->dev->name, mgp); | ||
| 1636 | if (status != 0) { | ||
| 1637 | dev_err(&pdev->dev, "failed to allocate IRQ\n"); | ||
| 1638 | if (mgp->msi_enabled) | ||
| 1639 | pci_disable_msi(pdev); | ||
| 1640 | } | ||
| 1641 | return status; | ||
| 1642 | } | ||
| 1643 | |||
| 1644 | static void myri10ge_free_irq(struct myri10ge_priv *mgp) | ||
| 1645 | { | ||
| 1646 | struct pci_dev *pdev = mgp->pdev; | ||
| 1647 | |||
| 1648 | free_irq(pdev->irq, mgp); | ||
| 1649 | if (mgp->msi_enabled) | ||
| 1650 | pci_disable_msi(pdev); | ||
| 1651 | } | ||
| 1652 | |||
| 1622 | static int myri10ge_open(struct net_device *dev) | 1653 | static int myri10ge_open(struct net_device *dev) |
| 1623 | { | 1654 | { |
| 1624 | struct myri10ge_priv *mgp; | 1655 | struct myri10ge_priv *mgp; |
| @@ -1634,10 +1665,13 @@ static int myri10ge_open(struct net_device *dev) | |||
| 1634 | status = myri10ge_reset(mgp); | 1665 | status = myri10ge_reset(mgp); |
| 1635 | if (status != 0) { | 1666 | if (status != 0) { |
| 1636 | printk(KERN_ERR "myri10ge: %s: failed reset\n", dev->name); | 1667 | printk(KERN_ERR "myri10ge: %s: failed reset\n", dev->name); |
| 1637 | mgp->running = MYRI10GE_ETH_STOPPED; | 1668 | goto abort_with_nothing; |
| 1638 | return -ENXIO; | ||
| 1639 | } | 1669 | } |
| 1640 | 1670 | ||
| 1671 | status = myri10ge_request_irq(mgp); | ||
| 1672 | if (status != 0) | ||
| 1673 | goto abort_with_nothing; | ||
| 1674 | |||
| 1641 | /* decide what small buffer size to use. For good TCP rx | 1675 | /* decide what small buffer size to use. For good TCP rx |
| 1642 | * performance, it is important to not receive 1514 byte | 1676 | * performance, it is important to not receive 1514 byte |
| 1643 | * frames into jumbo buffers, as it confuses the socket buffer | 1677 | * frames into jumbo buffers, as it confuses the socket buffer |
| @@ -1677,7 +1711,7 @@ static int myri10ge_open(struct net_device *dev) | |||
| 1677 | "myri10ge: %s: failed to get ring sizes or locations\n", | 1711 | "myri10ge: %s: failed to get ring sizes or locations\n", |
| 1678 | dev->name); | 1712 | dev->name); |
| 1679 | mgp->running = MYRI10GE_ETH_STOPPED; | 1713 | mgp->running = MYRI10GE_ETH_STOPPED; |
| 1680 | return -ENXIO; | 1714 | goto abort_with_irq; |
| 1681 | } | 1715 | } |
| 1682 | 1716 | ||
| 1683 | if (mgp->mtrr >= 0) { | 1717 | if (mgp->mtrr >= 0) { |
| @@ -1708,7 +1742,7 @@ static int myri10ge_open(struct net_device *dev) | |||
| 1708 | 1742 | ||
| 1709 | status = myri10ge_allocate_rings(dev); | 1743 | status = myri10ge_allocate_rings(dev); |
| 1710 | if (status != 0) | 1744 | if (status != 0) |
| 1711 | goto abort_with_nothing; | 1745 | goto abort_with_irq; |
| 1712 | 1746 | ||
| 1713 | /* now give firmware buffers sizes, and MTU */ | 1747 | /* now give firmware buffers sizes, and MTU */ |
| 1714 | cmd.data0 = dev->mtu + ETH_HLEN + VLAN_HLEN; | 1748 | cmd.data0 = dev->mtu + ETH_HLEN + VLAN_HLEN; |
| @@ -1771,6 +1805,9 @@ static int myri10ge_open(struct net_device *dev) | |||
| 1771 | abort_with_rings: | 1805 | abort_with_rings: |
| 1772 | myri10ge_free_rings(dev); | 1806 | myri10ge_free_rings(dev); |
| 1773 | 1807 | ||
| 1808 | abort_with_irq: | ||
| 1809 | myri10ge_free_irq(mgp); | ||
| 1810 | |||
| 1774 | abort_with_nothing: | 1811 | abort_with_nothing: |
| 1775 | mgp->running = MYRI10GE_ETH_STOPPED; | 1812 | mgp->running = MYRI10GE_ETH_STOPPED; |
| 1776 | return -ENOMEM; | 1813 | return -ENOMEM; |
| @@ -1807,7 +1844,7 @@ static int myri10ge_close(struct net_device *dev) | |||
| 1807 | printk(KERN_ERR "myri10ge: %s never got down irq\n", dev->name); | 1844 | printk(KERN_ERR "myri10ge: %s never got down irq\n", dev->name); |
| 1808 | 1845 | ||
| 1809 | netif_tx_disable(dev); | 1846 | netif_tx_disable(dev); |
| 1810 | 1847 | myri10ge_free_irq(mgp); | |
| 1811 | myri10ge_free_rings(dev); | 1848 | myri10ge_free_rings(dev); |
| 1812 | 1849 | ||
| 1813 | mgp->running = MYRI10GE_ETH_STOPPED; | 1850 | mgp->running = MYRI10GE_ETH_STOPPED; |
| @@ -2481,34 +2518,6 @@ static void myri10ge_select_firmware(struct myri10ge_priv *mgp) | |||
| 2481 | } | 2518 | } |
| 2482 | } | 2519 | } |
| 2483 | 2520 | ||
| 2484 | static void myri10ge_save_state(struct myri10ge_priv *mgp) | ||
| 2485 | { | ||
| 2486 | struct pci_dev *pdev = mgp->pdev; | ||
| 2487 | int cap; | ||
| 2488 | |||
| 2489 | pci_save_state(pdev); | ||
| 2490 | /* now save PCIe and MSI state that Linux will not | ||
| 2491 | * save for us */ | ||
| 2492 | cap = pci_find_capability(pdev, PCI_CAP_ID_EXP); | ||
| 2493 | pci_read_config_dword(pdev, cap + PCI_EXP_DEVCTL, &mgp->devctl); | ||
| 2494 | cap = pci_find_capability(pdev, PCI_CAP_ID_MSI); | ||
| 2495 | pci_read_config_word(pdev, cap + PCI_MSI_FLAGS, &mgp->msi_flags); | ||
| 2496 | } | ||
| 2497 | |||
| 2498 | static void myri10ge_restore_state(struct myri10ge_priv *mgp) | ||
| 2499 | { | ||
| 2500 | struct pci_dev *pdev = mgp->pdev; | ||
| 2501 | int cap; | ||
| 2502 | |||
| 2503 | /* restore PCIe and MSI state that linux will not */ | ||
| 2504 | cap = pci_find_capability(pdev, PCI_CAP_ID_EXP); | ||
| 2505 | pci_write_config_dword(pdev, cap + PCI_CAP_ID_EXP, mgp->devctl); | ||
| 2506 | cap = pci_find_capability(pdev, PCI_CAP_ID_MSI); | ||
| 2507 | pci_write_config_word(pdev, cap + PCI_MSI_FLAGS, mgp->msi_flags); | ||
| 2508 | |||
| 2509 | pci_restore_state(pdev); | ||
| 2510 | } | ||
| 2511 | |||
| 2512 | #ifdef CONFIG_PM | 2521 | #ifdef CONFIG_PM |
| 2513 | 2522 | ||
| 2514 | static int myri10ge_suspend(struct pci_dev *pdev, pm_message_t state) | 2523 | static int myri10ge_suspend(struct pci_dev *pdev, pm_message_t state) |
| @@ -2529,11 +2538,10 @@ static int myri10ge_suspend(struct pci_dev *pdev, pm_message_t state) | |||
| 2529 | rtnl_unlock(); | 2538 | rtnl_unlock(); |
| 2530 | } | 2539 | } |
| 2531 | myri10ge_dummy_rdma(mgp, 0); | 2540 | myri10ge_dummy_rdma(mgp, 0); |
| 2532 | free_irq(pdev->irq, mgp); | 2541 | pci_save_state(pdev); |
| 2533 | myri10ge_save_state(mgp); | ||
| 2534 | pci_disable_device(pdev); | 2542 | pci_disable_device(pdev); |
| 2535 | pci_set_power_state(pdev, pci_choose_state(pdev, state)); | 2543 | |
| 2536 | return 0; | 2544 | return pci_set_power_state(pdev, pci_choose_state(pdev, state)); |
| 2537 | } | 2545 | } |
| 2538 | 2546 | ||
| 2539 | static int myri10ge_resume(struct pci_dev *pdev) | 2547 | static int myri10ge_resume(struct pci_dev *pdev) |
| @@ -2555,34 +2563,33 @@ static int myri10ge_resume(struct pci_dev *pdev) | |||
| 2555 | mgp->dev->name); | 2563 | mgp->dev->name); |
| 2556 | return -EIO; | 2564 | return -EIO; |
| 2557 | } | 2565 | } |
| 2558 | myri10ge_restore_state(mgp); | 2566 | |
| 2567 | status = pci_restore_state(pdev); | ||
| 2568 | if (status) | ||
| 2569 | return status; | ||
| 2559 | 2570 | ||
| 2560 | status = pci_enable_device(pdev); | 2571 | status = pci_enable_device(pdev); |
| 2561 | if (status < 0) { | 2572 | if (status) { |
| 2562 | dev_err(&pdev->dev, "failed to enable device\n"); | 2573 | dev_err(&pdev->dev, "failed to enable device\n"); |
| 2563 | return -EIO; | 2574 | return status; |
| 2564 | } | 2575 | } |
| 2565 | 2576 | ||
| 2566 | pci_set_master(pdev); | 2577 | pci_set_master(pdev); |
| 2567 | 2578 | ||
| 2568 | status = request_irq(pdev->irq, myri10ge_intr, IRQF_SHARED, | ||
| 2569 | netdev->name, mgp); | ||
| 2570 | if (status != 0) { | ||
| 2571 | dev_err(&pdev->dev, "failed to allocate IRQ\n"); | ||
| 2572 | goto abort_with_enabled; | ||
| 2573 | } | ||
| 2574 | |||
| 2575 | myri10ge_reset(mgp); | 2579 | myri10ge_reset(mgp); |
| 2576 | myri10ge_dummy_rdma(mgp, 1); | 2580 | myri10ge_dummy_rdma(mgp, 1); |
| 2577 | 2581 | ||
| 2578 | /* Save configuration space to be restored if the | 2582 | /* Save configuration space to be restored if the |
| 2579 | * nic resets due to a parity error */ | 2583 | * nic resets due to a parity error */ |
| 2580 | myri10ge_save_state(mgp); | 2584 | pci_save_state(pdev); |
| 2581 | 2585 | ||
| 2582 | if (netif_running(netdev)) { | 2586 | if (netif_running(netdev)) { |
| 2583 | rtnl_lock(); | 2587 | rtnl_lock(); |
| 2584 | myri10ge_open(netdev); | 2588 | status = myri10ge_open(netdev); |
| 2585 | rtnl_unlock(); | 2589 | rtnl_unlock(); |
| 2590 | if (status != 0) | ||
| 2591 | goto abort_with_enabled; | ||
| 2592 | |||
| 2586 | } | 2593 | } |
| 2587 | netif_device_attach(netdev); | 2594 | netif_device_attach(netdev); |
| 2588 | 2595 | ||
| @@ -2640,7 +2647,11 @@ static void myri10ge_watchdog(struct work_struct *work) | |||
| 2640 | * when the driver was loaded, or the last time the | 2647 | * when the driver was loaded, or the last time the |
| 2641 | * nic was resumed from power saving mode. | 2648 | * nic was resumed from power saving mode. |
| 2642 | */ | 2649 | */ |
| 2643 | myri10ge_restore_state(mgp); | 2650 | pci_restore_state(mgp->pdev); |
| 2651 | |||
| 2652 | /* save state again for accounting reasons */ | ||
| 2653 | pci_save_state(mgp->pdev); | ||
| 2654 | |||
| 2644 | } else { | 2655 | } else { |
| 2645 | /* if we get back -1's from our slot, perhaps somebody | 2656 | /* if we get back -1's from our slot, perhaps somebody |
| 2646 | * powered off our card. Don't try to reset it in | 2657 | * powered off our card. Don't try to reset it in |
| @@ -2856,23 +2867,6 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 2856 | goto abort_with_firmware; | 2867 | goto abort_with_firmware; |
| 2857 | } | 2868 | } |
| 2858 | 2869 | ||
| 2859 | if (myri10ge_msi) { | ||
| 2860 | status = pci_enable_msi(pdev); | ||
| 2861 | if (status != 0) | ||
| 2862 | dev_err(&pdev->dev, | ||
| 2863 | "Error %d setting up MSI; falling back to xPIC\n", | ||
| 2864 | status); | ||
| 2865 | else | ||
| 2866 | mgp->msi_enabled = 1; | ||
| 2867 | } | ||
| 2868 | |||
| 2869 | status = request_irq(pdev->irq, myri10ge_intr, IRQF_SHARED, | ||
| 2870 | netdev->name, mgp); | ||
| 2871 | if (status != 0) { | ||
| 2872 | dev_err(&pdev->dev, "failed to allocate IRQ\n"); | ||
| 2873 | goto abort_with_firmware; | ||
| 2874 | } | ||
| 2875 | |||
| 2876 | pci_set_drvdata(pdev, mgp); | 2870 | pci_set_drvdata(pdev, mgp); |
| 2877 | if ((myri10ge_initial_mtu + ETH_HLEN) > MYRI10GE_MAX_ETHER_MTU) | 2871 | if ((myri10ge_initial_mtu + ETH_HLEN) > MYRI10GE_MAX_ETHER_MTU) |
| 2878 | myri10ge_initial_mtu = MYRI10GE_MAX_ETHER_MTU - ETH_HLEN; | 2872 | myri10ge_initial_mtu = MYRI10GE_MAX_ETHER_MTU - ETH_HLEN; |
| @@ -2896,7 +2890,7 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 2896 | 2890 | ||
| 2897 | /* Save configuration space to be restored if the | 2891 | /* Save configuration space to be restored if the |
| 2898 | * nic resets due to a parity error */ | 2892 | * nic resets due to a parity error */ |
| 2899 | myri10ge_save_state(mgp); | 2893 | pci_save_state(pdev); |
| 2900 | 2894 | ||
| 2901 | /* Setup the watchdog timer */ | 2895 | /* Setup the watchdog timer */ |
| 2902 | setup_timer(&mgp->watchdog_timer, myri10ge_watchdog_timer, | 2896 | setup_timer(&mgp->watchdog_timer, myri10ge_watchdog_timer, |
| @@ -2907,19 +2901,16 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 2907 | status = register_netdev(netdev); | 2901 | status = register_netdev(netdev); |
| 2908 | if (status != 0) { | 2902 | if (status != 0) { |
| 2909 | dev_err(&pdev->dev, "register_netdev failed: %d\n", status); | 2903 | dev_err(&pdev->dev, "register_netdev failed: %d\n", status); |
| 2910 | goto abort_with_irq; | 2904 | goto abort_with_state; |
| 2911 | } | 2905 | } |
| 2912 | dev_info(dev, "%s IRQ %d, tx bndry %d, fw %s, WC %s\n", | 2906 | dev_info(dev, "%d, tx bndry %d, fw %s, WC %s\n", |
| 2913 | (mgp->msi_enabled ? "MSI" : "xPIC"), | ||
| 2914 | pdev->irq, mgp->tx.boundary, mgp->fw_name, | 2907 | pdev->irq, mgp->tx.boundary, mgp->fw_name, |
| 2915 | (mgp->mtrr >= 0 ? "Enabled" : "Disabled")); | 2908 | (mgp->mtrr >= 0 ? "Enabled" : "Disabled")); |
| 2916 | 2909 | ||
| 2917 | return 0; | 2910 | return 0; |
| 2918 | 2911 | ||
| 2919 | abort_with_irq: | 2912 | abort_with_state: |
| 2920 | free_irq(pdev->irq, mgp); | 2913 | pci_restore_state(pdev); |
| 2921 | if (mgp->msi_enabled) | ||
| 2922 | pci_disable_msi(pdev); | ||
| 2923 | 2914 | ||
| 2924 | abort_with_firmware: | 2915 | abort_with_firmware: |
| 2925 | myri10ge_dummy_rdma(mgp, 0); | 2916 | myri10ge_dummy_rdma(mgp, 0); |
| @@ -2970,12 +2961,12 @@ static void myri10ge_remove(struct pci_dev *pdev) | |||
| 2970 | flush_scheduled_work(); | 2961 | flush_scheduled_work(); |
| 2971 | netdev = mgp->dev; | 2962 | netdev = mgp->dev; |
| 2972 | unregister_netdev(netdev); | 2963 | unregister_netdev(netdev); |
| 2973 | free_irq(pdev->irq, mgp); | ||
| 2974 | if (mgp->msi_enabled) | ||
| 2975 | pci_disable_msi(pdev); | ||
| 2976 | 2964 | ||
| 2977 | myri10ge_dummy_rdma(mgp, 0); | 2965 | myri10ge_dummy_rdma(mgp, 0); |
| 2978 | 2966 | ||
| 2967 | /* avoid a memory leak */ | ||
| 2968 | pci_restore_state(pdev); | ||
| 2969 | |||
| 2979 | bytes = myri10ge_max_intr_slots * sizeof(*mgp->rx_done.entry); | 2970 | bytes = myri10ge_max_intr_slots * sizeof(*mgp->rx_done.entry); |
| 2980 | dma_free_coherent(&pdev->dev, bytes, | 2971 | dma_free_coherent(&pdev->dev, bytes, |
| 2981 | mgp->rx_done.entry, mgp->rx_done.bus); | 2972 | mgp->rx_done.entry, mgp->rx_done.bus); |
diff --git a/drivers/net/netxen/netxen_nic.h b/drivers/net/netxen/netxen_nic.h index b4c4fc0c7218..6490acf05305 100644 --- a/drivers/net/netxen/netxen_nic.h +++ b/drivers/net/netxen/netxen_nic.h | |||
| @@ -63,7 +63,7 @@ | |||
| 63 | 63 | ||
| 64 | #include "netxen_nic_hw.h" | 64 | #include "netxen_nic_hw.h" |
| 65 | 65 | ||
| 66 | #define NETXEN_NIC_BUILD_NO "1" | 66 | #define NETXEN_NIC_BUILD_NO "4" |
| 67 | #define _NETXEN_NIC_LINUX_MAJOR 3 | 67 | #define _NETXEN_NIC_LINUX_MAJOR 3 |
| 68 | #define _NETXEN_NIC_LINUX_MINOR 3 | 68 | #define _NETXEN_NIC_LINUX_MINOR 3 |
| 69 | #define _NETXEN_NIC_LINUX_SUBVERSION 2 | 69 | #define _NETXEN_NIC_LINUX_SUBVERSION 2 |
| @@ -137,7 +137,7 @@ extern struct workqueue_struct *netxen_workq; | |||
| 137 | #define THIRD_PAGE_GROUP_SIZE THIRD_PAGE_GROUP_END - THIRD_PAGE_GROUP_START | 137 | #define THIRD_PAGE_GROUP_SIZE THIRD_PAGE_GROUP_END - THIRD_PAGE_GROUP_START |
| 138 | 138 | ||
| 139 | #define MAX_RX_BUFFER_LENGTH 1760 | 139 | #define MAX_RX_BUFFER_LENGTH 1760 |
| 140 | #define MAX_RX_JUMBO_BUFFER_LENGTH 9046 | 140 | #define MAX_RX_JUMBO_BUFFER_LENGTH 8062 |
| 141 | #define MAX_RX_LRO_BUFFER_LENGTH ((48*1024)-512) | 141 | #define MAX_RX_LRO_BUFFER_LENGTH ((48*1024)-512) |
| 142 | #define RX_DMA_MAP_LEN (MAX_RX_BUFFER_LENGTH - 2) | 142 | #define RX_DMA_MAP_LEN (MAX_RX_BUFFER_LENGTH - 2) |
| 143 | #define RX_JUMBO_DMA_MAP_LEN \ | 143 | #define RX_JUMBO_DMA_MAP_LEN \ |
| @@ -199,9 +199,9 @@ enum { | |||
| 199 | (RCV_DESC_NORMAL))) | 199 | (RCV_DESC_NORMAL))) |
| 200 | 200 | ||
| 201 | #define MAX_CMD_DESCRIPTORS 1024 | 201 | #define MAX_CMD_DESCRIPTORS 1024 |
| 202 | #define MAX_RCV_DESCRIPTORS 32768 | 202 | #define MAX_RCV_DESCRIPTORS 16384 |
| 203 | #define MAX_JUMBO_RCV_DESCRIPTORS 4096 | 203 | #define MAX_JUMBO_RCV_DESCRIPTORS 1024 |
| 204 | #define MAX_LRO_RCV_DESCRIPTORS 2048 | 204 | #define MAX_LRO_RCV_DESCRIPTORS 64 |
| 205 | #define MAX_RCVSTATUS_DESCRIPTORS MAX_RCV_DESCRIPTORS | 205 | #define MAX_RCVSTATUS_DESCRIPTORS MAX_RCV_DESCRIPTORS |
| 206 | #define MAX_JUMBO_RCV_DESC MAX_JUMBO_RCV_DESCRIPTORS | 206 | #define MAX_JUMBO_RCV_DESC MAX_JUMBO_RCV_DESCRIPTORS |
| 207 | #define MAX_RCV_DESC MAX_RCV_DESCRIPTORS | 207 | #define MAX_RCV_DESC MAX_RCV_DESCRIPTORS |
| @@ -852,8 +852,6 @@ struct netxen_adapter { | |||
| 852 | spinlock_t tx_lock; | 852 | spinlock_t tx_lock; |
| 853 | spinlock_t lock; | 853 | spinlock_t lock; |
| 854 | struct work_struct watchdog_task; | 854 | struct work_struct watchdog_task; |
| 855 | struct work_struct tx_timeout_task; | ||
| 856 | struct net_device *netdev; | ||
| 857 | struct timer_list watchdog_timer; | 855 | struct timer_list watchdog_timer; |
| 858 | 856 | ||
| 859 | u32 curr_window; | 857 | u32 curr_window; |
| @@ -887,7 +885,6 @@ struct netxen_adapter { | |||
| 887 | struct netxen_recv_context recv_ctx[MAX_RCV_CTX]; | 885 | struct netxen_recv_context recv_ctx[MAX_RCV_CTX]; |
| 888 | 886 | ||
| 889 | int is_up; | 887 | int is_up; |
| 890 | int number; | ||
| 891 | struct netxen_dummy_dma dummy_dma; | 888 | struct netxen_dummy_dma dummy_dma; |
| 892 | 889 | ||
| 893 | /* Context interface shared between card and host */ | 890 | /* Context interface shared between card and host */ |
| @@ -950,6 +947,7 @@ struct netxen_port { | |||
| 950 | struct pci_dev *pdev; | 947 | struct pci_dev *pdev; |
| 951 | struct net_device_stats net_stats; | 948 | struct net_device_stats net_stats; |
| 952 | struct netxen_port_stats stats; | 949 | struct netxen_port_stats stats; |
| 950 | struct work_struct tx_timeout_task; | ||
| 953 | }; | 951 | }; |
| 954 | 952 | ||
| 955 | #define PCI_OFFSET_FIRST_RANGE(adapter, off) \ | 953 | #define PCI_OFFSET_FIRST_RANGE(adapter, off) \ |
diff --git a/drivers/net/netxen/netxen_nic_hw.c b/drivers/net/netxen/netxen_nic_hw.c index 5dac50c87075..c0c31d1914a7 100644 --- a/drivers/net/netxen/netxen_nic_hw.c +++ b/drivers/net/netxen/netxen_nic_hw.c | |||
| @@ -376,7 +376,7 @@ void netxen_tso_check(struct netxen_adapter *adapter, | |||
| 376 | ((skb->nh.iph)->ihl * sizeof(u32)) + | 376 | ((skb->nh.iph)->ihl * sizeof(u32)) + |
| 377 | ((skb->h.th)->doff * sizeof(u32)); | 377 | ((skb->h.th)->doff * sizeof(u32)); |
| 378 | netxen_set_cmd_desc_opcode(desc, TX_TCP_LSO); | 378 | netxen_set_cmd_desc_opcode(desc, TX_TCP_LSO); |
| 379 | } else if (skb->ip_summed == CHECKSUM_COMPLETE) { | 379 | } else if (skb->ip_summed == CHECKSUM_PARTIAL) { |
| 380 | if (skb->nh.iph->protocol == IPPROTO_TCP) { | 380 | if (skb->nh.iph->protocol == IPPROTO_TCP) { |
| 381 | netxen_set_cmd_desc_opcode(desc, TX_TCP_PKT); | 381 | netxen_set_cmd_desc_opcode(desc, TX_TCP_PKT); |
| 382 | } else if (skb->nh.iph->protocol == IPPROTO_UDP) { | 382 | } else if (skb->nh.iph->protocol == IPPROTO_UDP) { |
diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c index deacc61e199c..c3e41f368554 100644 --- a/drivers/net/netxen/netxen_nic_init.c +++ b/drivers/net/netxen/netxen_nic_init.c | |||
| @@ -927,7 +927,7 @@ u32 netxen_process_rcv_ring(struct netxen_adapter *adapter, int ctxid, int max) | |||
| 927 | } | 927 | } |
| 928 | netxen_process_rcv(adapter, ctxid, desc); | 928 | netxen_process_rcv(adapter, ctxid, desc); |
| 929 | netxen_clear_sts_owner(desc); | 929 | netxen_clear_sts_owner(desc); |
| 930 | netxen_set_sts_owner(desc, STATUS_OWNER_PHANTOM); | 930 | netxen_set_sts_owner(desc, cpu_to_le16(STATUS_OWNER_PHANTOM)); |
| 931 | consumer = (consumer + 1) & (adapter->max_rx_desc_count - 1); | 931 | consumer = (consumer + 1) & (adapter->max_rx_desc_count - 1); |
| 932 | count++; | 932 | count++; |
| 933 | } | 933 | } |
| @@ -1022,7 +1022,7 @@ int netxen_process_cmd_ring(unsigned long data) | |||
| 1022 | && netif_carrier_ok(port->netdev)) | 1022 | && netif_carrier_ok(port->netdev)) |
| 1023 | && ((jiffies - port->netdev->trans_start) > | 1023 | && ((jiffies - port->netdev->trans_start) > |
| 1024 | port->netdev->watchdog_timeo)) { | 1024 | port->netdev->watchdog_timeo)) { |
| 1025 | SCHEDULE_WORK(&port->adapter->tx_timeout_task); | 1025 | SCHEDULE_WORK(&port->tx_timeout_task); |
| 1026 | } | 1026 | } |
| 1027 | 1027 | ||
| 1028 | last_consumer = get_next_index(last_consumer, | 1028 | last_consumer = get_next_index(last_consumer, |
| @@ -1137,13 +1137,13 @@ void netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ctx, u32 ringid) | |||
| 1137 | */ | 1137 | */ |
| 1138 | dma = pci_map_single(pdev, skb->data, rcv_desc->dma_size, | 1138 | dma = pci_map_single(pdev, skb->data, rcv_desc->dma_size, |
| 1139 | PCI_DMA_FROMDEVICE); | 1139 | PCI_DMA_FROMDEVICE); |
| 1140 | pdesc->addr_buffer = dma; | 1140 | pdesc->addr_buffer = cpu_to_le64(dma); |
| 1141 | buffer->skb = skb; | 1141 | buffer->skb = skb; |
| 1142 | buffer->state = NETXEN_BUFFER_BUSY; | 1142 | buffer->state = NETXEN_BUFFER_BUSY; |
| 1143 | buffer->dma = dma; | 1143 | buffer->dma = dma; |
| 1144 | /* make a rcv descriptor */ | 1144 | /* make a rcv descriptor */ |
| 1145 | pdesc->reference_handle = buffer->ref_handle; | 1145 | pdesc->reference_handle = cpu_to_le16(buffer->ref_handle); |
| 1146 | pdesc->buffer_length = rcv_desc->dma_size; | 1146 | pdesc->buffer_length = cpu_to_le32(rcv_desc->dma_size); |
| 1147 | DPRINTK(INFO, "done writing descripter\n"); | 1147 | DPRINTK(INFO, "done writing descripter\n"); |
| 1148 | producer = | 1148 | producer = |
| 1149 | get_next_index(producer, rcv_desc->max_rx_desc_count); | 1149 | get_next_index(producer, rcv_desc->max_rx_desc_count); |
| @@ -1231,8 +1231,8 @@ void netxen_post_rx_buffers_nodb(struct netxen_adapter *adapter, uint32_t ctx, | |||
| 1231 | PCI_DMA_FROMDEVICE); | 1231 | PCI_DMA_FROMDEVICE); |
| 1232 | 1232 | ||
| 1233 | /* make a rcv descriptor */ | 1233 | /* make a rcv descriptor */ |
| 1234 | pdesc->reference_handle = le16_to_cpu(buffer->ref_handle); | 1234 | pdesc->reference_handle = cpu_to_le16(buffer->ref_handle); |
| 1235 | pdesc->buffer_length = le16_to_cpu(rcv_desc->dma_size); | 1235 | pdesc->buffer_length = cpu_to_le16(rcv_desc->dma_size); |
| 1236 | pdesc->addr_buffer = cpu_to_le64(buffer->dma); | 1236 | pdesc->addr_buffer = cpu_to_le64(buffer->dma); |
| 1237 | DPRINTK(INFO, "done writing descripter\n"); | 1237 | DPRINTK(INFO, "done writing descripter\n"); |
| 1238 | producer = | 1238 | producer = |
diff --git a/drivers/net/netxen/netxen_nic_isr.c b/drivers/net/netxen/netxen_nic_isr.c index 1b45f50fa6aa..06847d4252c3 100644 --- a/drivers/net/netxen/netxen_nic_isr.c +++ b/drivers/net/netxen/netxen_nic_isr.c | |||
| @@ -157,7 +157,8 @@ void netxen_nic_isr_other(struct netxen_adapter *adapter) | |||
| 157 | for (portno = 0; portno < NETXEN_NIU_MAX_GBE_PORTS; portno++) { | 157 | for (portno = 0; portno < NETXEN_NIU_MAX_GBE_PORTS; portno++) { |
| 158 | linkup = val & 1; | 158 | linkup = val & 1; |
| 159 | if (linkup != (qg_linksup & 1)) { | 159 | if (linkup != (qg_linksup & 1)) { |
| 160 | printk(KERN_INFO "%s: PORT %d link %s\n", | 160 | printk(KERN_INFO "%s: %s PORT %d link %s\n", |
| 161 | adapter->port[portno]->netdev->name, | ||
| 161 | netxen_nic_driver_name, portno, | 162 | netxen_nic_driver_name, portno, |
| 162 | ((linkup == 0) ? "down" : "up")); | 163 | ((linkup == 0) ? "down" : "up")); |
| 163 | netxen_indicate_link_status(adapter, portno, linkup); | 164 | netxen_indicate_link_status(adapter, portno, linkup); |
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index 1658ca1fa230..8a5792fea774 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
| @@ -52,8 +52,6 @@ char netxen_nic_driver_name[] = "netxen-nic"; | |||
| 52 | static char netxen_nic_driver_string[] = "NetXen Network Driver version " | 52 | static char netxen_nic_driver_string[] = "NetXen Network Driver version " |
| 53 | NETXEN_NIC_LINUX_VERSIONID; | 53 | NETXEN_NIC_LINUX_VERSIONID; |
| 54 | 54 | ||
| 55 | struct netxen_adapter *g_adapter = NULL; | ||
| 56 | |||
| 57 | #define NETXEN_NETDEV_WEIGHT 120 | 55 | #define NETXEN_NETDEV_WEIGHT 120 |
| 58 | #define NETXEN_ADAPTER_UP_MAGIC 777 | 56 | #define NETXEN_ADAPTER_UP_MAGIC 777 |
| 59 | #define NETXEN_NIC_PEG_TUNE 0 | 57 | #define NETXEN_NIC_PEG_TUNE 0 |
| @@ -87,6 +85,8 @@ static struct pci_device_id netxen_pci_tbl[] __devinitdata = { | |||
| 87 | {PCI_DEVICE(0x4040, 0x0003)}, | 85 | {PCI_DEVICE(0x4040, 0x0003)}, |
| 88 | {PCI_DEVICE(0x4040, 0x0004)}, | 86 | {PCI_DEVICE(0x4040, 0x0004)}, |
| 89 | {PCI_DEVICE(0x4040, 0x0005)}, | 87 | {PCI_DEVICE(0x4040, 0x0005)}, |
| 88 | {PCI_DEVICE(0x4040, 0x0024)}, | ||
| 89 | {PCI_DEVICE(0x4040, 0x0025)}, | ||
| 90 | {0,} | 90 | {0,} |
| 91 | }; | 91 | }; |
| 92 | 92 | ||
| @@ -126,7 +126,6 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 126 | struct netxen_cmd_buffer *cmd_buf_arr = NULL; | 126 | struct netxen_cmd_buffer *cmd_buf_arr = NULL; |
| 127 | u64 mac_addr[FLASH_NUM_PORTS + 1]; | 127 | u64 mac_addr[FLASH_NUM_PORTS + 1]; |
| 128 | int valid_mac = 0; | 128 | int valid_mac = 0; |
| 129 | static int netxen_cards_found = 0; | ||
| 130 | 129 | ||
| 131 | printk(KERN_INFO "%s \n", netxen_nic_driver_string); | 130 | printk(KERN_INFO "%s \n", netxen_nic_driver_string); |
| 132 | /* In current scheme, we use only PCI function 0 */ | 131 | /* In current scheme, we use only PCI function 0 */ |
| @@ -217,9 +216,6 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 217 | goto err_out_dbunmap; | 216 | goto err_out_dbunmap; |
| 218 | } | 217 | } |
| 219 | 218 | ||
| 220 | if (netxen_cards_found == 0) { | ||
| 221 | g_adapter = adapter; | ||
| 222 | } | ||
| 223 | adapter->max_tx_desc_count = MAX_CMD_DESCRIPTORS; | 219 | adapter->max_tx_desc_count = MAX_CMD_DESCRIPTORS; |
| 224 | adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS; | 220 | adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS; |
| 225 | adapter->max_jumbo_rx_desc_count = MAX_JUMBO_RCV_DESCRIPTORS; | 221 | adapter->max_jumbo_rx_desc_count = MAX_JUMBO_RCV_DESCRIPTORS; |
| @@ -424,8 +420,7 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 424 | netdev->dev_addr); | 420 | netdev->dev_addr); |
| 425 | } | 421 | } |
| 426 | } | 422 | } |
| 427 | adapter->netdev = netdev; | 423 | INIT_WORK(&port->tx_timeout_task, netxen_tx_timeout_task); |
| 428 | INIT_WORK(&adapter->tx_timeout_task, netxen_tx_timeout_task); | ||
| 429 | netif_carrier_off(netdev); | 424 | netif_carrier_off(netdev); |
| 430 | netif_stop_queue(netdev); | 425 | netif_stop_queue(netdev); |
| 431 | 426 | ||
| @@ -440,6 +435,11 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 440 | adapter->port[i] = port; | 435 | adapter->port[i] = port; |
| 441 | } | 436 | } |
| 442 | 437 | ||
| 438 | writel(0, NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE)); | ||
| 439 | netxen_pinit_from_rom(adapter, 0); | ||
| 440 | udelay(500); | ||
| 441 | netxen_load_firmware(adapter); | ||
| 442 | netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE); | ||
| 443 | /* | 443 | /* |
| 444 | * delay a while to ensure that the Pegs are up & running. | 444 | * delay a while to ensure that the Pegs are up & running. |
| 445 | * Otherwise, we might see some flaky behaviour. | 445 | * Otherwise, we might see some flaky behaviour. |
| @@ -457,7 +457,6 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 457 | break; | 457 | break; |
| 458 | } | 458 | } |
| 459 | 459 | ||
| 460 | adapter->number = netxen_cards_found; | ||
| 461 | adapter->driver_mismatch = 0; | 460 | adapter->driver_mismatch = 0; |
| 462 | 461 | ||
| 463 | return 0; | 462 | return 0; |
| @@ -527,6 +526,8 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev) | |||
| 527 | 526 | ||
| 528 | netxen_nic_stop_all_ports(adapter); | 527 | netxen_nic_stop_all_ports(adapter); |
| 529 | /* leave the hw in the same state as reboot */ | 528 | /* leave the hw in the same state as reboot */ |
| 529 | netxen_pinit_from_rom(adapter, 0); | ||
| 530 | writel(0, NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE)); | ||
| 530 | netxen_load_firmware(adapter); | 531 | netxen_load_firmware(adapter); |
| 531 | netxen_free_adapter_offload(adapter); | 532 | netxen_free_adapter_offload(adapter); |
| 532 | 533 | ||
| @@ -817,8 +818,8 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
| 817 | /* Take skb->data itself */ | 818 | /* Take skb->data itself */ |
| 818 | pbuf = &adapter->cmd_buf_arr[producer]; | 819 | pbuf = &adapter->cmd_buf_arr[producer]; |
| 819 | if ((netdev->features & NETIF_F_TSO) && skb_shinfo(skb)->gso_size > 0) { | 820 | if ((netdev->features & NETIF_F_TSO) && skb_shinfo(skb)->gso_size > 0) { |
| 820 | pbuf->mss = skb_shinfo(skb)->gso_size; | 821 | pbuf->mss = cpu_to_le16(skb_shinfo(skb)->gso_size); |
| 821 | hwdesc->mss = skb_shinfo(skb)->gso_size; | 822 | hwdesc->mss = cpu_to_le16(skb_shinfo(skb)->gso_size); |
| 822 | } else { | 823 | } else { |
| 823 | pbuf->mss = 0; | 824 | pbuf->mss = 0; |
| 824 | hwdesc->mss = 0; | 825 | hwdesc->mss = 0; |
| @@ -952,11 +953,6 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
| 952 | static void netxen_watchdog(unsigned long v) | 953 | static void netxen_watchdog(unsigned long v) |
| 953 | { | 954 | { |
| 954 | struct netxen_adapter *adapter = (struct netxen_adapter *)v; | 955 | struct netxen_adapter *adapter = (struct netxen_adapter *)v; |
| 955 | if (adapter != g_adapter) { | ||
| 956 | printk("%s: ***BUG*** adapter[%p] != g_adapter[%p]\n", | ||
| 957 | __FUNCTION__, adapter, g_adapter); | ||
| 958 | return; | ||
| 959 | } | ||
| 960 | 956 | ||
| 961 | SCHEDULE_WORK(&adapter->watchdog_task); | 957 | SCHEDULE_WORK(&adapter->watchdog_task); |
| 962 | } | 958 | } |
| @@ -965,23 +961,23 @@ static void netxen_tx_timeout(struct net_device *netdev) | |||
| 965 | { | 961 | { |
| 966 | struct netxen_port *port = (struct netxen_port *)netdev_priv(netdev); | 962 | struct netxen_port *port = (struct netxen_port *)netdev_priv(netdev); |
| 967 | 963 | ||
| 968 | SCHEDULE_WORK(&port->adapter->tx_timeout_task); | 964 | SCHEDULE_WORK(&port->tx_timeout_task); |
| 969 | } | 965 | } |
| 970 | 966 | ||
| 971 | static void netxen_tx_timeout_task(struct work_struct *work) | 967 | static void netxen_tx_timeout_task(struct work_struct *work) |
| 972 | { | 968 | { |
| 973 | struct netxen_adapter *adapter = | 969 | struct netxen_port *port = |
| 974 | container_of(work, struct netxen_adapter, tx_timeout_task); | 970 | container_of(work, struct netxen_port, tx_timeout_task); |
| 975 | struct net_device *netdev = adapter->netdev; | 971 | struct net_device *netdev = port->netdev; |
| 976 | unsigned long flags; | 972 | unsigned long flags; |
| 977 | 973 | ||
| 978 | printk(KERN_ERR "%s %s: transmit timeout, resetting.\n", | 974 | printk(KERN_ERR "%s %s: transmit timeout, resetting.\n", |
| 979 | netxen_nic_driver_name, netdev->name); | 975 | netxen_nic_driver_name, netdev->name); |
| 980 | 976 | ||
| 981 | spin_lock_irqsave(&adapter->lock, flags); | 977 | spin_lock_irqsave(&port->adapter->lock, flags); |
| 982 | netxen_nic_close(netdev); | 978 | netxen_nic_close(netdev); |
| 983 | netxen_nic_open(netdev); | 979 | netxen_nic_open(netdev); |
| 984 | spin_unlock_irqrestore(&adapter->lock, flags); | 980 | spin_unlock_irqrestore(&port->adapter->lock, flags); |
| 985 | netdev->trans_start = jiffies; | 981 | netdev->trans_start = jiffies; |
| 986 | netif_wake_queue(netdev); | 982 | netif_wake_queue(netdev); |
| 987 | } | 983 | } |
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index f83b41d4cb0e..577babd4c938 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c | |||
| @@ -225,7 +225,6 @@ MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl); | |||
| 225 | 225 | ||
| 226 | static int rx_copybreak = 200; | 226 | static int rx_copybreak = 200; |
| 227 | static int use_dac; | 227 | static int use_dac; |
| 228 | static int ignore_parity_err; | ||
| 229 | static struct { | 228 | static struct { |
| 230 | u32 msg_enable; | 229 | u32 msg_enable; |
| 231 | } debug = { -1 }; | 230 | } debug = { -1 }; |
| @@ -471,8 +470,6 @@ module_param(use_dac, int, 0); | |||
| 471 | MODULE_PARM_DESC(use_dac, "Enable PCI DAC. Unsafe on 32 bit PCI slot."); | 470 | MODULE_PARM_DESC(use_dac, "Enable PCI DAC. Unsafe on 32 bit PCI slot."); |
| 472 | module_param_named(debug, debug.msg_enable, int, 0); | 471 | module_param_named(debug, debug.msg_enable, int, 0); |
| 473 | MODULE_PARM_DESC(debug, "Debug verbosity level (0=none, ..., 16=all)"); | 472 | MODULE_PARM_DESC(debug, "Debug verbosity level (0=none, ..., 16=all)"); |
| 474 | module_param_named(ignore_parity_err, ignore_parity_err, bool, 0); | ||
| 475 | MODULE_PARM_DESC(ignore_parity_err, "Ignore PCI parity error as target. Default: false"); | ||
| 476 | MODULE_LICENSE("GPL"); | 473 | MODULE_LICENSE("GPL"); |
| 477 | MODULE_VERSION(RTL8169_VERSION); | 474 | MODULE_VERSION(RTL8169_VERSION); |
| 478 | 475 | ||
| @@ -1885,7 +1882,6 @@ static void rtl8169_hw_start(struct net_device *dev) | |||
| 1885 | (tp->mac_version == RTL_GIGA_MAC_VER_02) || | 1882 | (tp->mac_version == RTL_GIGA_MAC_VER_02) || |
| 1886 | (tp->mac_version == RTL_GIGA_MAC_VER_03) || | 1883 | (tp->mac_version == RTL_GIGA_MAC_VER_03) || |
| 1887 | (tp->mac_version == RTL_GIGA_MAC_VER_04)) | 1884 | (tp->mac_version == RTL_GIGA_MAC_VER_04)) |
| 1888 | RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb); | ||
| 1889 | rtl8169_set_rx_tx_config_registers(tp); | 1885 | rtl8169_set_rx_tx_config_registers(tp); |
| 1890 | 1886 | ||
| 1891 | cmd = RTL_R16(CPlusCmd); | 1887 | cmd = RTL_R16(CPlusCmd); |
| @@ -2388,7 +2384,7 @@ static void rtl8169_pcierr_interrupt(struct net_device *dev) | |||
| 2388 | * | 2384 | * |
| 2389 | * Feel free to adjust to your needs. | 2385 | * Feel free to adjust to your needs. |
| 2390 | */ | 2386 | */ |
| 2391 | if (ignore_parity_err) | 2387 | if (pdev->broken_parity_status) |
| 2392 | pci_cmd &= ~PCI_COMMAND_PARITY; | 2388 | pci_cmd &= ~PCI_COMMAND_PARITY; |
| 2393 | else | 2389 | else |
| 2394 | pci_cmd |= PCI_COMMAND_SERR | PCI_COMMAND_PARITY; | 2390 | pci_cmd |= PCI_COMMAND_SERR | PCI_COMMAND_PARITY; |
diff --git a/drivers/net/skge.c b/drivers/net/skge.c index 8a39376f87dc..deedfd5f8226 100644 --- a/drivers/net/skge.c +++ b/drivers/net/skge.c | |||
| @@ -2920,6 +2920,7 @@ static int skge_poll(struct net_device *dev, int *budget) | |||
| 2920 | struct skge_hw *hw = skge->hw; | 2920 | struct skge_hw *hw = skge->hw; |
| 2921 | struct skge_ring *ring = &skge->rx_ring; | 2921 | struct skge_ring *ring = &skge->rx_ring; |
| 2922 | struct skge_element *e; | 2922 | struct skge_element *e; |
| 2923 | unsigned long flags; | ||
| 2923 | int to_do = min(dev->quota, *budget); | 2924 | int to_do = min(dev->quota, *budget); |
| 2924 | int work_done = 0; | 2925 | int work_done = 0; |
| 2925 | 2926 | ||
| @@ -2957,12 +2958,12 @@ static int skge_poll(struct net_device *dev, int *budget) | |||
| 2957 | if (work_done >= to_do) | 2958 | if (work_done >= to_do) |
| 2958 | return 1; /* not done */ | 2959 | return 1; /* not done */ |
| 2959 | 2960 | ||
| 2960 | spin_lock_irq(&hw->hw_lock); | 2961 | spin_lock_irqsave(&hw->hw_lock, flags); |
| 2961 | __netif_rx_complete(dev); | 2962 | __netif_rx_complete(dev); |
| 2962 | hw->intr_mask |= irqmask[skge->port]; | 2963 | hw->intr_mask |= irqmask[skge->port]; |
| 2963 | skge_write32(hw, B0_IMSK, hw->intr_mask); | 2964 | skge_write32(hw, B0_IMSK, hw->intr_mask); |
| 2964 | skge_read32(hw, B0_IMSK); | 2965 | skge_read32(hw, B0_IMSK); |
| 2965 | spin_unlock_irq(&hw->hw_lock); | 2966 | spin_unlock_irqrestore(&hw->hw_lock, flags); |
| 2966 | 2967 | ||
| 2967 | return 0; | 2968 | return 0; |
| 2968 | } | 2969 | } |
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index fb1d2c30c1bb..a6601e8d423c 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
| @@ -569,8 +569,8 @@ static void sky2_phy_power(struct sky2_hw *hw, unsigned port, int onoff) | |||
| 569 | if (hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev > 1) | 569 | if (hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev > 1) |
| 570 | onoff = !onoff; | 570 | onoff = !onoff; |
| 571 | 571 | ||
| 572 | sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON); | ||
| 572 | reg1 = sky2_pci_read32(hw, PCI_DEV_REG1); | 573 | reg1 = sky2_pci_read32(hw, PCI_DEV_REG1); |
| 573 | |||
| 574 | if (onoff) | 574 | if (onoff) |
| 575 | /* Turn off phy power saving */ | 575 | /* Turn off phy power saving */ |
| 576 | reg1 &= ~phy_power[port]; | 576 | reg1 &= ~phy_power[port]; |
| @@ -579,6 +579,7 @@ static void sky2_phy_power(struct sky2_hw *hw, unsigned port, int onoff) | |||
| 579 | 579 | ||
| 580 | sky2_pci_write32(hw, PCI_DEV_REG1, reg1); | 580 | sky2_pci_write32(hw, PCI_DEV_REG1, reg1); |
| 581 | sky2_pci_read32(hw, PCI_DEV_REG1); | 581 | sky2_pci_read32(hw, PCI_DEV_REG1); |
| 582 | sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF); | ||
| 582 | udelay(100); | 583 | udelay(100); |
| 583 | } | 584 | } |
| 584 | 585 | ||
| @@ -1511,6 +1512,13 @@ static int sky2_down(struct net_device *dev) | |||
| 1511 | imask &= ~portirq_msk[port]; | 1512 | imask &= ~portirq_msk[port]; |
| 1512 | sky2_write32(hw, B0_IMSK, imask); | 1513 | sky2_write32(hw, B0_IMSK, imask); |
| 1513 | 1514 | ||
| 1515 | /* | ||
| 1516 | * Both ports share the NAPI poll on port 0, so if necessary undo the | ||
| 1517 | * the disable that is done in dev_close. | ||
| 1518 | */ | ||
| 1519 | if (sky2->port == 0 && hw->ports > 1) | ||
| 1520 | netif_poll_enable(dev); | ||
| 1521 | |||
| 1514 | sky2_gmac_reset(hw, port); | 1522 | sky2_gmac_reset(hw, port); |
| 1515 | 1523 | ||
| 1516 | /* Stop transmitter */ | 1524 | /* Stop transmitter */ |
| @@ -3631,6 +3639,29 @@ static int sky2_resume(struct pci_dev *pdev) | |||
| 3631 | out: | 3639 | out: |
| 3632 | return err; | 3640 | return err; |
| 3633 | } | 3641 | } |
| 3642 | |||
| 3643 | /* BIOS resume runs after device (it's a bug in PM) | ||
| 3644 | * as a temporary workaround on suspend/resume leave MSI disabled | ||
| 3645 | */ | ||
| 3646 | static int sky2_suspend_late(struct pci_dev *pdev, pm_message_t state) | ||
| 3647 | { | ||
| 3648 | struct sky2_hw *hw = pci_get_drvdata(pdev); | ||
| 3649 | |||
| 3650 | free_irq(pdev->irq, hw); | ||
| 3651 | if (hw->msi) { | ||
| 3652 | pci_disable_msi(pdev); | ||
| 3653 | hw->msi = 0; | ||
| 3654 | } | ||
| 3655 | return 0; | ||
| 3656 | } | ||
| 3657 | |||
| 3658 | static int sky2_resume_early(struct pci_dev *pdev) | ||
| 3659 | { | ||
| 3660 | struct sky2_hw *hw = pci_get_drvdata(pdev); | ||
| 3661 | struct net_device *dev = hw->dev[0]; | ||
| 3662 | |||
| 3663 | return request_irq(pdev->irq, sky2_intr, IRQF_SHARED, dev->name, hw); | ||
| 3664 | } | ||
| 3634 | #endif | 3665 | #endif |
| 3635 | 3666 | ||
| 3636 | static struct pci_driver sky2_driver = { | 3667 | static struct pci_driver sky2_driver = { |
| @@ -3641,6 +3672,8 @@ static struct pci_driver sky2_driver = { | |||
| 3641 | #ifdef CONFIG_PM | 3672 | #ifdef CONFIG_PM |
| 3642 | .suspend = sky2_suspend, | 3673 | .suspend = sky2_suspend, |
| 3643 | .resume = sky2_resume, | 3674 | .resume = sky2_resume, |
| 3675 | .suspend_late = sky2_suspend_late, | ||
| 3676 | .resume_early = sky2_resume_early, | ||
| 3644 | #endif | 3677 | #endif |
| 3645 | }; | 3678 | }; |
| 3646 | 3679 | ||
diff --git a/drivers/net/via-velocity.c b/drivers/net/via-velocity.c index 4587f23f4e4b..8e5d82051bd4 100644 --- a/drivers/net/via-velocity.c +++ b/drivers/net/via-velocity.c | |||
| @@ -265,15 +265,19 @@ static int velocity_set_media_mode(struct velocity_info *vptr, u32 mii_status); | |||
| 265 | static int velocity_suspend(struct pci_dev *pdev, pm_message_t state); | 265 | static int velocity_suspend(struct pci_dev *pdev, pm_message_t state); |
| 266 | static int velocity_resume(struct pci_dev *pdev); | 266 | static int velocity_resume(struct pci_dev *pdev); |
| 267 | 267 | ||
| 268 | static DEFINE_SPINLOCK(velocity_dev_list_lock); | ||
| 269 | static LIST_HEAD(velocity_dev_list); | ||
| 270 | |||
| 271 | #endif | ||
| 272 | |||
| 273 | #if defined(CONFIG_PM) && defined(CONFIG_INET) | ||
| 274 | |||
| 268 | static int velocity_netdev_event(struct notifier_block *nb, unsigned long notification, void *ptr); | 275 | static int velocity_netdev_event(struct notifier_block *nb, unsigned long notification, void *ptr); |
| 269 | 276 | ||
| 270 | static struct notifier_block velocity_inetaddr_notifier = { | 277 | static struct notifier_block velocity_inetaddr_notifier = { |
| 271 | .notifier_call = velocity_netdev_event, | 278 | .notifier_call = velocity_netdev_event, |
| 272 | }; | 279 | }; |
| 273 | 280 | ||
| 274 | static DEFINE_SPINLOCK(velocity_dev_list_lock); | ||
| 275 | static LIST_HEAD(velocity_dev_list); | ||
| 276 | |||
| 277 | static void velocity_register_notifier(void) | 281 | static void velocity_register_notifier(void) |
| 278 | { | 282 | { |
| 279 | register_inetaddr_notifier(&velocity_inetaddr_notifier); | 283 | register_inetaddr_notifier(&velocity_inetaddr_notifier); |
| @@ -284,12 +288,12 @@ static void velocity_unregister_notifier(void) | |||
| 284 | unregister_inetaddr_notifier(&velocity_inetaddr_notifier); | 288 | unregister_inetaddr_notifier(&velocity_inetaddr_notifier); |
| 285 | } | 289 | } |
| 286 | 290 | ||
| 287 | #else /* CONFIG_PM */ | 291 | #else |
| 288 | 292 | ||
| 289 | #define velocity_register_notifier() do {} while (0) | 293 | #define velocity_register_notifier() do {} while (0) |
| 290 | #define velocity_unregister_notifier() do {} while (0) | 294 | #define velocity_unregister_notifier() do {} while (0) |
| 291 | 295 | ||
| 292 | #endif /* !CONFIG_PM */ | 296 | #endif |
| 293 | 297 | ||
| 294 | /* | 298 | /* |
| 295 | * Internal board variants. At the moment we have only one | 299 | * Internal board variants. At the moment we have only one |
| @@ -3292,6 +3296,8 @@ static int velocity_resume(struct pci_dev *pdev) | |||
| 3292 | return 0; | 3296 | return 0; |
| 3293 | } | 3297 | } |
| 3294 | 3298 | ||
| 3299 | #ifdef CONFIG_INET | ||
| 3300 | |||
| 3295 | static int velocity_netdev_event(struct notifier_block *nb, unsigned long notification, void *ptr) | 3301 | static int velocity_netdev_event(struct notifier_block *nb, unsigned long notification, void *ptr) |
| 3296 | { | 3302 | { |
| 3297 | struct in_ifaddr *ifa = (struct in_ifaddr *) ptr; | 3303 | struct in_ifaddr *ifa = (struct in_ifaddr *) ptr; |
| @@ -3312,4 +3318,6 @@ static int velocity_netdev_event(struct notifier_block *nb, unsigned long notifi | |||
| 3312 | } | 3318 | } |
| 3313 | return NOTIFY_DONE; | 3319 | return NOTIFY_DONE; |
| 3314 | } | 3320 | } |
| 3321 | |||
| 3322 | #endif | ||
| 3315 | #endif | 3323 | #endif |
diff --git a/drivers/net/wireless/zd1211rw/zd_mac.c b/drivers/net/wireless/zd1211rw/zd_mac.c index 00ca704ece35..a08524191b5d 100644 --- a/drivers/net/wireless/zd1211rw/zd_mac.c +++ b/drivers/net/wireless/zd1211rw/zd_mac.c | |||
| @@ -41,6 +41,8 @@ static void housekeeping_disable(struct zd_mac *mac); | |||
| 41 | 41 | ||
| 42 | static void set_multicast_hash_handler(struct work_struct *work); | 42 | static void set_multicast_hash_handler(struct work_struct *work); |
| 43 | 43 | ||
| 44 | static void do_rx(unsigned long mac_ptr); | ||
| 45 | |||
| 44 | int zd_mac_init(struct zd_mac *mac, | 46 | int zd_mac_init(struct zd_mac *mac, |
| 45 | struct net_device *netdev, | 47 | struct net_device *netdev, |
| 46 | struct usb_interface *intf) | 48 | struct usb_interface *intf) |
| @@ -53,6 +55,10 @@ int zd_mac_init(struct zd_mac *mac, | |||
| 53 | INIT_DELAYED_WORK(&mac->set_rts_cts_work, set_rts_cts_work); | 55 | INIT_DELAYED_WORK(&mac->set_rts_cts_work, set_rts_cts_work); |
| 54 | INIT_DELAYED_WORK(&mac->set_basic_rates_work, set_basic_rates_work); | 56 | INIT_DELAYED_WORK(&mac->set_basic_rates_work, set_basic_rates_work); |
| 55 | 57 | ||
| 58 | skb_queue_head_init(&mac->rx_queue); | ||
| 59 | tasklet_init(&mac->rx_tasklet, do_rx, (unsigned long)mac); | ||
| 60 | tasklet_disable(&mac->rx_tasklet); | ||
| 61 | |||
| 56 | ieee_init(ieee); | 62 | ieee_init(ieee); |
| 57 | softmac_init(ieee80211_priv(netdev)); | 63 | softmac_init(ieee80211_priv(netdev)); |
| 58 | zd_chip_init(&mac->chip, netdev, intf); | 64 | zd_chip_init(&mac->chip, netdev, intf); |
| @@ -140,6 +146,8 @@ out: | |||
| 140 | void zd_mac_clear(struct zd_mac *mac) | 146 | void zd_mac_clear(struct zd_mac *mac) |
| 141 | { | 147 | { |
| 142 | flush_workqueue(zd_workqueue); | 148 | flush_workqueue(zd_workqueue); |
| 149 | skb_queue_purge(&mac->rx_queue); | ||
| 150 | tasklet_kill(&mac->rx_tasklet); | ||
| 143 | zd_chip_clear(&mac->chip); | 151 | zd_chip_clear(&mac->chip); |
| 144 | ZD_ASSERT(!spin_is_locked(&mac->lock)); | 152 | ZD_ASSERT(!spin_is_locked(&mac->lock)); |
| 145 | ZD_MEMCLEAR(mac, sizeof(struct zd_mac)); | 153 | ZD_MEMCLEAR(mac, sizeof(struct zd_mac)); |
| @@ -168,6 +176,8 @@ int zd_mac_open(struct net_device *netdev) | |||
| 168 | struct zd_chip *chip = &mac->chip; | 176 | struct zd_chip *chip = &mac->chip; |
| 169 | int r; | 177 | int r; |
| 170 | 178 | ||
| 179 | tasklet_enable(&mac->rx_tasklet); | ||
| 180 | |||
| 171 | r = zd_chip_enable_int(chip); | 181 | r = zd_chip_enable_int(chip); |
| 172 | if (r < 0) | 182 | if (r < 0) |
| 173 | goto out; | 183 | goto out; |
| @@ -218,6 +228,8 @@ int zd_mac_stop(struct net_device *netdev) | |||
| 218 | */ | 228 | */ |
| 219 | 229 | ||
| 220 | zd_chip_disable_rx(chip); | 230 | zd_chip_disable_rx(chip); |
| 231 | skb_queue_purge(&mac->rx_queue); | ||
| 232 | tasklet_disable(&mac->rx_tasklet); | ||
| 221 | housekeeping_disable(mac); | 233 | housekeeping_disable(mac); |
| 222 | ieee80211softmac_stop(netdev); | 234 | ieee80211softmac_stop(netdev); |
| 223 | 235 | ||
| @@ -470,13 +482,13 @@ static void bssinfo_change(struct net_device *netdev, u32 changes) | |||
| 470 | 482 | ||
| 471 | if (changes & IEEE80211SOFTMAC_BSSINFOCHG_RATES) { | 483 | if (changes & IEEE80211SOFTMAC_BSSINFOCHG_RATES) { |
| 472 | /* Set RTS rate to highest available basic rate */ | 484 | /* Set RTS rate to highest available basic rate */ |
| 473 | u8 rate = ieee80211softmac_highest_supported_rate(softmac, | 485 | u8 hi_rate = ieee80211softmac_highest_supported_rate(softmac, |
| 474 | &bssinfo->supported_rates, 1); | 486 | &bssinfo->supported_rates, 1); |
| 475 | rate = rate_to_zd_rate(rate); | 487 | hi_rate = rate_to_zd_rate(hi_rate); |
| 476 | 488 | ||
| 477 | spin_lock_irqsave(&mac->lock, flags); | 489 | spin_lock_irqsave(&mac->lock, flags); |
| 478 | if (rate != mac->rts_rate) { | 490 | if (hi_rate != mac->rts_rate) { |
| 479 | mac->rts_rate = rate; | 491 | mac->rts_rate = hi_rate; |
| 480 | need_set_rts_cts = 1; | 492 | need_set_rts_cts = 1; |
| 481 | } | 493 | } |
| 482 | spin_unlock_irqrestore(&mac->lock, flags); | 494 | spin_unlock_irqrestore(&mac->lock, flags); |
| @@ -1072,43 +1084,75 @@ static int fill_rx_stats(struct ieee80211_rx_stats *stats, | |||
| 1072 | return 0; | 1084 | return 0; |
| 1073 | } | 1085 | } |
| 1074 | 1086 | ||
| 1075 | int zd_mac_rx(struct zd_mac *mac, const u8 *buffer, unsigned int length) | 1087 | static void zd_mac_rx(struct zd_mac *mac, struct sk_buff *skb) |
| 1076 | { | 1088 | { |
| 1077 | int r; | 1089 | int r; |
| 1078 | struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac); | 1090 | struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac); |
| 1079 | struct ieee80211_rx_stats stats; | 1091 | struct ieee80211_rx_stats stats; |
| 1080 | const struct rx_status *status; | 1092 | const struct rx_status *status; |
| 1081 | struct sk_buff *skb; | ||
| 1082 | 1093 | ||
| 1083 | if (length < ZD_PLCP_HEADER_SIZE + IEEE80211_1ADDR_LEN + | 1094 | if (skb->len < ZD_PLCP_HEADER_SIZE + IEEE80211_1ADDR_LEN + |
| 1084 | IEEE80211_FCS_LEN + sizeof(struct rx_status)) | 1095 | IEEE80211_FCS_LEN + sizeof(struct rx_status)) |
| 1085 | return -EINVAL; | 1096 | { |
| 1097 | dev_dbg_f(zd_mac_dev(mac), "Packet with length %u to small.\n", | ||
| 1098 | skb->len); | ||
| 1099 | goto free_skb; | ||
| 1100 | } | ||
| 1086 | 1101 | ||
| 1087 | r = fill_rx_stats(&stats, &status, mac, buffer, length); | 1102 | r = fill_rx_stats(&stats, &status, mac, skb->data, skb->len); |
| 1088 | if (r) | 1103 | if (r) { |
| 1089 | return r; | 1104 | /* Only packets with rx errors are included here. */ |
| 1105 | goto free_skb; | ||
| 1106 | } | ||
| 1090 | 1107 | ||
| 1091 | length -= ZD_PLCP_HEADER_SIZE+IEEE80211_FCS_LEN+ | 1108 | __skb_pull(skb, ZD_PLCP_HEADER_SIZE); |
| 1092 | sizeof(struct rx_status); | 1109 | __skb_trim(skb, skb->len - |
| 1093 | buffer += ZD_PLCP_HEADER_SIZE; | 1110 | (IEEE80211_FCS_LEN + sizeof(struct rx_status))); |
| 1094 | 1111 | ||
| 1095 | update_qual_rssi(mac, buffer, length, stats.signal, stats.rssi); | 1112 | update_qual_rssi(mac, skb->data, skb->len, stats.signal, |
| 1113 | status->signal_strength); | ||
| 1096 | 1114 | ||
| 1097 | r = filter_rx(ieee, buffer, length, &stats); | 1115 | r = filter_rx(ieee, skb->data, skb->len, &stats); |
| 1098 | if (r <= 0) | 1116 | if (r <= 0) { |
| 1099 | return r; | 1117 | if (r < 0) |
| 1118 | dev_dbg_f(zd_mac_dev(mac), "Error in packet.\n"); | ||
| 1119 | goto free_skb; | ||
| 1120 | } | ||
| 1100 | 1121 | ||
| 1101 | skb = dev_alloc_skb(sizeof(struct zd_rt_hdr) + length); | ||
| 1102 | if (!skb) | ||
| 1103 | return -ENOMEM; | ||
| 1104 | if (ieee->iw_mode == IW_MODE_MONITOR) | 1122 | if (ieee->iw_mode == IW_MODE_MONITOR) |
| 1105 | fill_rt_header(skb_put(skb, sizeof(struct zd_rt_hdr)), mac, | 1123 | fill_rt_header(skb_push(skb, sizeof(struct zd_rt_hdr)), mac, |
| 1106 | &stats, status); | 1124 | &stats, status); |
| 1107 | memcpy(skb_put(skb, length), buffer, length); | ||
| 1108 | 1125 | ||
| 1109 | r = ieee80211_rx(ieee, skb, &stats); | 1126 | r = ieee80211_rx(ieee, skb, &stats); |
| 1110 | if (!r) | 1127 | if (r) |
| 1111 | dev_kfree_skb_any(skb); | 1128 | return; |
| 1129 | free_skb: | ||
| 1130 | /* We are always in a soft irq. */ | ||
| 1131 | dev_kfree_skb(skb); | ||
| 1132 | } | ||
| 1133 | |||
| 1134 | static void do_rx(unsigned long mac_ptr) | ||
| 1135 | { | ||
| 1136 | struct zd_mac *mac = (struct zd_mac *)mac_ptr; | ||
| 1137 | struct sk_buff *skb; | ||
| 1138 | |||
| 1139 | while ((skb = skb_dequeue(&mac->rx_queue)) != NULL) | ||
| 1140 | zd_mac_rx(mac, skb); | ||
| 1141 | } | ||
| 1142 | |||
| 1143 | int zd_mac_rx_irq(struct zd_mac *mac, const u8 *buffer, unsigned int length) | ||
| 1144 | { | ||
| 1145 | struct sk_buff *skb; | ||
| 1146 | |||
| 1147 | skb = dev_alloc_skb(sizeof(struct zd_rt_hdr) + length); | ||
| 1148 | if (!skb) { | ||
| 1149 | dev_warn(zd_mac_dev(mac), "Could not allocate skb.\n"); | ||
| 1150 | return -ENOMEM; | ||
| 1151 | } | ||
| 1152 | skb_reserve(skb, sizeof(struct zd_rt_hdr)); | ||
| 1153 | memcpy(__skb_put(skb, length), buffer, length); | ||
| 1154 | skb_queue_tail(&mac->rx_queue, skb); | ||
| 1155 | tasklet_schedule(&mac->rx_tasklet); | ||
| 1112 | return 0; | 1156 | return 0; |
| 1113 | } | 1157 | } |
| 1114 | 1158 | ||
diff --git a/drivers/net/wireless/zd1211rw/zd_mac.h b/drivers/net/wireless/zd1211rw/zd_mac.h index f0cf05dc7d3e..faf4c7828d4e 100644 --- a/drivers/net/wireless/zd1211rw/zd_mac.h +++ b/drivers/net/wireless/zd1211rw/zd_mac.h | |||
| @@ -138,6 +138,9 @@ struct zd_mac { | |||
| 138 | struct delayed_work set_rts_cts_work; | 138 | struct delayed_work set_rts_cts_work; |
| 139 | struct delayed_work set_basic_rates_work; | 139 | struct delayed_work set_basic_rates_work; |
| 140 | 140 | ||
| 141 | struct tasklet_struct rx_tasklet; | ||
| 142 | struct sk_buff_head rx_queue; | ||
| 143 | |||
| 141 | unsigned int stats_count; | 144 | unsigned int stats_count; |
| 142 | u8 qual_buffer[ZD_MAC_STATS_BUFFER_SIZE]; | 145 | u8 qual_buffer[ZD_MAC_STATS_BUFFER_SIZE]; |
| 143 | u8 rssi_buffer[ZD_MAC_STATS_BUFFER_SIZE]; | 146 | u8 rssi_buffer[ZD_MAC_STATS_BUFFER_SIZE]; |
| @@ -193,7 +196,7 @@ int zd_mac_stop(struct net_device *netdev); | |||
| 193 | int zd_mac_set_mac_address(struct net_device *dev, void *p); | 196 | int zd_mac_set_mac_address(struct net_device *dev, void *p); |
| 194 | void zd_mac_set_multicast_list(struct net_device *netdev); | 197 | void zd_mac_set_multicast_list(struct net_device *netdev); |
| 195 | 198 | ||
| 196 | int zd_mac_rx(struct zd_mac *mac, const u8 *buffer, unsigned int length); | 199 | int zd_mac_rx_irq(struct zd_mac *mac, const u8 *buffer, unsigned int length); |
| 197 | 200 | ||
| 198 | int zd_mac_set_regdomain(struct zd_mac *zd_mac, u8 regdomain); | 201 | int zd_mac_set_regdomain(struct zd_mac *zd_mac, u8 regdomain); |
| 199 | u8 zd_mac_get_regdomain(struct zd_mac *zd_mac); | 202 | u8 zd_mac_get_regdomain(struct zd_mac *zd_mac); |
diff --git a/drivers/net/wireless/zd1211rw/zd_usb.c b/drivers/net/wireless/zd1211rw/zd_usb.c index aa782e88754b..605e96e74057 100644 --- a/drivers/net/wireless/zd1211rw/zd_usb.c +++ b/drivers/net/wireless/zd1211rw/zd_usb.c | |||
| @@ -598,13 +598,13 @@ static void handle_rx_packet(struct zd_usb *usb, const u8 *buffer, | |||
| 598 | n = l+k; | 598 | n = l+k; |
| 599 | if (n > length) | 599 | if (n > length) |
| 600 | return; | 600 | return; |
| 601 | zd_mac_rx(mac, buffer+l, k); | 601 | zd_mac_rx_irq(mac, buffer+l, k); |
| 602 | if (i >= 2) | 602 | if (i >= 2) |
| 603 | return; | 603 | return; |
| 604 | l = (n+3) & ~3; | 604 | l = (n+3) & ~3; |
| 605 | } | 605 | } |
| 606 | } else { | 606 | } else { |
| 607 | zd_mac_rx(mac, buffer, length); | 607 | zd_mac_rx_irq(mac, buffer, length); |
| 608 | } | 608 | } |
| 609 | } | 609 | } |
| 610 | 610 | ||
diff --git a/net/ieee80211/softmac/ieee80211softmac_assoc.c b/net/ieee80211/softmac/ieee80211softmac_assoc.c index e3f37fdda65f..a824852909e4 100644 --- a/net/ieee80211/softmac/ieee80211softmac_assoc.c +++ b/net/ieee80211/softmac/ieee80211softmac_assoc.c | |||
| @@ -167,7 +167,7 @@ static void | |||
| 167 | ieee80211softmac_assoc_notify_scan(struct net_device *dev, int event_type, void *context) | 167 | ieee80211softmac_assoc_notify_scan(struct net_device *dev, int event_type, void *context) |
| 168 | { | 168 | { |
| 169 | struct ieee80211softmac_device *mac = ieee80211_priv(dev); | 169 | struct ieee80211softmac_device *mac = ieee80211_priv(dev); |
| 170 | ieee80211softmac_assoc_work((void*)mac); | 170 | ieee80211softmac_assoc_work(&mac->associnfo.work.work); |
| 171 | } | 171 | } |
| 172 | 172 | ||
| 173 | static void | 173 | static void |
| @@ -177,7 +177,7 @@ ieee80211softmac_assoc_notify_auth(struct net_device *dev, int event_type, void | |||
| 177 | 177 | ||
| 178 | switch (event_type) { | 178 | switch (event_type) { |
| 179 | case IEEE80211SOFTMAC_EVENT_AUTHENTICATED: | 179 | case IEEE80211SOFTMAC_EVENT_AUTHENTICATED: |
| 180 | ieee80211softmac_assoc_work((void*)mac); | 180 | ieee80211softmac_assoc_work(&mac->associnfo.work.work); |
| 181 | break; | 181 | break; |
| 182 | case IEEE80211SOFTMAC_EVENT_AUTH_FAILED: | 182 | case IEEE80211SOFTMAC_EVENT_AUTH_FAILED: |
| 183 | case IEEE80211SOFTMAC_EVENT_AUTH_TIMEOUT: | 183 | case IEEE80211SOFTMAC_EVENT_AUTH_TIMEOUT: |
diff --git a/net/ieee80211/softmac/ieee80211softmac_wx.c b/net/ieee80211/softmac/ieee80211softmac_wx.c index 480d72c7a42c..fa2f7da606a9 100644 --- a/net/ieee80211/softmac/ieee80211softmac_wx.c +++ b/net/ieee80211/softmac/ieee80211softmac_wx.c | |||
| @@ -463,7 +463,7 @@ ieee80211softmac_wx_get_genie(struct net_device *dev, | |||
| 463 | err = -E2BIG; | 463 | err = -E2BIG; |
| 464 | } | 464 | } |
| 465 | spin_unlock_irqrestore(&mac->lock, flags); | 465 | spin_unlock_irqrestore(&mac->lock, flags); |
| 466 | mutex_lock(&mac->associnfo.mutex); | 466 | mutex_unlock(&mac->associnfo.mutex); |
| 467 | 467 | ||
| 468 | return err; | 468 | return err; |
| 469 | } | 469 | } |
