diff options
| author | David S. Miller <davem@davemloft.net> | 2009-11-09 02:00:54 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2009-11-09 02:00:54 -0500 |
| commit | d0e1e88d6e7dbd8e1661cb6a058ca30f54ee39e4 (patch) | |
| tree | daab7cc0db83226672f76d2fc9277e4355f89e6b /drivers/net | |
| parent | 9e0d57fd6dad37d72a3ca6db00ca8c76f2215454 (diff) | |
| parent | 2606289779cb297320a185db5997729d29b6700b (diff) | |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts:
drivers/net/can/usb/ems_usb.c
Diffstat (limited to 'drivers/net')
| -rw-r--r-- | drivers/net/benet/be.h | 2 | ||||
| -rw-r--r-- | drivers/net/benet/be_ethtool.c | 8 | ||||
| -rw-r--r-- | drivers/net/benet/be_main.c | 28 | ||||
| -rw-r--r-- | drivers/net/can/dev.c | 17 | ||||
| -rw-r--r-- | drivers/net/can/usb/ems_usb.c | 5 | ||||
| -rw-r--r-- | drivers/net/cassini.c | 5 | ||||
| -rw-r--r-- | drivers/net/fsl_pq_mdio.c | 1 | ||||
| -rw-r--r-- | drivers/net/ixgbe/ixgbe_main.c | 84 | ||||
| -rw-r--r-- | drivers/net/macsonic.c | 117 | ||||
| -rw-r--r-- | drivers/net/qlge/qlge_main.c | 2 | ||||
| -rw-r--r-- | drivers/net/qlge/qlge_mpi.c | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/ipw2x00/ipw2100.c | 5 | ||||
| -rw-r--r-- | drivers/net/wireless/ipw2x00/ipw2200.c | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/ipw2x00/libipw.h | 1 | ||||
| -rw-r--r-- | drivers/net/wireless/ipw2x00/libipw_module.c | 14 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00dev.c | 4 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00link.c | 11 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00usb.c | 9 | ||||
| -rw-r--r-- | drivers/net/wireless/rtl818x/rtl8187_leds.c | 4 |
19 files changed, 215 insertions, 106 deletions
diff --git a/drivers/net/benet/be.h b/drivers/net/benet/be.h index ce7563175cef..67e165cf3f4e 100644 --- a/drivers/net/benet/be.h +++ b/drivers/net/benet/be.h | |||
| @@ -269,6 +269,8 @@ struct be_adapter { | |||
| 269 | u32 port_num; | 269 | u32 port_num; |
| 270 | bool promiscuous; | 270 | bool promiscuous; |
| 271 | u32 cap; | 271 | u32 cap; |
| 272 | u32 rx_fc; /* Rx flow control */ | ||
| 273 | u32 tx_fc; /* Tx flow control */ | ||
| 272 | }; | 274 | }; |
| 273 | 275 | ||
| 274 | extern const struct ethtool_ops be_ethtool_ops; | 276 | extern const struct ethtool_ops be_ethtool_ops; |
diff --git a/drivers/net/benet/be_ethtool.c b/drivers/net/benet/be_ethtool.c index edebce994906..e8f92831021a 100644 --- a/drivers/net/benet/be_ethtool.c +++ b/drivers/net/benet/be_ethtool.c | |||
| @@ -362,10 +362,12 @@ be_set_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *ecmd) | |||
| 362 | 362 | ||
| 363 | if (ecmd->autoneg != 0) | 363 | if (ecmd->autoneg != 0) |
| 364 | return -EINVAL; | 364 | return -EINVAL; |
| 365 | adapter->tx_fc = ecmd->tx_pause; | ||
| 366 | adapter->rx_fc = ecmd->rx_pause; | ||
| 365 | 367 | ||
| 366 | status = be_cmd_set_flow_control(adapter, ecmd->tx_pause, | 368 | status = be_cmd_set_flow_control(adapter, |
| 367 | ecmd->rx_pause); | 369 | adapter->tx_fc, adapter->rx_fc); |
| 368 | if (!status) | 370 | if (status) |
| 369 | dev_warn(&adapter->pdev->dev, "Pause param set failed.\n"); | 371 | dev_warn(&adapter->pdev->dev, "Pause param set failed.\n"); |
| 370 | 372 | ||
| 371 | return status; | 373 | return status; |
diff --git a/drivers/net/benet/be_main.c b/drivers/net/benet/be_main.c index 43180dc210a2..c0bd20356eaf 100644 --- a/drivers/net/benet/be_main.c +++ b/drivers/net/benet/be_main.c | |||
| @@ -1611,11 +1611,21 @@ static int be_open(struct net_device *netdev) | |||
| 1611 | status = be_cmd_link_status_query(adapter, &link_up, &mac_speed, | 1611 | status = be_cmd_link_status_query(adapter, &link_up, &mac_speed, |
| 1612 | &link_speed); | 1612 | &link_speed); |
| 1613 | if (status) | 1613 | if (status) |
| 1614 | return status; | 1614 | goto ret_sts; |
| 1615 | be_link_status_update(adapter, link_up); | 1615 | be_link_status_update(adapter, link_up); |
| 1616 | 1616 | ||
| 1617 | status = be_vid_config(adapter); | ||
| 1618 | if (status) | ||
| 1619 | goto ret_sts; | ||
| 1620 | |||
| 1621 | status = be_cmd_set_flow_control(adapter, | ||
| 1622 | adapter->tx_fc, adapter->rx_fc); | ||
| 1623 | if (status) | ||
| 1624 | goto ret_sts; | ||
| 1625 | |||
| 1617 | schedule_delayed_work(&adapter->work, msecs_to_jiffies(100)); | 1626 | schedule_delayed_work(&adapter->work, msecs_to_jiffies(100)); |
| 1618 | return 0; | 1627 | ret_sts: |
| 1628 | return status; | ||
| 1619 | } | 1629 | } |
| 1620 | 1630 | ||
| 1621 | static int be_setup(struct be_adapter *adapter) | 1631 | static int be_setup(struct be_adapter *adapter) |
| @@ -1649,17 +1659,8 @@ static int be_setup(struct be_adapter *adapter) | |||
| 1649 | if (status != 0) | 1659 | if (status != 0) |
| 1650 | goto rx_qs_destroy; | 1660 | goto rx_qs_destroy; |
| 1651 | 1661 | ||
| 1652 | status = be_vid_config(adapter); | ||
| 1653 | if (status != 0) | ||
| 1654 | goto mccqs_destroy; | ||
| 1655 | |||
| 1656 | status = be_cmd_set_flow_control(adapter, true, true); | ||
| 1657 | if (status != 0) | ||
| 1658 | goto mccqs_destroy; | ||
| 1659 | return 0; | 1662 | return 0; |
| 1660 | 1663 | ||
| 1661 | mccqs_destroy: | ||
| 1662 | be_mcc_queues_destroy(adapter); | ||
| 1663 | rx_qs_destroy: | 1664 | rx_qs_destroy: |
| 1664 | be_rx_queues_destroy(adapter); | 1665 | be_rx_queues_destroy(adapter); |
| 1665 | tx_qs_destroy: | 1666 | tx_qs_destroy: |
| @@ -1910,6 +1911,10 @@ static void be_netdev_init(struct net_device *netdev) | |||
| 1910 | 1911 | ||
| 1911 | adapter->rx_csum = true; | 1912 | adapter->rx_csum = true; |
| 1912 | 1913 | ||
| 1914 | /* Default settings for Rx and Tx flow control */ | ||
| 1915 | adapter->rx_fc = true; | ||
| 1916 | adapter->tx_fc = true; | ||
| 1917 | |||
| 1913 | netif_set_gso_max_size(netdev, 65535); | 1918 | netif_set_gso_max_size(netdev, 65535); |
| 1914 | 1919 | ||
| 1915 | BE_SET_NETDEV_OPS(netdev, &be_netdev_ops); | 1920 | BE_SET_NETDEV_OPS(netdev, &be_netdev_ops); |
| @@ -2172,6 +2177,7 @@ static int be_suspend(struct pci_dev *pdev, pm_message_t state) | |||
| 2172 | be_close(netdev); | 2177 | be_close(netdev); |
| 2173 | rtnl_unlock(); | 2178 | rtnl_unlock(); |
| 2174 | } | 2179 | } |
| 2180 | be_cmd_get_flow_control(adapter, &adapter->tx_fc, &adapter->rx_fc); | ||
| 2175 | be_clear(adapter); | 2181 | be_clear(adapter); |
| 2176 | 2182 | ||
| 2177 | pci_save_state(pdev); | 2183 | pci_save_state(pdev); |
diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c index 5fe34d64ca2a..26c89aaeba62 100644 --- a/drivers/net/can/dev.c +++ b/drivers/net/can/dev.c | |||
| @@ -637,6 +637,22 @@ static int can_changelink(struct net_device *dev, | |||
| 637 | return 0; | 637 | return 0; |
| 638 | } | 638 | } |
| 639 | 639 | ||
| 640 | static size_t can_get_size(const struct net_device *dev) | ||
| 641 | { | ||
| 642 | struct can_priv *priv = netdev_priv(dev); | ||
| 643 | size_t size; | ||
| 644 | |||
| 645 | size = nla_total_size(sizeof(u32)); /* IFLA_CAN_STATE */ | ||
| 646 | size += sizeof(struct can_ctrlmode); /* IFLA_CAN_CTRLMODE */ | ||
| 647 | size += nla_total_size(sizeof(u32)); /* IFLA_CAN_RESTART_MS */ | ||
| 648 | size += sizeof(struct can_bittiming); /* IFLA_CAN_BITTIMING */ | ||
| 649 | size += sizeof(struct can_clock); /* IFLA_CAN_CLOCK */ | ||
| 650 | if (priv->bittiming_const) /* IFLA_CAN_BITTIMING_CONST */ | ||
| 651 | size += sizeof(struct can_bittiming_const); | ||
| 652 | |||
| 653 | return size; | ||
| 654 | } | ||
| 655 | |||
| 640 | static int can_fill_info(struct sk_buff *skb, const struct net_device *dev) | 656 | static int can_fill_info(struct sk_buff *skb, const struct net_device *dev) |
| 641 | { | 657 | { |
| 642 | struct can_priv *priv = netdev_priv(dev); | 658 | struct can_priv *priv = netdev_priv(dev); |
| @@ -687,6 +703,7 @@ static struct rtnl_link_ops can_link_ops __read_mostly = { | |||
| 687 | .setup = can_setup, | 703 | .setup = can_setup, |
| 688 | .newlink = can_newlink, | 704 | .newlink = can_newlink, |
| 689 | .changelink = can_changelink, | 705 | .changelink = can_changelink, |
| 706 | .get_size = can_get_size, | ||
| 690 | .fill_info = can_fill_info, | 707 | .fill_info = can_fill_info, |
| 691 | .fill_xstats = can_fill_xstats, | 708 | .fill_xstats = can_fill_xstats, |
| 692 | }; | 709 | }; |
diff --git a/drivers/net/can/usb/ems_usb.c b/drivers/net/can/usb/ems_usb.c index 3685f3e42d12..3e4419054c81 100644 --- a/drivers/net/can/usb/ems_usb.c +++ b/drivers/net/can/usb/ems_usb.c | |||
| @@ -315,7 +315,7 @@ static void ems_usb_rx_can_msg(struct ems_usb *dev, struct ems_cpc_msg *msg) | |||
| 315 | if (skb == NULL) | 315 | if (skb == NULL) |
| 316 | return; | 316 | return; |
| 317 | 317 | ||
| 318 | cf->can_id = msg->msg.can_msg.id; | 318 | cf->can_id = le32_to_cpu(msg->msg.can_msg.id); |
| 319 | cf->can_dlc = min_t(u8, msg->msg.can_msg.length, 8); | 319 | cf->can_dlc = min_t(u8, msg->msg.can_msg.length, 8); |
| 320 | 320 | ||
| 321 | if (msg->type == CPC_MSG_TYPE_EXT_CAN_FRAME | 321 | if (msg->type == CPC_MSG_TYPE_EXT_CAN_FRAME |
| @@ -801,6 +801,9 @@ static netdev_tx_t ems_usb_start_xmit(struct sk_buff *skb, struct net_device *ne | |||
| 801 | msg->length = CPC_CAN_MSG_MIN_SIZE + cf->can_dlc; | 801 | msg->length = CPC_CAN_MSG_MIN_SIZE + cf->can_dlc; |
| 802 | } | 802 | } |
| 803 | 803 | ||
| 804 | /* Respect byte order */ | ||
| 805 | msg->msg.can_msg.id = cpu_to_le32(msg->msg.can_msg.id); | ||
| 806 | |||
| 804 | for (i = 0; i < MAX_TX_URBS; i++) { | 807 | for (i = 0; i < MAX_TX_URBS; i++) { |
| 805 | if (dev->tx_contexts[i].echo_index == MAX_TX_URBS) { | 808 | if (dev->tx_contexts[i].echo_index == MAX_TX_URBS) { |
| 806 | context = &dev->tx_contexts[i]; | 809 | context = &dev->tx_contexts[i]; |
diff --git a/drivers/net/cassini.c b/drivers/net/cassini.c index 05916aafa4f1..f857afe8e488 100644 --- a/drivers/net/cassini.c +++ b/drivers/net/cassini.c | |||
| @@ -4342,11 +4342,11 @@ static int cas_open(struct net_device *dev) | |||
| 4342 | cas_unlock_all_restore(cp, flags); | 4342 | cas_unlock_all_restore(cp, flags); |
| 4343 | } | 4343 | } |
| 4344 | 4344 | ||
| 4345 | err = -ENOMEM; | ||
| 4345 | if (cas_tx_tiny_alloc(cp) < 0) | 4346 | if (cas_tx_tiny_alloc(cp) < 0) |
| 4346 | return -ENOMEM; | 4347 | goto err_unlock; |
| 4347 | 4348 | ||
| 4348 | /* alloc rx descriptors */ | 4349 | /* alloc rx descriptors */ |
| 4349 | err = -ENOMEM; | ||
| 4350 | if (cas_alloc_rxds(cp) < 0) | 4350 | if (cas_alloc_rxds(cp) < 0) |
| 4351 | goto err_tx_tiny; | 4351 | goto err_tx_tiny; |
| 4352 | 4352 | ||
| @@ -4386,6 +4386,7 @@ err_spare: | |||
| 4386 | cas_free_rxds(cp); | 4386 | cas_free_rxds(cp); |
| 4387 | err_tx_tiny: | 4387 | err_tx_tiny: |
| 4388 | cas_tx_tiny_free(cp); | 4388 | cas_tx_tiny_free(cp); |
| 4389 | err_unlock: | ||
| 4389 | mutex_unlock(&cp->pm_mutex); | 4390 | mutex_unlock(&cp->pm_mutex); |
| 4390 | return err; | 4391 | return err; |
| 4391 | } | 4392 | } |
diff --git a/drivers/net/fsl_pq_mdio.c b/drivers/net/fsl_pq_mdio.c index b2ca596760f8..25fabb3eedc5 100644 --- a/drivers/net/fsl_pq_mdio.c +++ b/drivers/net/fsl_pq_mdio.c | |||
| @@ -462,3 +462,4 @@ void fsl_pq_mdio_exit(void) | |||
| 462 | of_unregister_platform_driver(&fsl_pq_mdio_driver); | 462 | of_unregister_platform_driver(&fsl_pq_mdio_driver); |
| 463 | } | 463 | } |
| 464 | module_exit(fsl_pq_mdio_exit); | 464 | module_exit(fsl_pq_mdio_exit); |
| 465 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index 45c5faf0824a..448e84d56601 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
| @@ -44,6 +44,7 @@ | |||
| 44 | 44 | ||
| 45 | #include "ixgbe.h" | 45 | #include "ixgbe.h" |
| 46 | #include "ixgbe_common.h" | 46 | #include "ixgbe_common.h" |
| 47 | #include "ixgbe_dcb_82599.h" | ||
| 47 | 48 | ||
| 48 | char ixgbe_driver_name[] = "ixgbe"; | 49 | char ixgbe_driver_name[] = "ixgbe"; |
| 49 | static const char ixgbe_driver_string[] = | 50 | static const char ixgbe_driver_string[] = |
| @@ -228,6 +229,56 @@ static void ixgbe_unmap_and_free_tx_resource(struct ixgbe_adapter *adapter, | |||
| 228 | /* tx_buffer_info must be completely set up in the transmit path */ | 229 | /* tx_buffer_info must be completely set up in the transmit path */ |
| 229 | } | 230 | } |
| 230 | 231 | ||
| 232 | /** | ||
| 233 | * ixgbe_tx_is_paused - check if the tx ring is paused | ||
| 234 | * @adapter: the ixgbe adapter | ||
| 235 | * @tx_ring: the corresponding tx_ring | ||
| 236 | * | ||
| 237 | * If not in DCB mode, checks TFCS.TXOFF, otherwise, find out the | ||
| 238 | * corresponding TC of this tx_ring when checking TFCS. | ||
| 239 | * | ||
| 240 | * Returns : true if paused | ||
| 241 | */ | ||
| 242 | static inline bool ixgbe_tx_is_paused(struct ixgbe_adapter *adapter, | ||
| 243 | struct ixgbe_ring *tx_ring) | ||
| 244 | { | ||
| 245 | int tc; | ||
| 246 | u32 txoff = IXGBE_TFCS_TXOFF; | ||
| 247 | |||
| 248 | #ifdef CONFIG_IXGBE_DCB | ||
| 249 | if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) { | ||
| 250 | int reg_idx = tx_ring->reg_idx; | ||
| 251 | int dcb_i = adapter->ring_feature[RING_F_DCB].indices; | ||
| 252 | |||
| 253 | if (adapter->hw.mac.type == ixgbe_mac_82598EB) { | ||
| 254 | tc = reg_idx >> 2; | ||
| 255 | txoff = IXGBE_TFCS_TXOFF0; | ||
| 256 | } else if (adapter->hw.mac.type == ixgbe_mac_82599EB) { | ||
| 257 | tc = 0; | ||
| 258 | txoff = IXGBE_TFCS_TXOFF; | ||
| 259 | if (dcb_i == 8) { | ||
| 260 | /* TC0, TC1 */ | ||
| 261 | tc = reg_idx >> 5; | ||
| 262 | if (tc == 2) /* TC2, TC3 */ | ||
| 263 | tc += (reg_idx - 64) >> 4; | ||
| 264 | else if (tc == 3) /* TC4, TC5, TC6, TC7 */ | ||
| 265 | tc += 1 + ((reg_idx - 96) >> 3); | ||
| 266 | } else if (dcb_i == 4) { | ||
| 267 | /* TC0, TC1 */ | ||
| 268 | tc = reg_idx >> 6; | ||
| 269 | if (tc == 1) { | ||
| 270 | tc += (reg_idx - 64) >> 5; | ||
| 271 | if (tc == 2) /* TC2, TC3 */ | ||
| 272 | tc += (reg_idx - 96) >> 4; | ||
| 273 | } | ||
| 274 | } | ||
| 275 | } | ||
| 276 | txoff <<= tc; | ||
| 277 | } | ||
| 278 | #endif | ||
| 279 | return IXGBE_READ_REG(&adapter->hw, IXGBE_TFCS) & txoff; | ||
| 280 | } | ||
| 281 | |||
| 231 | static inline bool ixgbe_check_tx_hang(struct ixgbe_adapter *adapter, | 282 | static inline bool ixgbe_check_tx_hang(struct ixgbe_adapter *adapter, |
| 232 | struct ixgbe_ring *tx_ring, | 283 | struct ixgbe_ring *tx_ring, |
| 233 | unsigned int eop) | 284 | unsigned int eop) |
| @@ -239,7 +290,7 @@ static inline bool ixgbe_check_tx_hang(struct ixgbe_adapter *adapter, | |||
| 239 | adapter->detect_tx_hung = false; | 290 | adapter->detect_tx_hung = false; |
| 240 | if (tx_ring->tx_buffer_info[eop].time_stamp && | 291 | if (tx_ring->tx_buffer_info[eop].time_stamp && |
| 241 | time_after(jiffies, tx_ring->tx_buffer_info[eop].time_stamp + HZ) && | 292 | time_after(jiffies, tx_ring->tx_buffer_info[eop].time_stamp + HZ) && |
| 242 | !(IXGBE_READ_REG(&adapter->hw, IXGBE_TFCS) & IXGBE_TFCS_TXOFF)) { | 293 | !ixgbe_tx_is_paused(adapter, tx_ring)) { |
| 243 | /* detected Tx unit hang */ | 294 | /* detected Tx unit hang */ |
| 244 | union ixgbe_adv_tx_desc *tx_desc; | 295 | union ixgbe_adv_tx_desc *tx_desc; |
| 245 | tx_desc = IXGBE_TX_DESC_ADV(*tx_ring, eop); | 296 | tx_desc = IXGBE_TX_DESC_ADV(*tx_ring, eop); |
| @@ -414,19 +465,23 @@ static void ixgbe_update_tx_dca(struct ixgbe_adapter *adapter, | |||
| 414 | u32 txctrl; | 465 | u32 txctrl; |
| 415 | int cpu = get_cpu(); | 466 | int cpu = get_cpu(); |
| 416 | int q = tx_ring - adapter->tx_ring; | 467 | int q = tx_ring - adapter->tx_ring; |
| 468 | struct ixgbe_hw *hw = &adapter->hw; | ||
| 417 | 469 | ||
| 418 | if (tx_ring->cpu != cpu) { | 470 | if (tx_ring->cpu != cpu) { |
| 419 | txctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_DCA_TXCTRL(q)); | ||
| 420 | if (adapter->hw.mac.type == ixgbe_mac_82598EB) { | 471 | if (adapter->hw.mac.type == ixgbe_mac_82598EB) { |
| 472 | txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(q)); | ||
| 421 | txctrl &= ~IXGBE_DCA_TXCTRL_CPUID_MASK; | 473 | txctrl &= ~IXGBE_DCA_TXCTRL_CPUID_MASK; |
| 422 | txctrl |= dca3_get_tag(&adapter->pdev->dev, cpu); | 474 | txctrl |= dca3_get_tag(&adapter->pdev->dev, cpu); |
| 475 | txctrl |= IXGBE_DCA_TXCTRL_DESC_DCA_EN; | ||
| 476 | IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(q), txctrl); | ||
| 423 | } else if (adapter->hw.mac.type == ixgbe_mac_82599EB) { | 477 | } else if (adapter->hw.mac.type == ixgbe_mac_82599EB) { |
| 478 | txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL_82599(q)); | ||
| 424 | txctrl &= ~IXGBE_DCA_TXCTRL_CPUID_MASK_82599; | 479 | txctrl &= ~IXGBE_DCA_TXCTRL_CPUID_MASK_82599; |
| 425 | txctrl |= (dca3_get_tag(&adapter->pdev->dev, cpu) << | 480 | txctrl |= (dca3_get_tag(&adapter->pdev->dev, cpu) << |
| 426 | IXGBE_DCA_TXCTRL_CPUID_SHIFT_82599); | 481 | IXGBE_DCA_TXCTRL_CPUID_SHIFT_82599); |
| 482 | txctrl |= IXGBE_DCA_TXCTRL_DESC_DCA_EN; | ||
| 483 | IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL_82599(q), txctrl); | ||
| 427 | } | 484 | } |
| 428 | txctrl |= IXGBE_DCA_TXCTRL_DESC_DCA_EN; | ||
| 429 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_DCA_TXCTRL(q), txctrl); | ||
| 430 | tx_ring->cpu = cpu; | 485 | tx_ring->cpu = cpu; |
| 431 | } | 486 | } |
| 432 | put_cpu(); | 487 | put_cpu(); |
| @@ -1908,11 +1963,25 @@ static void ixgbe_configure_tx(struct ixgbe_adapter *adapter) | |||
| 1908 | break; | 1963 | break; |
| 1909 | } | 1964 | } |
| 1910 | } | 1965 | } |
| 1966 | |||
| 1911 | if (hw->mac.type == ixgbe_mac_82599EB) { | 1967 | if (hw->mac.type == ixgbe_mac_82599EB) { |
| 1968 | u32 rttdcs; | ||
| 1969 | |||
| 1970 | /* disable the arbiter while setting MTQC */ | ||
| 1971 | rttdcs = IXGBE_READ_REG(hw, IXGBE_RTTDCS); | ||
| 1972 | rttdcs |= IXGBE_RTTDCS_ARBDIS; | ||
| 1973 | IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs); | ||
| 1974 | |||
| 1912 | /* We enable 8 traffic classes, DCB only */ | 1975 | /* We enable 8 traffic classes, DCB only */ |
| 1913 | if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) | 1976 | if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) |
| 1914 | IXGBE_WRITE_REG(hw, IXGBE_MTQC, (IXGBE_MTQC_RT_ENA | | 1977 | IXGBE_WRITE_REG(hw, IXGBE_MTQC, (IXGBE_MTQC_RT_ENA | |
| 1915 | IXGBE_MTQC_8TC_8TQ)); | 1978 | IXGBE_MTQC_8TC_8TQ)); |
| 1979 | else | ||
| 1980 | IXGBE_WRITE_REG(hw, IXGBE_MTQC, IXGBE_MTQC_64Q_1PB); | ||
| 1981 | |||
| 1982 | /* re-eable the arbiter */ | ||
| 1983 | rttdcs &= ~IXGBE_RTTDCS_ARBDIS; | ||
| 1984 | IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs); | ||
| 1916 | } | 1985 | } |
| 1917 | } | 1986 | } |
| 1918 | 1987 | ||
| @@ -2466,7 +2535,10 @@ static void ixgbe_configure(struct ixgbe_adapter *adapter) | |||
| 2466 | ixgbe_restore_vlan(adapter); | 2535 | ixgbe_restore_vlan(adapter); |
| 2467 | #ifdef CONFIG_IXGBE_DCB | 2536 | #ifdef CONFIG_IXGBE_DCB |
| 2468 | if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) { | 2537 | if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) { |
| 2469 | netif_set_gso_max_size(netdev, 32768); | 2538 | if (hw->mac.type == ixgbe_mac_82598EB) |
| 2539 | netif_set_gso_max_size(netdev, 32768); | ||
| 2540 | else | ||
| 2541 | netif_set_gso_max_size(netdev, 65536); | ||
| 2470 | ixgbe_configure_dcb(adapter); | 2542 | ixgbe_configure_dcb(adapter); |
| 2471 | } else { | 2543 | } else { |
| 2472 | netif_set_gso_max_size(netdev, 65536); | 2544 | netif_set_gso_max_size(netdev, 65536); |
diff --git a/drivers/net/macsonic.c b/drivers/net/macsonic.c index 61eabcac734c..b3d7d8d77f46 100644 --- a/drivers/net/macsonic.c +++ b/drivers/net/macsonic.c | |||
| @@ -223,69 +223,73 @@ static int __devinit macsonic_init(struct net_device *dev) | |||
| 223 | return 0; | 223 | return 0; |
| 224 | } | 224 | } |
| 225 | 225 | ||
| 226 | static int __devinit mac_onboard_sonic_ethernet_addr(struct net_device *dev) | 226 | #define INVALID_MAC(mac) (memcmp(mac, "\x08\x00\x07", 3) && \ |
| 227 | memcmp(mac, "\x00\xA0\x40", 3) && \ | ||
| 228 | memcmp(mac, "\x00\x80\x19", 3) && \ | ||
| 229 | memcmp(mac, "\x00\x05\x02", 3)) | ||
| 230 | |||
| 231 | static void __devinit mac_onboard_sonic_ethernet_addr(struct net_device *dev) | ||
| 227 | { | 232 | { |
| 228 | struct sonic_local *lp = netdev_priv(dev); | 233 | struct sonic_local *lp = netdev_priv(dev); |
| 229 | const int prom_addr = ONBOARD_SONIC_PROM_BASE; | 234 | const int prom_addr = ONBOARD_SONIC_PROM_BASE; |
| 230 | int i; | 235 | unsigned short val; |
| 231 | 236 | ||
| 232 | /* On NuBus boards we can sometimes look in the ROM resources. | 237 | /* |
| 233 | No such luck for comm-slot/onboard. */ | 238 | * On NuBus boards we can sometimes look in the ROM resources. |
| 234 | for(i = 0; i < 6; i++) | 239 | * No such luck for comm-slot/onboard. |
| 235 | dev->dev_addr[i] = SONIC_READ_PROM(i); | 240 | * On the PowerBook 520, the PROM base address is a mystery. |
| 241 | */ | ||
| 242 | if (hwreg_present((void *)prom_addr)) { | ||
| 243 | int i; | ||
| 244 | |||
| 245 | for (i = 0; i < 6; i++) | ||
| 246 | dev->dev_addr[i] = SONIC_READ_PROM(i); | ||
| 247 | if (!INVALID_MAC(dev->dev_addr)) | ||
| 248 | return; | ||
| 236 | 249 | ||
| 237 | /* Most of the time, the address is bit-reversed. The NetBSD | 250 | /* |
| 238 | source has a rather long and detailed historical account of | 251 | * Most of the time, the address is bit-reversed. The NetBSD |
| 239 | why this is so. */ | 252 | * source has a rather long and detailed historical account of |
| 240 | if (memcmp(dev->dev_addr, "\x08\x00\x07", 3) && | 253 | * why this is so. |
| 241 | memcmp(dev->dev_addr, "\x00\xA0\x40", 3) && | 254 | */ |
| 242 | memcmp(dev->dev_addr, "\x00\x80\x19", 3) && | ||
| 243 | memcmp(dev->dev_addr, "\x00\x05\x02", 3)) | ||
| 244 | bit_reverse_addr(dev->dev_addr); | 255 | bit_reverse_addr(dev->dev_addr); |
| 245 | else | 256 | if (!INVALID_MAC(dev->dev_addr)) |
| 246 | return 0; | 257 | return; |
| 247 | 258 | ||
| 248 | /* If we still have what seems to be a bogus address, we'll | ||
| 249 | look in the CAM. The top entry should be ours. */ | ||
| 250 | /* Danger! This only works if MacOS has already initialized | ||
| 251 | the card... */ | ||
| 252 | if (memcmp(dev->dev_addr, "\x08\x00\x07", 3) && | ||
| 253 | memcmp(dev->dev_addr, "\x00\xA0\x40", 3) && | ||
| 254 | memcmp(dev->dev_addr, "\x00\x80\x19", 3) && | ||
| 255 | memcmp(dev->dev_addr, "\x00\x05\x02", 3)) | ||
| 256 | { | ||
| 257 | unsigned short val; | ||
| 258 | |||
| 259 | printk(KERN_INFO "macsonic: PROM seems to be wrong, trying CAM entry 15\n"); | ||
| 260 | |||
| 261 | SONIC_WRITE(SONIC_CMD, SONIC_CR_RST); | ||
| 262 | SONIC_WRITE(SONIC_CEP, 15); | ||
| 263 | |||
| 264 | val = SONIC_READ(SONIC_CAP2); | ||
| 265 | dev->dev_addr[5] = val >> 8; | ||
| 266 | dev->dev_addr[4] = val & 0xff; | ||
| 267 | val = SONIC_READ(SONIC_CAP1); | ||
| 268 | dev->dev_addr[3] = val >> 8; | ||
| 269 | dev->dev_addr[2] = val & 0xff; | ||
| 270 | val = SONIC_READ(SONIC_CAP0); | ||
| 271 | dev->dev_addr[1] = val >> 8; | ||
| 272 | dev->dev_addr[0] = val & 0xff; | ||
| 273 | |||
| 274 | printk(KERN_INFO "HW Address from CAM 15: %pM\n", | ||
| 275 | dev->dev_addr); | ||
| 276 | } else return 0; | ||
| 277 | |||
| 278 | if (memcmp(dev->dev_addr, "\x08\x00\x07", 3) && | ||
| 279 | memcmp(dev->dev_addr, "\x00\xA0\x40", 3) && | ||
| 280 | memcmp(dev->dev_addr, "\x00\x80\x19", 3) && | ||
| 281 | memcmp(dev->dev_addr, "\x00\x05\x02", 3)) | ||
| 282 | { | ||
| 283 | /* | 259 | /* |
| 284 | * Still nonsense ... messed up someplace! | 260 | * If we still have what seems to be a bogus address, we'll |
| 261 | * look in the CAM. The top entry should be ours. | ||
| 285 | */ | 262 | */ |
| 286 | printk(KERN_ERR "macsonic: ERROR (INVALID MAC)\n"); | 263 | printk(KERN_WARNING "macsonic: MAC address in PROM seems " |
| 287 | return -EIO; | 264 | "to be invalid, trying CAM\n"); |
| 288 | } else return 0; | 265 | } else { |
| 266 | printk(KERN_WARNING "macsonic: cannot read MAC address from " | ||
| 267 | "PROM, trying CAM\n"); | ||
| 268 | } | ||
| 269 | |||
| 270 | /* This only works if MacOS has already initialized the card. */ | ||
| 271 | |||
| 272 | SONIC_WRITE(SONIC_CMD, SONIC_CR_RST); | ||
| 273 | SONIC_WRITE(SONIC_CEP, 15); | ||
| 274 | |||
| 275 | val = SONIC_READ(SONIC_CAP2); | ||
| 276 | dev->dev_addr[5] = val >> 8; | ||
| 277 | dev->dev_addr[4] = val & 0xff; | ||
| 278 | val = SONIC_READ(SONIC_CAP1); | ||
| 279 | dev->dev_addr[3] = val >> 8; | ||
| 280 | dev->dev_addr[2] = val & 0xff; | ||
| 281 | val = SONIC_READ(SONIC_CAP0); | ||
| 282 | dev->dev_addr[1] = val >> 8; | ||
| 283 | dev->dev_addr[0] = val & 0xff; | ||
| 284 | |||
| 285 | if (!INVALID_MAC(dev->dev_addr)) | ||
| 286 | return; | ||
| 287 | |||
| 288 | /* Still nonsense ... messed up someplace! */ | ||
| 289 | |||
| 290 | printk(KERN_WARNING "macsonic: MAC address in CAM entry 15 " | ||
| 291 | "seems invalid, will use a random MAC\n"); | ||
| 292 | random_ether_addr(dev->dev_addr); | ||
| 289 | } | 293 | } |
| 290 | 294 | ||
| 291 | static int __devinit mac_onboard_sonic_probe(struct net_device *dev) | 295 | static int __devinit mac_onboard_sonic_probe(struct net_device *dev) |
| @@ -402,8 +406,7 @@ static int __devinit mac_onboard_sonic_probe(struct net_device *dev) | |||
| 402 | SONIC_WRITE(SONIC_ISR, 0x7fff); | 406 | SONIC_WRITE(SONIC_ISR, 0x7fff); |
| 403 | 407 | ||
| 404 | /* Now look for the MAC address. */ | 408 | /* Now look for the MAC address. */ |
| 405 | if (mac_onboard_sonic_ethernet_addr(dev) != 0) | 409 | mac_onboard_sonic_ethernet_addr(dev); |
| 406 | return -ENODEV; | ||
| 407 | 410 | ||
| 408 | /* Shared init code */ | 411 | /* Shared init code */ |
| 409 | return macsonic_init(dev); | 412 | return macsonic_init(dev); |
diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c index 0de596ad8a7e..bd8e164b121c 100644 --- a/drivers/net/qlge/qlge_main.c +++ b/drivers/net/qlge/qlge_main.c | |||
| @@ -4145,6 +4145,8 @@ static int __devinit ql_init_device(struct pci_dev *pdev, | |||
| 4145 | goto err_out; | 4145 | goto err_out; |
| 4146 | } | 4146 | } |
| 4147 | 4147 | ||
| 4148 | /* Set PCIe reset type for EEH to fundamental. */ | ||
| 4149 | pdev->needs_freset = 1; | ||
| 4148 | pci_save_state(pdev); | 4150 | pci_save_state(pdev); |
| 4149 | qdev->reg_base = | 4151 | qdev->reg_base = |
| 4150 | ioremap_nocache(pci_resource_start(pdev, 1), | 4152 | ioremap_nocache(pci_resource_start(pdev, 1), |
diff --git a/drivers/net/qlge/qlge_mpi.c b/drivers/net/qlge/qlge_mpi.c index f5619fe87bb2..e2b2286102d4 100644 --- a/drivers/net/qlge/qlge_mpi.c +++ b/drivers/net/qlge/qlge_mpi.c | |||
| @@ -483,7 +483,7 @@ static int ql_mailbox_command(struct ql_adapter *qdev, struct mbox_params *mbcp) | |||
| 483 | /* Wait for the interrupt to come in. */ | 483 | /* Wait for the interrupt to come in. */ |
| 484 | status = ql_wait_mbx_cmd_cmplt(qdev); | 484 | status = ql_wait_mbx_cmd_cmplt(qdev); |
| 485 | if (status) | 485 | if (status) |
| 486 | goto end; | 486 | continue; |
| 487 | 487 | ||
| 488 | /* Process the event. If it's an AEN, it | 488 | /* Process the event. If it's an AEN, it |
| 489 | * will be handled in-line or a worker | 489 | * will be handled in-line or a worker |
diff --git a/drivers/net/wireless/ipw2x00/ipw2100.c b/drivers/net/wireless/ipw2x00/ipw2100.c index a741d37fd96f..240cff1e6979 100644 --- a/drivers/net/wireless/ipw2x00/ipw2100.c +++ b/drivers/net/wireless/ipw2x00/ipw2100.c | |||
| @@ -6325,10 +6325,8 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev, | |||
| 6325 | 6325 | ||
| 6326 | fail: | 6326 | fail: |
| 6327 | if (dev) { | 6327 | if (dev) { |
| 6328 | if (registered) { | 6328 | if (registered) |
| 6329 | unregister_ieee80211(priv->ieee); | ||
| 6330 | unregister_netdev(dev); | 6329 | unregister_netdev(dev); |
| 6331 | } | ||
| 6332 | 6330 | ||
| 6333 | ipw2100_hw_stop_adapter(priv); | 6331 | ipw2100_hw_stop_adapter(priv); |
| 6334 | 6332 | ||
| @@ -6385,7 +6383,6 @@ static void __devexit ipw2100_pci_remove_one(struct pci_dev *pci_dev) | |||
| 6385 | /* Unregister the device first - this results in close() | 6383 | /* Unregister the device first - this results in close() |
| 6386 | * being called if the device is open. If we free storage | 6384 | * being called if the device is open. If we free storage |
| 6387 | * first, then close() will crash. */ | 6385 | * first, then close() will crash. */ |
| 6388 | unregister_ieee80211(priv->ieee); | ||
| 6389 | unregister_netdev(dev); | 6386 | unregister_netdev(dev); |
| 6390 | 6387 | ||
| 6391 | /* ipw2100_down will ensure that there is no more pending work | 6388 | /* ipw2100_down will ensure that there is no more pending work |
diff --git a/drivers/net/wireless/ipw2x00/ipw2200.c b/drivers/net/wireless/ipw2x00/ipw2200.c index 4539e63e978e..61ef8904af97 100644 --- a/drivers/net/wireless/ipw2x00/ipw2200.c +++ b/drivers/net/wireless/ipw2x00/ipw2200.c | |||
| @@ -11822,7 +11822,6 @@ static int __devinit ipw_pci_probe(struct pci_dev *pdev, | |||
| 11822 | if (err) { | 11822 | if (err) { |
| 11823 | IPW_ERROR("Failed to register promiscuous network " | 11823 | IPW_ERROR("Failed to register promiscuous network " |
| 11824 | "device (error %d).\n", err); | 11824 | "device (error %d).\n", err); |
| 11825 | unregister_ieee80211(priv->ieee); | ||
| 11826 | unregister_netdev(priv->net_dev); | 11825 | unregister_netdev(priv->net_dev); |
| 11827 | goto out_remove_sysfs; | 11826 | goto out_remove_sysfs; |
| 11828 | } | 11827 | } |
| @@ -11873,7 +11872,6 @@ static void __devexit ipw_pci_remove(struct pci_dev *pdev) | |||
| 11873 | 11872 | ||
| 11874 | mutex_unlock(&priv->mutex); | 11873 | mutex_unlock(&priv->mutex); |
| 11875 | 11874 | ||
| 11876 | unregister_ieee80211(priv->ieee); | ||
| 11877 | unregister_netdev(priv->net_dev); | 11875 | unregister_netdev(priv->net_dev); |
| 11878 | 11876 | ||
| 11879 | if (priv->rxq) { | 11877 | if (priv->rxq) { |
diff --git a/drivers/net/wireless/ipw2x00/libipw.h b/drivers/net/wireless/ipw2x00/libipw.h index f42ade6c2d3e..bf45391172f3 100644 --- a/drivers/net/wireless/ipw2x00/libipw.h +++ b/drivers/net/wireless/ipw2x00/libipw.h | |||
| @@ -1020,7 +1020,6 @@ static inline int libipw_is_cck_rate(u8 rate) | |||
| 1020 | /* ieee80211.c */ | 1020 | /* ieee80211.c */ |
| 1021 | extern void free_ieee80211(struct net_device *dev, int monitor); | 1021 | extern void free_ieee80211(struct net_device *dev, int monitor); |
| 1022 | extern struct net_device *alloc_ieee80211(int sizeof_priv, int monitor); | 1022 | extern struct net_device *alloc_ieee80211(int sizeof_priv, int monitor); |
| 1023 | extern void unregister_ieee80211(struct libipw_device *ieee); | ||
| 1024 | extern int libipw_change_mtu(struct net_device *dev, int new_mtu); | 1023 | extern int libipw_change_mtu(struct net_device *dev, int new_mtu); |
| 1025 | 1024 | ||
| 1026 | extern void libipw_networks_age(struct libipw_device *ieee, | 1025 | extern void libipw_networks_age(struct libipw_device *ieee, |
diff --git a/drivers/net/wireless/ipw2x00/libipw_module.c b/drivers/net/wireless/ipw2x00/libipw_module.c index be5b809ec97a..a0e9f6aed7da 100644 --- a/drivers/net/wireless/ipw2x00/libipw_module.c +++ b/drivers/net/wireless/ipw2x00/libipw_module.c | |||
| @@ -235,19 +235,16 @@ void free_ieee80211(struct net_device *dev, int monitor) | |||
| 235 | libipw_networks_free(ieee); | 235 | libipw_networks_free(ieee); |
| 236 | 236 | ||
| 237 | /* free cfg80211 resources */ | 237 | /* free cfg80211 resources */ |
| 238 | if (!monitor) | 238 | if (!monitor) { |
| 239 | wiphy_unregister(ieee->wdev.wiphy); | ||
| 240 | kfree(ieee->a_band.channels); | ||
| 241 | kfree(ieee->bg_band.channels); | ||
| 239 | wiphy_free(ieee->wdev.wiphy); | 242 | wiphy_free(ieee->wdev.wiphy); |
| 243 | } | ||
| 240 | 244 | ||
| 241 | free_netdev(dev); | 245 | free_netdev(dev); |
| 242 | } | 246 | } |
| 243 | 247 | ||
| 244 | void unregister_ieee80211(struct libipw_device *ieee) | ||
| 245 | { | ||
| 246 | wiphy_unregister(ieee->wdev.wiphy); | ||
| 247 | kfree(ieee->a_band.channels); | ||
| 248 | kfree(ieee->bg_band.channels); | ||
| 249 | } | ||
| 250 | |||
| 251 | #ifdef CONFIG_LIBIPW_DEBUG | 248 | #ifdef CONFIG_LIBIPW_DEBUG |
| 252 | 249 | ||
| 253 | static int debug = 0; | 250 | static int debug = 0; |
| @@ -333,4 +330,3 @@ module_init(libipw_init); | |||
| 333 | 330 | ||
| 334 | EXPORT_SYMBOL(alloc_ieee80211); | 331 | EXPORT_SYMBOL(alloc_ieee80211); |
| 335 | EXPORT_SYMBOL(free_ieee80211); | 332 | EXPORT_SYMBOL(free_ieee80211); |
| 336 | EXPORT_SYMBOL(unregister_ieee80211); | ||
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index 71761b343839..73bbec58341e 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c | |||
| @@ -815,6 +815,8 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev) | |||
| 815 | 815 | ||
| 816 | mutex_init(&rt2x00dev->csr_mutex); | 816 | mutex_init(&rt2x00dev->csr_mutex); |
| 817 | 817 | ||
| 818 | set_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags); | ||
| 819 | |||
| 818 | /* | 820 | /* |
| 819 | * Make room for rt2x00_intf inside the per-interface | 821 | * Make room for rt2x00_intf inside the per-interface |
| 820 | * structure ieee80211_vif. | 822 | * structure ieee80211_vif. |
| @@ -871,8 +873,6 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev) | |||
| 871 | rt2x00leds_register(rt2x00dev); | 873 | rt2x00leds_register(rt2x00dev); |
| 872 | rt2x00debug_register(rt2x00dev); | 874 | rt2x00debug_register(rt2x00dev); |
| 873 | 875 | ||
| 874 | set_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags); | ||
| 875 | |||
| 876 | return 0; | 876 | return 0; |
| 877 | 877 | ||
| 878 | exit: | 878 | exit: |
diff --git a/drivers/net/wireless/rt2x00/rt2x00link.c b/drivers/net/wireless/rt2x00/rt2x00link.c index c64db0ba7f40..c708d0be9155 100644 --- a/drivers/net/wireless/rt2x00/rt2x00link.c +++ b/drivers/net/wireless/rt2x00/rt2x00link.c | |||
| @@ -362,8 +362,9 @@ void rt2x00link_start_tuner(struct rt2x00_dev *rt2x00dev) | |||
| 362 | 362 | ||
| 363 | rt2x00link_reset_tuner(rt2x00dev, false); | 363 | rt2x00link_reset_tuner(rt2x00dev, false); |
| 364 | 364 | ||
| 365 | ieee80211_queue_delayed_work(rt2x00dev->hw, | 365 | if (test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags)) |
| 366 | &link->work, LINK_TUNE_INTERVAL); | 366 | ieee80211_queue_delayed_work(rt2x00dev->hw, |
| 367 | &link->work, LINK_TUNE_INTERVAL); | ||
| 367 | } | 368 | } |
| 368 | 369 | ||
| 369 | void rt2x00link_stop_tuner(struct rt2x00_dev *rt2x00dev) | 370 | void rt2x00link_stop_tuner(struct rt2x00_dev *rt2x00dev) |
| @@ -469,8 +470,10 @@ static void rt2x00link_tuner(struct work_struct *work) | |||
| 469 | * Increase tuner counter, and reschedule the next link tuner run. | 470 | * Increase tuner counter, and reschedule the next link tuner run. |
| 470 | */ | 471 | */ |
| 471 | link->count++; | 472 | link->count++; |
| 472 | ieee80211_queue_delayed_work(rt2x00dev->hw, | 473 | |
| 473 | &link->work, LINK_TUNE_INTERVAL); | 474 | if (test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags)) |
| 475 | ieee80211_queue_delayed_work(rt2x00dev->hw, | ||
| 476 | &link->work, LINK_TUNE_INTERVAL); | ||
| 474 | } | 477 | } |
| 475 | 478 | ||
| 476 | void rt2x00link_register(struct rt2x00_dev *rt2x00dev) | 479 | void rt2x00link_register(struct rt2x00_dev *rt2x00dev) |
diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.c b/drivers/net/wireless/rt2x00/rt2x00usb.c index 501544882c2c..f02b48a90593 100644 --- a/drivers/net/wireless/rt2x00/rt2x00usb.c +++ b/drivers/net/wireless/rt2x00/rt2x00usb.c | |||
| @@ -47,6 +47,8 @@ int rt2x00usb_vendor_request(struct rt2x00_dev *rt2x00dev, | |||
| 47 | (requesttype == USB_VENDOR_REQUEST_IN) ? | 47 | (requesttype == USB_VENDOR_REQUEST_IN) ? |
| 48 | usb_rcvctrlpipe(usb_dev, 0) : usb_sndctrlpipe(usb_dev, 0); | 48 | usb_rcvctrlpipe(usb_dev, 0) : usb_sndctrlpipe(usb_dev, 0); |
| 49 | 49 | ||
| 50 | if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags)) | ||
| 51 | return -ENODEV; | ||
| 50 | 52 | ||
| 51 | for (i = 0; i < REGISTER_BUSY_COUNT; i++) { | 53 | for (i = 0; i < REGISTER_BUSY_COUNT; i++) { |
| 52 | status = usb_control_msg(usb_dev, pipe, request, requesttype, | 54 | status = usb_control_msg(usb_dev, pipe, request, requesttype, |
| @@ -60,8 +62,10 @@ int rt2x00usb_vendor_request(struct rt2x00_dev *rt2x00dev, | |||
| 60 | * -ENODEV: Device has disappeared, no point continuing. | 62 | * -ENODEV: Device has disappeared, no point continuing. |
| 61 | * All other errors: Try again. | 63 | * All other errors: Try again. |
| 62 | */ | 64 | */ |
| 63 | else if (status == -ENODEV) | 65 | else if (status == -ENODEV) { |
| 66 | clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags); | ||
| 64 | break; | 67 | break; |
| 68 | } | ||
| 65 | } | 69 | } |
| 66 | 70 | ||
| 67 | ERROR(rt2x00dev, | 71 | ERROR(rt2x00dev, |
| @@ -161,6 +165,9 @@ int rt2x00usb_regbusy_read(struct rt2x00_dev *rt2x00dev, | |||
| 161 | { | 165 | { |
| 162 | unsigned int i; | 166 | unsigned int i; |
| 163 | 167 | ||
| 168 | if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags)) | ||
| 169 | return -ENODEV; | ||
| 170 | |||
| 164 | for (i = 0; i < REGISTER_BUSY_COUNT; i++) { | 171 | for (i = 0; i < REGISTER_BUSY_COUNT; i++) { |
| 165 | rt2x00usb_register_read_lock(rt2x00dev, offset, reg); | 172 | rt2x00usb_register_read_lock(rt2x00dev, offset, reg); |
| 166 | if (!rt2x00_get_field32(*reg, field)) | 173 | if (!rt2x00_get_field32(*reg, field)) |
diff --git a/drivers/net/wireless/rtl818x/rtl8187_leds.c b/drivers/net/wireless/rtl818x/rtl8187_leds.c index a1c670fc1552..cf8a4a40fdf6 100644 --- a/drivers/net/wireless/rtl818x/rtl8187_leds.c +++ b/drivers/net/wireless/rtl818x/rtl8187_leds.c | |||
| @@ -210,10 +210,10 @@ void rtl8187_leds_exit(struct ieee80211_hw *dev) | |||
| 210 | 210 | ||
| 211 | /* turn the LED off before exiting */ | 211 | /* turn the LED off before exiting */ |
| 212 | ieee80211_queue_delayed_work(dev, &priv->led_off, 0); | 212 | ieee80211_queue_delayed_work(dev, &priv->led_off, 0); |
| 213 | cancel_delayed_work_sync(&priv->led_off); | ||
| 214 | cancel_delayed_work_sync(&priv->led_on); | ||
| 215 | rtl8187_unregister_led(&priv->led_rx); | 213 | rtl8187_unregister_led(&priv->led_rx); |
| 216 | rtl8187_unregister_led(&priv->led_tx); | 214 | rtl8187_unregister_led(&priv->led_tx); |
| 215 | cancel_delayed_work_sync(&priv->led_off); | ||
| 216 | cancel_delayed_work_sync(&priv->led_on); | ||
| 217 | } | 217 | } |
| 218 | #endif /* def CONFIG_RTL8187_LED */ | 218 | #endif /* def CONFIG_RTL8187_LED */ |
| 219 | 219 | ||
