diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-11-09 12:51:42 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-11-09 12:51:42 -0500 |
| commit | 1ce55238e2dd46b978b098a85cb3d3ea494e4a93 (patch) | |
| tree | 523254dbb402b1850d693f0c1f1a1db6e865456d /drivers/net | |
| parent | aa907639f1d9fe0e3274b4f6c1088542f750a539 (diff) | |
| parent | 2606289779cb297320a185db5997729d29b6700b (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (34 commits)
net/fsl_pq_mdio: add module license GPL
can: fix WARN_ON dump in net/core/rtnetlink.c:rtmsg_ifinfo()
can: should not use __dev_get_by_index() without locks
hisax: remove bad udelay call to fix build error on ARM
ipip: Fix handling of DF packets when pmtudisc is OFF
qlge: Set PCIe reset type for EEH to fundamental.
qlge: Fix early exit from mbox cmd complete wait.
ixgbe: fix traffic hangs on Tx with ioatdma loaded
ixgbe: Fix checking TFCS register for TXOFF status when DCB is enabled
ixgbe: Fix gso_max_size for 82599 when DCB is enabled
macsonic: fix crash on PowerBook 520
NET: cassini, fix lock imbalance
ems_usb: Fix byte order issues on big endian machines
be2net: Bug fix to send config commands to hardware after netdev_register
be2net: fix to set proper flow control on resume
netfilter: xt_connlimit: fix regression caused by zero family value
rt2x00: Don't queue ieee80211 work after USB removal
Revert "ipw2200: fix oops on missing firmware"
decnet: netdevice refcount leak
netfilter: nf_nat: fix NAT issue in 2.6.30.4+
...
Diffstat (limited to 'drivers/net')
24 files changed, 262 insertions, 113 deletions
diff --git a/drivers/net/benet/be.h b/drivers/net/benet/be.h index a80da0e14a52..3b79a225628a 100644 --- a/drivers/net/benet/be.h +++ b/drivers/net/benet/be.h | |||
| @@ -259,6 +259,8 @@ struct be_adapter { | |||
| 259 | u32 port_num; | 259 | u32 port_num; |
| 260 | bool promiscuous; | 260 | bool promiscuous; |
| 261 | u32 cap; | 261 | u32 cap; |
| 262 | u32 rx_fc; /* Rx flow control */ | ||
| 263 | u32 tx_fc; /* Tx flow control */ | ||
| 262 | }; | 264 | }; |
| 263 | 265 | ||
| 264 | extern const struct ethtool_ops be_ethtool_ops; | 266 | extern const struct ethtool_ops be_ethtool_ops; |
diff --git a/drivers/net/benet/be_cmds.h b/drivers/net/benet/be_cmds.h index 49953787e41c..e5f9676cf1bc 100644 --- a/drivers/net/benet/be_cmds.h +++ b/drivers/net/benet/be_cmds.h | |||
| @@ -68,7 +68,7 @@ enum { | |||
| 68 | #define CQE_STATUS_COMPL_MASK 0xFFFF | 68 | #define CQE_STATUS_COMPL_MASK 0xFFFF |
| 69 | #define CQE_STATUS_COMPL_SHIFT 0 /* bits 0 - 15 */ | 69 | #define CQE_STATUS_COMPL_SHIFT 0 /* bits 0 - 15 */ |
| 70 | #define CQE_STATUS_EXTD_MASK 0xFFFF | 70 | #define CQE_STATUS_EXTD_MASK 0xFFFF |
| 71 | #define CQE_STATUS_EXTD_SHIFT 0 /* bits 0 - 15 */ | 71 | #define CQE_STATUS_EXTD_SHIFT 16 /* bits 16 - 31 */ |
| 72 | 72 | ||
| 73 | struct be_mcc_compl { | 73 | struct be_mcc_compl { |
| 74 | u32 status; /* dword 0 */ | 74 | u32 status; /* dword 0 */ |
diff --git a/drivers/net/benet/be_ethtool.c b/drivers/net/benet/be_ethtool.c index cda5bf2fc50a..f0fd95b43c07 100644 --- a/drivers/net/benet/be_ethtool.c +++ b/drivers/net/benet/be_ethtool.c | |||
| @@ -323,10 +323,12 @@ be_set_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *ecmd) | |||
| 323 | 323 | ||
| 324 | if (ecmd->autoneg != 0) | 324 | if (ecmd->autoneg != 0) |
| 325 | return -EINVAL; | 325 | return -EINVAL; |
| 326 | adapter->tx_fc = ecmd->tx_pause; | ||
| 327 | adapter->rx_fc = ecmd->rx_pause; | ||
| 326 | 328 | ||
| 327 | status = be_cmd_set_flow_control(adapter, ecmd->tx_pause, | 329 | status = be_cmd_set_flow_control(adapter, |
| 328 | ecmd->rx_pause); | 330 | adapter->tx_fc, adapter->rx_fc); |
| 329 | if (!status) | 331 | if (status) |
| 330 | dev_warn(&adapter->pdev->dev, "Pause param set failed.\n"); | 332 | dev_warn(&adapter->pdev->dev, "Pause param set failed.\n"); |
| 331 | 333 | ||
| 332 | return status; | 334 | return status; |
diff --git a/drivers/net/benet/be_main.c b/drivers/net/benet/be_main.c index 1f941f027718..876b357101fa 100644 --- a/drivers/net/benet/be_main.c +++ b/drivers/net/benet/be_main.c | |||
| @@ -1610,11 +1610,21 @@ static int be_open(struct net_device *netdev) | |||
| 1610 | 1610 | ||
| 1611 | status = be_cmd_link_status_query(adapter, &link_up); | 1611 | status = be_cmd_link_status_query(adapter, &link_up); |
| 1612 | if (status) | 1612 | if (status) |
| 1613 | return status; | 1613 | goto ret_sts; |
| 1614 | be_link_status_update(adapter, link_up); | 1614 | be_link_status_update(adapter, link_up); |
| 1615 | 1615 | ||
| 1616 | status = be_vid_config(adapter); | ||
| 1617 | if (status) | ||
| 1618 | goto ret_sts; | ||
| 1619 | |||
| 1620 | status = be_cmd_set_flow_control(adapter, | ||
| 1621 | adapter->tx_fc, adapter->rx_fc); | ||
| 1622 | if (status) | ||
| 1623 | goto ret_sts; | ||
| 1624 | |||
| 1616 | schedule_delayed_work(&adapter->work, msecs_to_jiffies(100)); | 1625 | schedule_delayed_work(&adapter->work, msecs_to_jiffies(100)); |
| 1617 | return 0; | 1626 | ret_sts: |
| 1627 | return status; | ||
| 1618 | } | 1628 | } |
| 1619 | 1629 | ||
| 1620 | static int be_setup(struct be_adapter *adapter) | 1630 | static int be_setup(struct be_adapter *adapter) |
| @@ -1648,17 +1658,8 @@ static int be_setup(struct be_adapter *adapter) | |||
| 1648 | if (status != 0) | 1658 | if (status != 0) |
| 1649 | goto rx_qs_destroy; | 1659 | goto rx_qs_destroy; |
| 1650 | 1660 | ||
| 1651 | status = be_vid_config(adapter); | ||
| 1652 | if (status != 0) | ||
| 1653 | goto mccqs_destroy; | ||
| 1654 | |||
| 1655 | status = be_cmd_set_flow_control(adapter, true, true); | ||
| 1656 | if (status != 0) | ||
| 1657 | goto mccqs_destroy; | ||
| 1658 | return 0; | 1661 | return 0; |
| 1659 | 1662 | ||
| 1660 | mccqs_destroy: | ||
| 1661 | be_mcc_queues_destroy(adapter); | ||
| 1662 | rx_qs_destroy: | 1663 | rx_qs_destroy: |
| 1663 | be_rx_queues_destroy(adapter); | 1664 | be_rx_queues_destroy(adapter); |
| 1664 | tx_qs_destroy: | 1665 | tx_qs_destroy: |
| @@ -1909,6 +1910,10 @@ static void be_netdev_init(struct net_device *netdev) | |||
| 1909 | 1910 | ||
| 1910 | adapter->rx_csum = true; | 1911 | adapter->rx_csum = true; |
| 1911 | 1912 | ||
| 1913 | /* Default settings for Rx and Tx flow control */ | ||
| 1914 | adapter->rx_fc = true; | ||
| 1915 | adapter->tx_fc = true; | ||
| 1916 | |||
| 1912 | netif_set_gso_max_size(netdev, 65535); | 1917 | netif_set_gso_max_size(netdev, 65535); |
| 1913 | 1918 | ||
| 1914 | BE_SET_NETDEV_OPS(netdev, &be_netdev_ops); | 1919 | BE_SET_NETDEV_OPS(netdev, &be_netdev_ops); |
| @@ -2171,6 +2176,7 @@ static int be_suspend(struct pci_dev *pdev, pm_message_t state) | |||
| 2171 | be_close(netdev); | 2176 | be_close(netdev); |
| 2172 | rtnl_unlock(); | 2177 | rtnl_unlock(); |
| 2173 | } | 2178 | } |
| 2179 | be_cmd_get_flow_control(adapter, &adapter->tx_fc, &adapter->rx_fc); | ||
| 2174 | be_clear(adapter); | 2180 | be_clear(adapter); |
| 2175 | 2181 | ||
| 2176 | pci_save_state(pdev); | 2182 | pci_save_state(pdev); |
diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c index f0b9a1e1db46..564e31c9fee4 100644 --- a/drivers/net/can/dev.c +++ b/drivers/net/can/dev.c | |||
| @@ -589,6 +589,22 @@ static int can_changelink(struct net_device *dev, | |||
| 589 | return 0; | 589 | return 0; |
| 590 | } | 590 | } |
| 591 | 591 | ||
| 592 | static size_t can_get_size(const struct net_device *dev) | ||
| 593 | { | ||
| 594 | struct can_priv *priv = netdev_priv(dev); | ||
| 595 | size_t size; | ||
| 596 | |||
| 597 | size = nla_total_size(sizeof(u32)); /* IFLA_CAN_STATE */ | ||
| 598 | size += sizeof(struct can_ctrlmode); /* IFLA_CAN_CTRLMODE */ | ||
| 599 | size += nla_total_size(sizeof(u32)); /* IFLA_CAN_RESTART_MS */ | ||
| 600 | size += sizeof(struct can_bittiming); /* IFLA_CAN_BITTIMING */ | ||
| 601 | size += sizeof(struct can_clock); /* IFLA_CAN_CLOCK */ | ||
| 602 | if (priv->bittiming_const) /* IFLA_CAN_BITTIMING_CONST */ | ||
| 603 | size += sizeof(struct can_bittiming_const); | ||
| 604 | |||
| 605 | return size; | ||
| 606 | } | ||
| 607 | |||
| 592 | static int can_fill_info(struct sk_buff *skb, const struct net_device *dev) | 608 | static int can_fill_info(struct sk_buff *skb, const struct net_device *dev) |
| 593 | { | 609 | { |
| 594 | struct can_priv *priv = netdev_priv(dev); | 610 | struct can_priv *priv = netdev_priv(dev); |
| @@ -639,6 +655,7 @@ static struct rtnl_link_ops can_link_ops __read_mostly = { | |||
| 639 | .setup = can_setup, | 655 | .setup = can_setup, |
| 640 | .newlink = can_newlink, | 656 | .newlink = can_newlink, |
| 641 | .changelink = can_changelink, | 657 | .changelink = can_changelink, |
| 658 | .get_size = can_get_size, | ||
| 642 | .fill_info = can_fill_info, | 659 | .fill_info = can_fill_info, |
| 643 | .fill_xstats = can_fill_xstats, | 660 | .fill_xstats = can_fill_xstats, |
| 644 | }; | 661 | }; |
diff --git a/drivers/net/can/usb/ems_usb.c b/drivers/net/can/usb/ems_usb.c index 9012e0abc626..abdbd9c2b788 100644 --- a/drivers/net/can/usb/ems_usb.c +++ b/drivers/net/can/usb/ems_usb.c | |||
| @@ -319,7 +319,7 @@ static void ems_usb_rx_can_msg(struct ems_usb *dev, struct ems_cpc_msg *msg) | |||
| 319 | 319 | ||
| 320 | cf = (struct can_frame *)skb_put(skb, sizeof(struct can_frame)); | 320 | cf = (struct can_frame *)skb_put(skb, sizeof(struct can_frame)); |
| 321 | 321 | ||
| 322 | cf->can_id = msg->msg.can_msg.id; | 322 | cf->can_id = le32_to_cpu(msg->msg.can_msg.id); |
| 323 | cf->can_dlc = min_t(u8, msg->msg.can_msg.length, 8); | 323 | cf->can_dlc = min_t(u8, msg->msg.can_msg.length, 8); |
| 324 | 324 | ||
| 325 | if (msg->type == CPC_MSG_TYPE_EXT_CAN_FRAME | 325 | if (msg->type == CPC_MSG_TYPE_EXT_CAN_FRAME |
| @@ -813,6 +813,9 @@ static netdev_tx_t ems_usb_start_xmit(struct sk_buff *skb, struct net_device *ne | |||
| 813 | msg->length = CPC_CAN_MSG_MIN_SIZE + cf->can_dlc; | 813 | msg->length = CPC_CAN_MSG_MIN_SIZE + cf->can_dlc; |
| 814 | } | 814 | } |
| 815 | 815 | ||
| 816 | /* Respect byte order */ | ||
| 817 | msg->msg.can_msg.id = cpu_to_le32(msg->msg.can_msg.id); | ||
| 818 | |||
| 816 | for (i = 0; i < MAX_TX_URBS; i++) { | 819 | for (i = 0; i < MAX_TX_URBS; i++) { |
| 817 | if (dev->tx_contexts[i].echo_index == MAX_TX_URBS) { | 820 | if (dev->tx_contexts[i].echo_index == MAX_TX_URBS) { |
| 818 | context = &dev->tx_contexts[i]; | 821 | 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/davinci_emac.c b/drivers/net/davinci_emac.c index f72c56dec33c..3179521aee90 100644 --- a/drivers/net/davinci_emac.c +++ b/drivers/net/davinci_emac.c | |||
| @@ -2221,7 +2221,7 @@ void emac_poll_controller(struct net_device *ndev) | |||
| 2221 | struct emac_priv *priv = netdev_priv(ndev); | 2221 | struct emac_priv *priv = netdev_priv(ndev); |
| 2222 | 2222 | ||
| 2223 | emac_int_disable(priv); | 2223 | emac_int_disable(priv); |
| 2224 | emac_irq(ndev->irq, priv); | 2224 | emac_irq(ndev->irq, ndev); |
| 2225 | emac_int_enable(priv); | 2225 | emac_int_enable(priv); |
| 2226 | } | 2226 | } |
| 2227 | #endif | 2227 | #endif |
diff --git a/drivers/net/fsl_pq_mdio.c b/drivers/net/fsl_pq_mdio.c index 6ac464866972..efbf67689eca 100644 --- a/drivers/net/fsl_pq_mdio.c +++ b/drivers/net/fsl_pq_mdio.c | |||
| @@ -427,3 +427,4 @@ void fsl_pq_mdio_exit(void) | |||
| 427 | of_unregister_platform_driver(&fsl_pq_mdio_driver); | 427 | of_unregister_platform_driver(&fsl_pq_mdio_driver); |
| 428 | } | 428 | } |
| 429 | module_exit(fsl_pq_mdio_exit); | 429 | module_exit(fsl_pq_mdio_exit); |
| 430 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index cbb143ca1eb8..5bd9e6bf6f2f 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[] = |
| @@ -226,6 +227,56 @@ static void ixgbe_unmap_and_free_tx_resource(struct ixgbe_adapter *adapter, | |||
| 226 | /* tx_buffer_info must be completely set up in the transmit path */ | 227 | /* tx_buffer_info must be completely set up in the transmit path */ |
| 227 | } | 228 | } |
| 228 | 229 | ||
| 230 | /** | ||
| 231 | * ixgbe_tx_is_paused - check if the tx ring is paused | ||
| 232 | * @adapter: the ixgbe adapter | ||
| 233 | * @tx_ring: the corresponding tx_ring | ||
| 234 | * | ||
| 235 | * If not in DCB mode, checks TFCS.TXOFF, otherwise, find out the | ||
| 236 | * corresponding TC of this tx_ring when checking TFCS. | ||
| 237 | * | ||
| 238 | * Returns : true if paused | ||
| 239 | */ | ||
| 240 | static inline bool ixgbe_tx_is_paused(struct ixgbe_adapter *adapter, | ||
| 241 | struct ixgbe_ring *tx_ring) | ||
| 242 | { | ||
| 243 | int tc; | ||
| 244 | u32 txoff = IXGBE_TFCS_TXOFF; | ||
| 245 | |||
| 246 | #ifdef CONFIG_IXGBE_DCB | ||
| 247 | if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) { | ||
| 248 | int reg_idx = tx_ring->reg_idx; | ||
| 249 | int dcb_i = adapter->ring_feature[RING_F_DCB].indices; | ||
| 250 | |||
| 251 | if (adapter->hw.mac.type == ixgbe_mac_82598EB) { | ||
| 252 | tc = reg_idx >> 2; | ||
| 253 | txoff = IXGBE_TFCS_TXOFF0; | ||
| 254 | } else if (adapter->hw.mac.type == ixgbe_mac_82599EB) { | ||
| 255 | tc = 0; | ||
| 256 | txoff = IXGBE_TFCS_TXOFF; | ||
| 257 | if (dcb_i == 8) { | ||
| 258 | /* TC0, TC1 */ | ||
| 259 | tc = reg_idx >> 5; | ||
| 260 | if (tc == 2) /* TC2, TC3 */ | ||
| 261 | tc += (reg_idx - 64) >> 4; | ||
| 262 | else if (tc == 3) /* TC4, TC5, TC6, TC7 */ | ||
| 263 | tc += 1 + ((reg_idx - 96) >> 3); | ||
| 264 | } else if (dcb_i == 4) { | ||
| 265 | /* TC0, TC1 */ | ||
| 266 | tc = reg_idx >> 6; | ||
| 267 | if (tc == 1) { | ||
| 268 | tc += (reg_idx - 64) >> 5; | ||
| 269 | if (tc == 2) /* TC2, TC3 */ | ||
| 270 | tc += (reg_idx - 96) >> 4; | ||
| 271 | } | ||
| 272 | } | ||
| 273 | } | ||
| 274 | txoff <<= tc; | ||
| 275 | } | ||
| 276 | #endif | ||
| 277 | return IXGBE_READ_REG(&adapter->hw, IXGBE_TFCS) & txoff; | ||
| 278 | } | ||
| 279 | |||
| 229 | static inline bool ixgbe_check_tx_hang(struct ixgbe_adapter *adapter, | 280 | static inline bool ixgbe_check_tx_hang(struct ixgbe_adapter *adapter, |
| 230 | struct ixgbe_ring *tx_ring, | 281 | struct ixgbe_ring *tx_ring, |
| 231 | unsigned int eop) | 282 | unsigned int eop) |
| @@ -237,7 +288,7 @@ static inline bool ixgbe_check_tx_hang(struct ixgbe_adapter *adapter, | |||
| 237 | adapter->detect_tx_hung = false; | 288 | adapter->detect_tx_hung = false; |
| 238 | if (tx_ring->tx_buffer_info[eop].time_stamp && | 289 | if (tx_ring->tx_buffer_info[eop].time_stamp && |
| 239 | time_after(jiffies, tx_ring->tx_buffer_info[eop].time_stamp + HZ) && | 290 | time_after(jiffies, tx_ring->tx_buffer_info[eop].time_stamp + HZ) && |
| 240 | !(IXGBE_READ_REG(&adapter->hw, IXGBE_TFCS) & IXGBE_TFCS_TXOFF)) { | 291 | !ixgbe_tx_is_paused(adapter, tx_ring)) { |
| 241 | /* detected Tx unit hang */ | 292 | /* detected Tx unit hang */ |
| 242 | union ixgbe_adv_tx_desc *tx_desc; | 293 | union ixgbe_adv_tx_desc *tx_desc; |
| 243 | tx_desc = IXGBE_TX_DESC_ADV(*tx_ring, eop); | 294 | tx_desc = IXGBE_TX_DESC_ADV(*tx_ring, eop); |
| @@ -412,19 +463,23 @@ static void ixgbe_update_tx_dca(struct ixgbe_adapter *adapter, | |||
| 412 | u32 txctrl; | 463 | u32 txctrl; |
| 413 | int cpu = get_cpu(); | 464 | int cpu = get_cpu(); |
| 414 | int q = tx_ring - adapter->tx_ring; | 465 | int q = tx_ring - adapter->tx_ring; |
| 466 | struct ixgbe_hw *hw = &adapter->hw; | ||
| 415 | 467 | ||
| 416 | if (tx_ring->cpu != cpu) { | 468 | if (tx_ring->cpu != cpu) { |
| 417 | txctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_DCA_TXCTRL(q)); | ||
| 418 | if (adapter->hw.mac.type == ixgbe_mac_82598EB) { | 469 | if (adapter->hw.mac.type == ixgbe_mac_82598EB) { |
| 470 | txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(q)); | ||
| 419 | txctrl &= ~IXGBE_DCA_TXCTRL_CPUID_MASK; | 471 | txctrl &= ~IXGBE_DCA_TXCTRL_CPUID_MASK; |
| 420 | txctrl |= dca3_get_tag(&adapter->pdev->dev, cpu); | 472 | txctrl |= dca3_get_tag(&adapter->pdev->dev, cpu); |
| 473 | txctrl |= IXGBE_DCA_TXCTRL_DESC_DCA_EN; | ||
| 474 | IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(q), txctrl); | ||
| 421 | } else if (adapter->hw.mac.type == ixgbe_mac_82599EB) { | 475 | } else if (adapter->hw.mac.type == ixgbe_mac_82599EB) { |
| 476 | txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL_82599(q)); | ||
| 422 | txctrl &= ~IXGBE_DCA_TXCTRL_CPUID_MASK_82599; | 477 | txctrl &= ~IXGBE_DCA_TXCTRL_CPUID_MASK_82599; |
| 423 | txctrl |= (dca3_get_tag(&adapter->pdev->dev, cpu) << | 478 | txctrl |= (dca3_get_tag(&adapter->pdev->dev, cpu) << |
| 424 | IXGBE_DCA_TXCTRL_CPUID_SHIFT_82599); | 479 | IXGBE_DCA_TXCTRL_CPUID_SHIFT_82599); |
| 480 | txctrl |= IXGBE_DCA_TXCTRL_DESC_DCA_EN; | ||
| 481 | IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL_82599(q), txctrl); | ||
| 425 | } | 482 | } |
| 426 | txctrl |= IXGBE_DCA_TXCTRL_DESC_DCA_EN; | ||
| 427 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_DCA_TXCTRL(q), txctrl); | ||
| 428 | tx_ring->cpu = cpu; | 483 | tx_ring->cpu = cpu; |
| 429 | } | 484 | } |
| 430 | put_cpu(); | 485 | put_cpu(); |
| @@ -1913,11 +1968,25 @@ static void ixgbe_configure_tx(struct ixgbe_adapter *adapter) | |||
| 1913 | break; | 1968 | break; |
| 1914 | } | 1969 | } |
| 1915 | } | 1970 | } |
| 1971 | |||
| 1916 | if (hw->mac.type == ixgbe_mac_82599EB) { | 1972 | if (hw->mac.type == ixgbe_mac_82599EB) { |
| 1973 | u32 rttdcs; | ||
| 1974 | |||
| 1975 | /* disable the arbiter while setting MTQC */ | ||
| 1976 | rttdcs = IXGBE_READ_REG(hw, IXGBE_RTTDCS); | ||
| 1977 | rttdcs |= IXGBE_RTTDCS_ARBDIS; | ||
| 1978 | IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs); | ||
| 1979 | |||
| 1917 | /* We enable 8 traffic classes, DCB only */ | 1980 | /* We enable 8 traffic classes, DCB only */ |
| 1918 | if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) | 1981 | if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) |
| 1919 | IXGBE_WRITE_REG(hw, IXGBE_MTQC, (IXGBE_MTQC_RT_ENA | | 1982 | IXGBE_WRITE_REG(hw, IXGBE_MTQC, (IXGBE_MTQC_RT_ENA | |
| 1920 | IXGBE_MTQC_8TC_8TQ)); | 1983 | IXGBE_MTQC_8TC_8TQ)); |
| 1984 | else | ||
| 1985 | IXGBE_WRITE_REG(hw, IXGBE_MTQC, IXGBE_MTQC_64Q_1PB); | ||
| 1986 | |||
| 1987 | /* re-eable the arbiter */ | ||
| 1988 | rttdcs &= ~IXGBE_RTTDCS_ARBDIS; | ||
| 1989 | IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs); | ||
| 1921 | } | 1990 | } |
| 1922 | } | 1991 | } |
| 1923 | 1992 | ||
| @@ -2471,7 +2540,10 @@ static void ixgbe_configure(struct ixgbe_adapter *adapter) | |||
| 2471 | ixgbe_restore_vlan(adapter); | 2540 | ixgbe_restore_vlan(adapter); |
| 2472 | #ifdef CONFIG_IXGBE_DCB | 2541 | #ifdef CONFIG_IXGBE_DCB |
| 2473 | if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) { | 2542 | if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) { |
| 2474 | netif_set_gso_max_size(netdev, 32768); | 2543 | if (hw->mac.type == ixgbe_mac_82598EB) |
| 2544 | netif_set_gso_max_size(netdev, 32768); | ||
| 2545 | else | ||
| 2546 | netif_set_gso_max_size(netdev, 65536); | ||
| 2475 | ixgbe_configure_dcb(adapter); | 2547 | ixgbe_configure_dcb(adapter); |
| 2476 | } else { | 2548 | } else { |
| 2477 | netif_set_gso_max_size(netdev, 65536); | 2549 | 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 cea7531f4f40..a2fc70a0d0cc 100644 --- a/drivers/net/qlge/qlge_main.c +++ b/drivers/net/qlge/qlge_main.c | |||
| @@ -3916,6 +3916,8 @@ static int __devinit ql_init_device(struct pci_dev *pdev, | |||
| 3916 | goto err_out; | 3916 | goto err_out; |
| 3917 | } | 3917 | } |
| 3918 | 3918 | ||
| 3919 | /* Set PCIe reset type for EEH to fundamental. */ | ||
| 3920 | pdev->needs_freset = 1; | ||
| 3919 | pci_save_state(pdev); | 3921 | pci_save_state(pdev); |
| 3920 | qdev->reg_base = | 3922 | qdev->reg_base = |
| 3921 | ioremap_nocache(pci_resource_start(pdev, 1), | 3923 | ioremap_nocache(pci_resource_start(pdev, 1), |
diff --git a/drivers/net/qlge/qlge_mpi.c b/drivers/net/qlge/qlge_mpi.c index bcf13c96f73f..aec05f266107 100644 --- a/drivers/net/qlge/qlge_mpi.c +++ b/drivers/net/qlge/qlge_mpi.c | |||
| @@ -499,7 +499,7 @@ static int ql_mailbox_command(struct ql_adapter *qdev, struct mbox_params *mbcp) | |||
| 499 | /* Wait for the interrupt to come in. */ | 499 | /* Wait for the interrupt to come in. */ |
| 500 | status = ql_wait_mbx_cmd_cmplt(qdev); | 500 | status = ql_wait_mbx_cmd_cmplt(qdev); |
| 501 | if (status) | 501 | if (status) |
| 502 | goto end; | 502 | continue; |
| 503 | 503 | ||
| 504 | /* Process the event. If it's an AEN, it | 504 | /* Process the event. If it's an AEN, it |
| 505 | * will be handled in-line or a worker | 505 | * will be handled in-line or a worker |
diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig index c47237c2d638..32d93564a74d 100644 --- a/drivers/net/usb/Kconfig +++ b/drivers/net/usb/Kconfig | |||
| @@ -174,7 +174,7 @@ config USB_NET_CDCETHER | |||
| 174 | * Ericsson Mobile Broadband Module (all variants) | 174 | * Ericsson Mobile Broadband Module (all variants) |
| 175 | * Motorola (DM100 and SB4100) | 175 | * Motorola (DM100 and SB4100) |
| 176 | * Broadcom Cable Modem (reference design) | 176 | * Broadcom Cable Modem (reference design) |
| 177 | * Toshiba (PCX1100U and F3507g) | 177 | * Toshiba (PCX1100U and F3507g/F3607gw) |
| 178 | * ... | 178 | * ... |
| 179 | 179 | ||
| 180 | This driver creates an interface named "ethX", where X depends on | 180 | This driver creates an interface named "ethX", where X depends on |
diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c index 4a6aff579403..21e1ba160008 100644 --- a/drivers/net/usb/cdc_ether.c +++ b/drivers/net/usb/cdc_ether.c | |||
| @@ -544,20 +544,60 @@ static const struct usb_device_id products [] = { | |||
| 544 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | 544 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), |
| 545 | .driver_info = (unsigned long) &cdc_info, | 545 | .driver_info = (unsigned long) &cdc_info, |
| 546 | }, { | 546 | }, { |
| 547 | /* Ericsson F3307 */ | 547 | /* Ericsson F3607gw ver 2 */ |
| 548 | USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1905, USB_CLASS_COMM, | ||
| 549 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | ||
| 550 | .driver_info = (unsigned long) &cdc_info, | ||
| 551 | }, { | ||
| 552 | /* Ericsson F3607gw ver 3 */ | ||
| 548 | USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1906, USB_CLASS_COMM, | 553 | USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1906, USB_CLASS_COMM, |
| 549 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | 554 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), |
| 550 | .driver_info = (unsigned long) &cdc_info, | 555 | .driver_info = (unsigned long) &cdc_info, |
| 551 | }, { | 556 | }, { |
| 557 | /* Ericsson F3307 */ | ||
| 558 | USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x190a, USB_CLASS_COMM, | ||
| 559 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | ||
| 560 | .driver_info = (unsigned long) &cdc_info, | ||
| 561 | }, { | ||
| 562 | /* Ericsson F3307 ver 2 */ | ||
| 563 | USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1909, USB_CLASS_COMM, | ||
| 564 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | ||
| 565 | .driver_info = (unsigned long) &cdc_info, | ||
| 566 | }, { | ||
| 567 | /* Ericsson C3607w */ | ||
| 568 | USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1049, USB_CLASS_COMM, | ||
| 569 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | ||
| 570 | .driver_info = (unsigned long) &cdc_info, | ||
| 571 | }, { | ||
| 552 | /* Toshiba F3507g */ | 572 | /* Toshiba F3507g */ |
| 553 | USB_DEVICE_AND_INTERFACE_INFO(0x0930, 0x130b, USB_CLASS_COMM, | 573 | USB_DEVICE_AND_INTERFACE_INFO(0x0930, 0x130b, USB_CLASS_COMM, |
| 554 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | 574 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), |
| 555 | .driver_info = (unsigned long) &cdc_info, | 575 | .driver_info = (unsigned long) &cdc_info, |
| 556 | }, { | 576 | }, { |
| 577 | /* Toshiba F3607gw */ | ||
| 578 | USB_DEVICE_AND_INTERFACE_INFO(0x0930, 0x130c, USB_CLASS_COMM, | ||
| 579 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | ||
| 580 | .driver_info = (unsigned long) &cdc_info, | ||
| 581 | }, { | ||
| 582 | /* Toshiba F3607gw ver 2 */ | ||
| 583 | USB_DEVICE_AND_INTERFACE_INFO(0x0930, 0x1311, USB_CLASS_COMM, | ||
| 584 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | ||
| 585 | .driver_info = (unsigned long) &cdc_info, | ||
| 586 | }, { | ||
| 557 | /* Dell F3507g */ | 587 | /* Dell F3507g */ |
| 558 | USB_DEVICE_AND_INTERFACE_INFO(0x413c, 0x8147, USB_CLASS_COMM, | 588 | USB_DEVICE_AND_INTERFACE_INFO(0x413c, 0x8147, USB_CLASS_COMM, |
| 559 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | 589 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), |
| 560 | .driver_info = (unsigned long) &cdc_info, | 590 | .driver_info = (unsigned long) &cdc_info, |
| 591 | }, { | ||
| 592 | /* Dell F3607gw */ | ||
| 593 | USB_DEVICE_AND_INTERFACE_INFO(0x413c, 0x8183, USB_CLASS_COMM, | ||
| 594 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | ||
| 595 | .driver_info = (unsigned long) &cdc_info, | ||
| 596 | }, { | ||
| 597 | /* Dell F3607gw ver 2 */ | ||
| 598 | USB_DEVICE_AND_INTERFACE_INFO(0x413c, 0x8184, USB_CLASS_COMM, | ||
| 599 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | ||
| 600 | .driver_info = (unsigned long) &cdc_info, | ||
| 561 | }, | 601 | }, |
| 562 | { }, // END | 602 | { }, // END |
| 563 | }; | 603 | }; |
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 05630f2f6930..b9e002fccbca 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
| @@ -998,7 +998,7 @@ static unsigned int features[] = { | |||
| 998 | VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN, | 998 | VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN, |
| 999 | }; | 999 | }; |
| 1000 | 1000 | ||
| 1001 | static struct virtio_driver virtio_net = { | 1001 | static struct virtio_driver virtio_net_driver = { |
| 1002 | .feature_table = features, | 1002 | .feature_table = features, |
| 1003 | .feature_table_size = ARRAY_SIZE(features), | 1003 | .feature_table_size = ARRAY_SIZE(features), |
| 1004 | .driver.name = KBUILD_MODNAME, | 1004 | .driver.name = KBUILD_MODNAME, |
| @@ -1011,12 +1011,12 @@ static struct virtio_driver virtio_net = { | |||
| 1011 | 1011 | ||
| 1012 | static int __init init(void) | 1012 | static int __init init(void) |
| 1013 | { | 1013 | { |
| 1014 | return register_virtio_driver(&virtio_net); | 1014 | return register_virtio_driver(&virtio_net_driver); |
| 1015 | } | 1015 | } |
| 1016 | 1016 | ||
| 1017 | static void __exit fini(void) | 1017 | static void __exit fini(void) |
| 1018 | { | 1018 | { |
| 1019 | unregister_virtio_driver(&virtio_net); | 1019 | unregister_virtio_driver(&virtio_net_driver); |
| 1020 | } | 1020 | } |
| 1021 | module_init(init); | 1021 | module_init(init); |
| 1022 | module_exit(fini); | 1022 | module_exit(fini); |
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 9b0f2c0646e0..827824d45de9 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 | ||
