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: fix build erros with CONFIG_BUG=n, CONFIG_GENERIC_BUG=n ipv6: skb_dst() can be NULL in ipv6_hop_jumbo(). tg3: Update copyright and driver version tg3: Disable 5717 serdes and B0 support tg3: Add reliable serdes detection for 5717 A0 tg3: Fix std rx prod ring handling tg3: Fix std prod ring nicaddr for 5787 and 57765 sfc: Fix conditions for MDIO self-test sfc: Fix polling for slow MCDI operations e1000e: workaround link issues on busy hub in half duplex on 82577/82578 e1000e: MDIO slow mode should always be done for 82577 ixgbe: update copyright dates ixgbe: Do not attempt to perform interrupts in netpoll when down cfg80211: fix refcount imbalance when wext is disabled mac80211: fix queue selection for data frames on monitor interfaces iwlwifi: silence buffer overflow warning iwlwifi: disable tx on beacon update notification iwlwifi: fix iwl_queue_used bug when read_ptr == write_ptr mac80211: fix endian error mac80211: add missing sanity checks for action frames ...
This commit is contained in:
commit
4a24eef671
|
@ -582,7 +582,6 @@ extern s32 e1000_read_phy_reg_hv_locked(struct e1000_hw *hw, u32 offset,
|
|||
extern s32 e1000_write_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 data);
|
||||
extern s32 e1000_write_phy_reg_hv_locked(struct e1000_hw *hw, u32 offset,
|
||||
u16 data);
|
||||
extern s32 e1000_set_mdio_slow_mode_hv(struct e1000_hw *hw, bool slow);
|
||||
extern s32 e1000_link_stall_workaround_hv(struct e1000_hw *hw);
|
||||
extern s32 e1000_copper_link_setup_82577(struct e1000_hw *hw);
|
||||
extern s32 e1000_check_polarity_82577(struct e1000_hw *hw);
|
||||
|
|
|
@ -138,6 +138,10 @@
|
|||
#define E1000_NVM_K1_CONFIG 0x1B /* NVM K1 Config Word */
|
||||
#define E1000_NVM_K1_ENABLE 0x1 /* NVM Enable K1 bit */
|
||||
|
||||
/* KMRN Mode Control */
|
||||
#define HV_KMRN_MODE_CTRL PHY_REG(769, 16)
|
||||
#define HV_KMRN_MDIO_SLOW 0x0400
|
||||
|
||||
/* ICH GbE Flash Hardware Sequencing Flash Status Register bit breakdown */
|
||||
/* Offset 04h HSFSTS */
|
||||
union ich8_hws_flash_status {
|
||||
|
@ -219,6 +223,7 @@ static s32 e1000_set_lplu_state_pchlan(struct e1000_hw *hw, bool active);
|
|||
static void e1000_power_down_phy_copper_ich8lan(struct e1000_hw *hw);
|
||||
static void e1000_lan_init_done_ich8lan(struct e1000_hw *hw);
|
||||
static s32 e1000_k1_gig_workaround_hv(struct e1000_hw *hw, bool link);
|
||||
static s32 e1000_set_mdio_slow_mode_hv(struct e1000_hw *hw);
|
||||
|
||||
static inline u16 __er16flash(struct e1000_hw *hw, unsigned long reg)
|
||||
{
|
||||
|
@ -270,7 +275,21 @@ static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw)
|
|||
phy->autoneg_mask = AUTONEG_ADVERTISE_SPEED_DEFAULT;
|
||||
|
||||
phy->id = e1000_phy_unknown;
|
||||
e1000e_get_phy_id(hw);
|
||||
ret_val = e1000e_get_phy_id(hw);
|
||||
if (ret_val)
|
||||
goto out;
|
||||
if ((phy->id == 0) || (phy->id == PHY_REVISION_MASK)) {
|
||||
/*
|
||||
* In case the PHY needs to be in mdio slow mode (eg. 82577),
|
||||
* set slow mode and try to get the PHY id again.
|
||||
*/
|
||||
ret_val = e1000_set_mdio_slow_mode_hv(hw);
|
||||
if (ret_val)
|
||||
goto out;
|
||||
ret_val = e1000e_get_phy_id(hw);
|
||||
if (ret_val)
|
||||
goto out;
|
||||
}
|
||||
phy->type = e1000e_get_phy_type_from_id(phy->id);
|
||||
|
||||
switch (phy->type) {
|
||||
|
@ -292,6 +311,7 @@ static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw)
|
|||
break;
|
||||
}
|
||||
|
||||
out:
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
|
@ -1075,6 +1095,26 @@ out:
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* e1000_set_mdio_slow_mode_hv - Set slow MDIO access mode
|
||||
* @hw: pointer to the HW structure
|
||||
**/
|
||||
static s32 e1000_set_mdio_slow_mode_hv(struct e1000_hw *hw)
|
||||
{
|
||||
s32 ret_val;
|
||||
u16 data;
|
||||
|
||||
ret_val = e1e_rphy(hw, HV_KMRN_MODE_CTRL, &data);
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
|
||||
data |= HV_KMRN_MDIO_SLOW;
|
||||
|
||||
ret_val = e1e_wphy(hw, HV_KMRN_MODE_CTRL, data);
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
/**
|
||||
* e1000_hv_phy_workarounds_ich8lan - A series of Phy workarounds to be
|
||||
* done after every PHY reset.
|
||||
|
@ -1082,10 +1122,18 @@ out:
|
|||
static s32 e1000_hv_phy_workarounds_ich8lan(struct e1000_hw *hw)
|
||||
{
|
||||
s32 ret_val = 0;
|
||||
u16 phy_data;
|
||||
|
||||
if (hw->mac.type != e1000_pchlan)
|
||||
return ret_val;
|
||||
|
||||
/* Set MDIO slow mode before any other MDIO access */
|
||||
if (hw->phy.type == e1000_phy_82577) {
|
||||
ret_val = e1000_set_mdio_slow_mode_hv(hw);
|
||||
if (ret_val)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (((hw->phy.type == e1000_phy_82577) &&
|
||||
((hw->phy.revision == 1) || (hw->phy.revision == 2))) ||
|
||||
((hw->phy.type == e1000_phy_82578) && (hw->phy.revision == 1))) {
|
||||
|
@ -1118,16 +1166,32 @@ static s32 e1000_hv_phy_workarounds_ich8lan(struct e1000_hw *hw)
|
|||
|
||||
hw->phy.addr = 1;
|
||||
ret_val = e1000e_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT, 0);
|
||||
hw->phy.ops.release(hw);
|
||||
if (ret_val)
|
||||
goto out;
|
||||
hw->phy.ops.release(hw);
|
||||
|
||||
/*
|
||||
* Configure the K1 Si workaround during phy reset assuming there is
|
||||
* link so that it disables K1 if link is in 1Gbps.
|
||||
*/
|
||||
ret_val = e1000_k1_gig_workaround_hv(hw, true);
|
||||
if (ret_val)
|
||||
goto out;
|
||||
|
||||
/* Workaround for link disconnects on a busy hub in half duplex */
|
||||
ret_val = hw->phy.ops.acquire(hw);
|
||||
if (ret_val)
|
||||
goto out;
|
||||
ret_val = hw->phy.ops.read_reg_locked(hw,
|
||||
PHY_REG(BM_PORT_CTRL_PAGE, 17),
|
||||
&phy_data);
|
||||
if (ret_val)
|
||||
goto release;
|
||||
ret_val = hw->phy.ops.write_reg_locked(hw,
|
||||
PHY_REG(BM_PORT_CTRL_PAGE, 17),
|
||||
phy_data & 0x00FF);
|
||||
release:
|
||||
hw->phy.ops.release(hw);
|
||||
out:
|
||||
return ret_val;
|
||||
}
|
||||
|
@ -1184,6 +1248,7 @@ static s32 e1000_phy_hw_reset_ich8lan(struct e1000_hw *hw)
|
|||
/* Allow time for h/w to get to a quiescent state after reset */
|
||||
mdelay(10);
|
||||
|
||||
/* Perform any necessary post-reset workarounds */
|
||||
if (hw->mac.type == e1000_pchlan) {
|
||||
ret_val = e1000_hv_phy_workarounds_ich8lan(hw);
|
||||
if (ret_val)
|
||||
|
@ -2484,6 +2549,10 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw)
|
|||
if (!ret_val)
|
||||
e1000_release_swflag_ich8lan(hw);
|
||||
|
||||
/* Perform any necessary post-reset workarounds */
|
||||
if (hw->mac.type == e1000_pchlan)
|
||||
ret_val = e1000_hv_phy_workarounds_ich8lan(hw);
|
||||
|
||||
if (ctrl & E1000_CTRL_PHY_RST)
|
||||
ret_val = hw->phy.ops.get_cfg_done(hw);
|
||||
|
||||
|
@ -2528,9 +2597,6 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw)
|
|||
kab |= E1000_KABGTXD_BGSQLBIAS;
|
||||
ew32(KABGTXD, kab);
|
||||
|
||||
if (hw->mac.type == e1000_pchlan)
|
||||
ret_val = e1000_hv_phy_workarounds_ich8lan(hw);
|
||||
|
||||
out:
|
||||
return ret_val;
|
||||
}
|
||||
|
|
|
@ -152,32 +152,9 @@ s32 e1000e_get_phy_id(struct e1000_hw *hw)
|
|||
if (phy->id != 0 && phy->id != PHY_REVISION_MASK)
|
||||
goto out;
|
||||
|
||||
/*
|
||||
* If the PHY ID is still unknown, we may have an 82577
|
||||
* without link. We will try again after setting Slow MDIC
|
||||
* mode. No harm in trying again in this case since the PHY
|
||||
* ID is unknown at this point anyway.
|
||||
*/
|
||||
ret_val = phy->ops.acquire(hw);
|
||||
if (ret_val)
|
||||
goto out;
|
||||
ret_val = e1000_set_mdio_slow_mode_hv(hw, true);
|
||||
if (ret_val)
|
||||
goto out;
|
||||
phy->ops.release(hw);
|
||||
|
||||
retry_count++;
|
||||
}
|
||||
out:
|
||||
/* Revert to MDIO fast mode, if applicable */
|
||||
if (retry_count) {
|
||||
ret_val = phy->ops.acquire(hw);
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
ret_val = e1000_set_mdio_slow_mode_hv(hw, false);
|
||||
phy->ops.release(hw);
|
||||
}
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
|
@ -2790,38 +2767,6 @@ static s32 e1000_set_d0_lplu_state(struct e1000_hw *hw, bool active)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* e1000_set_mdio_slow_mode_hv - Set slow MDIO access mode
|
||||
* @hw: pointer to the HW structure
|
||||
* @slow: true for slow mode, false for normal mode
|
||||
*
|
||||
* Assumes semaphore already acquired.
|
||||
**/
|
||||
s32 e1000_set_mdio_slow_mode_hv(struct e1000_hw *hw, bool slow)
|
||||
{
|
||||
s32 ret_val = 0;
|
||||
u16 data = 0;
|
||||
|
||||
/* Set MDIO mode - page 769, register 16: 0x2580==slow, 0x2180==fast */
|
||||
hw->phy.addr = 1;
|
||||
ret_val = e1000e_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT,
|
||||
(BM_PORT_CTRL_PAGE << IGP_PAGE_SHIFT));
|
||||
if (ret_val)
|
||||
goto out;
|
||||
|
||||
ret_val = e1000e_write_phy_reg_mdic(hw, BM_CS_CTRL1,
|
||||
(0x2180 | (slow << 10)));
|
||||
if (ret_val)
|
||||
goto out;
|
||||
|
||||
/* dummy read when reverting to fast mode - throw away result */
|
||||
if (!slow)
|
||||
ret_val = e1000e_read_phy_reg_mdic(hw, BM_CS_CTRL1, &data);
|
||||
|
||||
out:
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
/**
|
||||
* __e1000_read_phy_reg_hv - Read HV PHY register
|
||||
* @hw: pointer to the HW structure
|
||||
|
@ -2839,7 +2784,6 @@ static s32 __e1000_read_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 *data,
|
|||
s32 ret_val;
|
||||
u16 page = BM_PHY_REG_PAGE(offset);
|
||||
u16 reg = BM_PHY_REG_NUM(offset);
|
||||
bool in_slow_mode = false;
|
||||
|
||||
if (!locked) {
|
||||
ret_val = hw->phy.ops.acquire(hw);
|
||||
|
@ -2847,16 +2791,6 @@ static s32 __e1000_read_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 *data,
|
|||
return ret_val;
|
||||
}
|
||||
|
||||
/* Workaround failure in MDIO access while cable is disconnected */
|
||||
if ((hw->phy.type == e1000_phy_82577) &&
|
||||
!(er32(STATUS) & E1000_STATUS_LU)) {
|
||||
ret_val = e1000_set_mdio_slow_mode_hv(hw, true);
|
||||
if (ret_val)
|
||||
goto out;
|
||||
|
||||
in_slow_mode = true;
|
||||
}
|
||||
|
||||
/* Page 800 works differently than the rest so it has its own func */
|
||||
if (page == BM_WUC_PAGE) {
|
||||
ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset,
|
||||
|
@ -2893,10 +2827,6 @@ static s32 __e1000_read_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 *data,
|
|||
ret_val = e1000e_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & reg,
|
||||
data);
|
||||
out:
|
||||
/* Revert to MDIO fast mode, if applicable */
|
||||
if ((hw->phy.type == e1000_phy_82577) && in_slow_mode)
|
||||
ret_val |= e1000_set_mdio_slow_mode_hv(hw, false);
|
||||
|
||||
if (!locked)
|
||||
hw->phy.ops.release(hw);
|
||||
|
||||
|
@ -2948,7 +2878,6 @@ static s32 __e1000_write_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 data,
|
|||
s32 ret_val;
|
||||
u16 page = BM_PHY_REG_PAGE(offset);
|
||||
u16 reg = BM_PHY_REG_NUM(offset);
|
||||
bool in_slow_mode = false;
|
||||
|
||||
if (!locked) {
|
||||
ret_val = hw->phy.ops.acquire(hw);
|
||||
|
@ -2956,16 +2885,6 @@ static s32 __e1000_write_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 data,
|
|||
return ret_val;
|
||||
}
|
||||
|
||||
/* Workaround failure in MDIO access while cable is disconnected */
|
||||
if ((hw->phy.type == e1000_phy_82577) &&
|
||||
!(er32(STATUS) & E1000_STATUS_LU)) {
|
||||
ret_val = e1000_set_mdio_slow_mode_hv(hw, true);
|
||||
if (ret_val)
|
||||
goto out;
|
||||
|
||||
in_slow_mode = true;
|
||||
}
|
||||
|
||||
/* Page 800 works differently than the rest so it has its own func */
|
||||
if (page == BM_WUC_PAGE) {
|
||||
ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset,
|
||||
|
@ -3019,10 +2938,6 @@ static s32 __e1000_write_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 data,
|
|||
data);
|
||||
|
||||
out:
|
||||
/* Revert to MDIO fast mode, if applicable */
|
||||
if ((hw->phy.type == e1000_phy_82577) && in_slow_mode)
|
||||
ret_val |= e1000_set_mdio_slow_mode_hv(hw, false);
|
||||
|
||||
if (!locked)
|
||||
hw->phy.ops.release(hw);
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
################################################################################
|
||||
#
|
||||
# Intel 10 Gigabit PCI Express Linux driver
|
||||
# Copyright(c) 1999 - 2009 Intel Corporation.
|
||||
# Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it
|
||||
# under the terms and conditions of the GNU General Public License,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2009 Intel Corporation.
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2009 Intel Corporation.
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2009 Intel Corporation.
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2009 Intel Corporation.
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2009 Intel Corporation.
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2009 Intel Corporation.
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2009 Intel Corporation.
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2009 Intel Corporation.
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2009 Intel Corporation.
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2009 Intel Corporation.
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2009 Intel Corporation.
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2009 Intel Corporation.
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2009 Intel Corporation.
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2009 Intel Corporation.
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2009 Intel Corporation.
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2009 Intel Corporation.
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
|
@ -52,7 +52,7 @@ static const char ixgbe_driver_string[] =
|
|||
|
||||
#define DRV_VERSION "2.0.44-k2"
|
||||
const char ixgbe_driver_version[] = DRV_VERSION;
|
||||
static char ixgbe_copyright[] = "Copyright (c) 1999-2009 Intel Corporation.";
|
||||
static char ixgbe_copyright[] = "Copyright (c) 1999-2010 Intel Corporation.";
|
||||
|
||||
static const struct ixgbe_info *ixgbe_info_tbl[] = {
|
||||
[board_82598] = &ixgbe_82598_info,
|
||||
|
@ -5576,6 +5576,10 @@ static void ixgbe_netpoll(struct net_device *netdev)
|
|||
struct ixgbe_adapter *adapter = netdev_priv(netdev);
|
||||
int i;
|
||||
|
||||
/* if interface is down do nothing */
|
||||
if (test_bit(__IXGBE_DOWN, &adapter->state))
|
||||
return;
|
||||
|
||||
adapter->flags |= IXGBE_FLAG_IN_NETPOLL;
|
||||
if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) {
|
||||
int num_q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2009 Intel Corporation.
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2009 Intel Corporation.
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2009 Intel Corporation.
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
|
|
|
@ -142,8 +142,9 @@ static int efx_mcdi_poll(struct efx_nic *efx)
|
|||
if (spins != 0) {
|
||||
--spins;
|
||||
udelay(1);
|
||||
} else
|
||||
schedule();
|
||||
} else {
|
||||
schedule_timeout_uninterruptible(1);
|
||||
}
|
||||
|
||||
time = get_seconds();
|
||||
|
||||
|
|
|
@ -79,10 +79,14 @@ struct efx_loopback_state {
|
|||
static int efx_test_mdio(struct efx_nic *efx, struct efx_self_tests *tests)
|
||||
{
|
||||
int rc = 0;
|
||||
int devad = __ffs(efx->mdio.mmds);
|
||||
int devad;
|
||||
u16 physid1, physid2;
|
||||
|
||||
if (efx->phy_type == PHY_TYPE_NONE)
|
||||
if (efx->mdio.mode_support & MDIO_SUPPORTS_C45)
|
||||
devad = __ffs(efx->mdio.mmds);
|
||||
else if (efx->mdio.mode_support & MDIO_SUPPORTS_C22)
|
||||
devad = MDIO_DEVAD_NONE;
|
||||
else
|
||||
return 0;
|
||||
|
||||
mutex_lock(&efx->mac_lock);
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* Copyright (C) 2001, 2002, 2003, 2004 David S. Miller (davem@redhat.com)
|
||||
* Copyright (C) 2001, 2002, 2003 Jeff Garzik (jgarzik@pobox.com)
|
||||
* Copyright (C) 2004 Sun Microsystems Inc.
|
||||
* Copyright (C) 2005-2009 Broadcom Corporation.
|
||||
* Copyright (C) 2005-2010 Broadcom Corporation.
|
||||
*
|
||||
* Firmware is:
|
||||
* Derived from proprietary unpublished source code,
|
||||
|
@ -68,8 +68,8 @@
|
|||
|
||||
#define DRV_MODULE_NAME "tg3"
|
||||
#define PFX DRV_MODULE_NAME ": "
|
||||
#define DRV_MODULE_VERSION "3.105"
|
||||
#define DRV_MODULE_RELDATE "December 2, 2009"
|
||||
#define DRV_MODULE_VERSION "3.106"
|
||||
#define DRV_MODULE_RELDATE "January 12, 2010"
|
||||
|
||||
#define TG3_DEF_MAC_MODE 0
|
||||
#define TG3_DEF_RX_MODE 0
|
||||
|
@ -1037,7 +1037,11 @@ static void tg3_mdio_start(struct tg3 *tp)
|
|||
else
|
||||
tp->phy_addr = 1;
|
||||
|
||||
is_serdes = tr32(SG_DIG_STATUS) & SG_DIG_IS_SERDES;
|
||||
if (tp->pci_chip_rev_id != CHIPREV_ID_5717_A0)
|
||||
is_serdes = tr32(SG_DIG_STATUS) & SG_DIG_IS_SERDES;
|
||||
else
|
||||
is_serdes = tr32(TG3_CPMU_PHY_STRAP) &
|
||||
TG3_CPMU_PHY_STRAP_IS_SERDES;
|
||||
if (is_serdes)
|
||||
tp->phy_addr += 7;
|
||||
} else
|
||||
|
@ -4693,8 +4697,9 @@ next_pkt:
|
|||
(*post_ptr)++;
|
||||
|
||||
if (unlikely(rx_std_posted >= tp->rx_std_max_post)) {
|
||||
u32 idx = *post_ptr % TG3_RX_RING_SIZE;
|
||||
tw32_rx_mbox(TG3_RX_STD_PROD_IDX_REG, idx);
|
||||
tpr->rx_std_prod_idx = std_prod_idx % TG3_RX_RING_SIZE;
|
||||
tw32_rx_mbox(TG3_RX_STD_PROD_IDX_REG,
|
||||
tpr->rx_std_prod_idx);
|
||||
work_mask &= ~RXD_OPAQUE_RING_STD;
|
||||
rx_std_posted = 0;
|
||||
}
|
||||
|
@ -7742,7 +7747,7 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy)
|
|||
((u64) tpr->rx_std_mapping >> 32));
|
||||
tw32(RCVDBDI_STD_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_LOW,
|
||||
((u64) tpr->rx_std_mapping & 0xffffffff));
|
||||
if (!(tp->tg3_flags3 & TG3_FLG3_5755_PLUS))
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5717)
|
||||
tw32(RCVDBDI_STD_BD + TG3_BDINFO_NIC_ADDR,
|
||||
NIC_SRAM_RX_BUFFER_DESC);
|
||||
|
||||
|
@ -12122,7 +12127,8 @@ static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp)
|
|||
|
||||
tp->phy_id = eeprom_phy_id;
|
||||
if (eeprom_phy_serdes) {
|
||||
if (tp->tg3_flags2 & TG3_FLG2_5780_CLASS)
|
||||
if ((tp->tg3_flags2 & TG3_FLG2_5780_CLASS) ||
|
||||
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717)
|
||||
tp->tg3_flags2 |= TG3_FLG2_MII_SERDES;
|
||||
else
|
||||
tp->tg3_flags2 |= TG3_FLG2_PHY_SERDES;
|
||||
|
@ -13384,6 +13390,11 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
|
|||
if (err)
|
||||
return err;
|
||||
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717 &&
|
||||
(tp->pci_chip_rev_id != CHIPREV_ID_5717_A0 ||
|
||||
(tp->tg3_flags2 & TG3_FLG2_MII_SERDES)))
|
||||
return -ENOTSUPP;
|
||||
|
||||
/* Initialize data/descriptor byte/word swapping. */
|
||||
val = tr32(GRC_MODE);
|
||||
val &= GRC_MODE_HOST_STACKUP;
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
* Copyright (C) 2001, 2002, 2003, 2004 David S. Miller (davem@redhat.com)
|
||||
* Copyright (C) 2001 Jeff Garzik (jgarzik@pobox.com)
|
||||
* Copyright (C) 2004 Sun Microsystems Inc.
|
||||
* Copyright (C) 2007-2010 Broadcom Corporation.
|
||||
*/
|
||||
|
||||
#ifndef _T3_H
|
||||
|
@ -1054,6 +1055,8 @@
|
|||
#define CPMU_MUTEX_REQ_DRIVER 0x00001000
|
||||
#define TG3_CPMU_MUTEX_GNT 0x00003660
|
||||
#define CPMU_MUTEX_GNT_DRIVER 0x00001000
|
||||
#define TG3_CPMU_PHY_STRAP 0x00003664
|
||||
#define TG3_CPMU_PHY_STRAP_IS_SERDES 0x00000020
|
||||
/* 0x3664 --> 0x3800 unused */
|
||||
|
||||
/* Mbuf cluster free registers */
|
||||
|
|
|
@ -97,7 +97,7 @@ ath5k_eeprom_init_header(struct ath5k_hw *ah)
|
|||
struct ath5k_eeprom_info *ee = &ah->ah_capabilities.cap_eeprom;
|
||||
int ret;
|
||||
u16 val;
|
||||
u32 cksum, offset;
|
||||
u32 cksum, offset, eep_max = AR5K_EEPROM_INFO_MAX;
|
||||
|
||||
/*
|
||||
* Read values from EEPROM and store them in the capability structure
|
||||
|
@ -116,12 +116,38 @@ ath5k_eeprom_init_header(struct ath5k_hw *ah)
|
|||
* Validate the checksum of the EEPROM date. There are some
|
||||
* devices with invalid EEPROMs.
|
||||
*/
|
||||
for (cksum = 0, offset = 0; offset < AR5K_EEPROM_INFO_MAX; offset++) {
|
||||
AR5K_EEPROM_READ(AR5K_EEPROM_SIZE_UPPER, val);
|
||||
if (val) {
|
||||
eep_max = (val & AR5K_EEPROM_SIZE_UPPER_MASK) <<
|
||||
AR5K_EEPROM_SIZE_ENDLOC_SHIFT;
|
||||
AR5K_EEPROM_READ(AR5K_EEPROM_SIZE_LOWER, val);
|
||||
eep_max = (eep_max | val) - AR5K_EEPROM_INFO_BASE;
|
||||
|
||||
/*
|
||||
* Fail safe check to prevent stupid loops due
|
||||
* to busted EEPROMs. XXX: This value is likely too
|
||||
* big still, waiting on a better value.
|
||||
*/
|
||||
if (eep_max > (3 * AR5K_EEPROM_INFO_MAX)) {
|
||||
ATH5K_ERR(ah->ah_sc, "Invalid max custom EEPROM size: "
|
||||
"%d (0x%04x) max expected: %d (0x%04x)\n",
|
||||
eep_max, eep_max,
|
||||
3 * AR5K_EEPROM_INFO_MAX,
|
||||
3 * AR5K_EEPROM_INFO_MAX);
|
||||
return -EIO;
|
||||
}
|
||||
}
|
||||
|
||||
for (cksum = 0, offset = 0; offset < eep_max; offset++) {
|
||||
AR5K_EEPROM_READ(AR5K_EEPROM_INFO(offset), val);
|
||||
cksum ^= val;
|
||||
}
|
||||
if (cksum != AR5K_EEPROM_INFO_CKSUM) {
|
||||
ATH5K_ERR(ah->ah_sc, "Invalid EEPROM checksum 0x%04x\n", cksum);
|
||||
ATH5K_ERR(ah->ah_sc, "Invalid EEPROM "
|
||||
"checksum: 0x%04x eep_max: 0x%04x (%s)\n",
|
||||
cksum, eep_max,
|
||||
eep_max == AR5K_EEPROM_INFO_MAX ?
|
||||
"default size" : "custom size");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
|
|
|
@ -37,6 +37,14 @@
|
|||
#define AR5K_EEPROM_RFKILL_POLARITY_S 1
|
||||
|
||||
#define AR5K_EEPROM_REG_DOMAIN 0x00bf /* EEPROM regdom */
|
||||
|
||||
/* FLASH(EEPROM) Defines for AR531X chips */
|
||||
#define AR5K_EEPROM_SIZE_LOWER 0x1b /* size info -- lower */
|
||||
#define AR5K_EEPROM_SIZE_UPPER 0x1c /* size info -- upper */
|
||||
#define AR5K_EEPROM_SIZE_UPPER_MASK 0xfff0
|
||||
#define AR5K_EEPROM_SIZE_UPPER_SHIFT 4
|
||||
#define AR5K_EEPROM_SIZE_ENDLOC_SHIFT 12
|
||||
|
||||
#define AR5K_EEPROM_CHECKSUM 0x00c0 /* EEPROM checksum */
|
||||
#define AR5K_EEPROM_INFO_BASE 0x00c0 /* EEPROM header */
|
||||
#define AR5K_EEPROM_INFO_MAX (0x400 - AR5K_EEPROM_INFO_BASE)
|
||||
|
|
|
@ -25,7 +25,7 @@ config ATH9K
|
|||
|
||||
config ATH9K_DEBUGFS
|
||||
bool "Atheros ath9k debugging"
|
||||
depends on ATH9K
|
||||
depends on ATH9K && DEBUG_FS
|
||||
---help---
|
||||
Say Y, if you need access to ath9k's statistics for
|
||||
interrupts, rate control, etc.
|
||||
|
|
|
@ -33,11 +33,11 @@ struct ath_node;
|
|||
|
||||
/* Macro to expand scalars to 64-bit objects */
|
||||
|
||||
#define ito64(x) (sizeof(x) == 8) ? \
|
||||
#define ito64(x) (sizeof(x) == 1) ? \
|
||||
(((unsigned long long int)(x)) & (0xff)) : \
|
||||
(sizeof(x) == 16) ? \
|
||||
(sizeof(x) == 2) ? \
|
||||
(((unsigned long long int)(x)) & 0xffff) : \
|
||||
((sizeof(x) == 32) ? \
|
||||
((sizeof(x) == 4) ? \
|
||||
(((unsigned long long int)(x)) & 0xffffffff) : \
|
||||
(unsigned long long int)(x))
|
||||
|
||||
|
|
|
@ -1961,7 +1961,7 @@ static void iwl4965_rx_reply_tx(struct iwl_priv *priv,
|
|||
struct ieee80211_tx_info *info;
|
||||
struct iwl4965_tx_resp *tx_resp = (void *)&pkt->u.raw[0];
|
||||
u32 status = le32_to_cpu(tx_resp->u.status);
|
||||
int tid = MAX_TID_COUNT;
|
||||
int uninitialized_var(tid);
|
||||
int sta_id;
|
||||
int freed;
|
||||
u8 *qc = NULL;
|
||||
|
|
|
@ -2344,6 +2344,21 @@ static void iwl_ht_conf(struct iwl_priv *priv,
|
|||
IWL_DEBUG_MAC80211(priv, "leave\n");
|
||||
}
|
||||
|
||||
static inline void iwl_set_no_assoc(struct iwl_priv *priv)
|
||||
{
|
||||
priv->assoc_id = 0;
|
||||
iwl_led_disassociate(priv);
|
||||
/*
|
||||
* inform the ucode that there is no longer an
|
||||
* association and that no more packets should be
|
||||
* sent
|
||||
*/
|
||||
priv->staging_rxon.filter_flags &=
|
||||
~RXON_FILTER_ASSOC_MSK;
|
||||
priv->staging_rxon.assoc_id = 0;
|
||||
iwlcore_commit_rxon(priv);
|
||||
}
|
||||
|
||||
#define IWL_DELAY_NEXT_SCAN_AFTER_ASSOC (HZ*6)
|
||||
void iwl_bss_info_changed(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
|
@ -2475,20 +2490,8 @@ void iwl_bss_info_changed(struct ieee80211_hw *hw,
|
|||
IWL_DELAY_NEXT_SCAN_AFTER_ASSOC;
|
||||
if (!iwl_is_rfkill(priv))
|
||||
priv->cfg->ops->lib->post_associate(priv);
|
||||
} else {
|
||||
priv->assoc_id = 0;
|
||||
iwl_led_disassociate(priv);
|
||||
|
||||
/*
|
||||
* inform the ucode that there is no longer an
|
||||
* association and that no more packets should be
|
||||
* send
|
||||
*/
|
||||
priv->staging_rxon.filter_flags &=
|
||||
~RXON_FILTER_ASSOC_MSK;
|
||||
priv->staging_rxon.assoc_id = 0;
|
||||
iwlcore_commit_rxon(priv);
|
||||
}
|
||||
} else
|
||||
iwl_set_no_assoc(priv);
|
||||
}
|
||||
|
||||
if (changes && iwl_is_associated(priv) && priv->assoc_id) {
|
||||
|
@ -2503,12 +2506,14 @@ void iwl_bss_info_changed(struct ieee80211_hw *hw,
|
|||
}
|
||||
}
|
||||
|
||||
if ((changes & BSS_CHANGED_BEACON_ENABLED) &&
|
||||
vif->bss_conf.enable_beacon) {
|
||||
memcpy(priv->staging_rxon.bssid_addr,
|
||||
bss_conf->bssid, ETH_ALEN);
|
||||
memcpy(priv->bssid, bss_conf->bssid, ETH_ALEN);
|
||||
iwlcore_config_ap(priv);
|
||||
if (changes & BSS_CHANGED_BEACON_ENABLED) {
|
||||
if (vif->bss_conf.enable_beacon) {
|
||||
memcpy(priv->staging_rxon.bssid_addr,
|
||||
bss_conf->bssid, ETH_ALEN);
|
||||
memcpy(priv->bssid, bss_conf->bssid, ETH_ALEN);
|
||||
iwlcore_config_ap(priv);
|
||||
} else
|
||||
iwl_set_no_assoc(priv);
|
||||
}
|
||||
|
||||
mutex_unlock(&priv->mutex);
|
||||
|
|
|
@ -711,7 +711,7 @@ extern void iwl_txq_ctx_stop(struct iwl_priv *priv);
|
|||
extern int iwl_queue_space(const struct iwl_queue *q);
|
||||
static inline int iwl_queue_used(const struct iwl_queue *q, int i)
|
||||
{
|
||||
return q->write_ptr > q->read_ptr ?
|
||||
return q->write_ptr >= q->read_ptr ?
|
||||
(i >= q->read_ptr && i < q->write_ptr) :
|
||||
!(i < q->read_ptr && i >= q->write_ptr);
|
||||
}
|
||||
|
|
|
@ -3157,8 +3157,10 @@ static void mwl8k_configure_filter(struct ieee80211_hw *hw,
|
|||
/* Clear unsupported feature flags */
|
||||
*total_flags &= FIF_ALLMULTI | FIF_BCN_PRBRESP_PROMISC;
|
||||
|
||||
if (mwl8k_fw_lock(hw))
|
||||
if (mwl8k_fw_lock(hw)) {
|
||||
kfree(cmd);
|
||||
return;
|
||||
}
|
||||
|
||||
if (priv->sniffer_enabled) {
|
||||
mwl8k_enable_sniffer(hw, 0);
|
||||
|
|
|
@ -340,7 +340,7 @@ static int rt2800_blink_set(struct led_classdev *led_cdev,
|
|||
rt2x00_set_field32(®, LED_CFG_OFF_PERIOD, *delay_off);
|
||||
rt2x00_set_field32(®, LED_CFG_SLOW_BLINK_PERIOD, 3);
|
||||
rt2x00_set_field32(®, LED_CFG_R_LED_MODE, 3);
|
||||
rt2x00_set_field32(®, LED_CFG_G_LED_MODE, 12);
|
||||
rt2x00_set_field32(®, LED_CFG_G_LED_MODE, 3);
|
||||
rt2x00_set_field32(®, LED_CFG_Y_LED_MODE, 3);
|
||||
rt2x00_set_field32(®, LED_CFG_LED_POLAR, 1);
|
||||
rt2800_register_write(led->rt2x00dev, LED_CFG, reg);
|
||||
|
|
|
@ -112,6 +112,12 @@
|
|||
#define ALIGN_SIZE(__skb, __header) \
|
||||
( ((unsigned long)((__skb)->data + (__header))) & 3 )
|
||||
|
||||
/*
|
||||
* Constants for extra TX headroom for alignment purposes.
|
||||
*/
|
||||
#define RT2X00_ALIGN_SIZE 4 /* Only whole frame needs alignment */
|
||||
#define RT2X00_L2PAD_SIZE 8 /* Both header & payload need alignment */
|
||||
|
||||
/*
|
||||
* Standard timing and size defines.
|
||||
* These values should follow the ieee80211 specifications.
|
||||
|
|
|
@ -686,7 +686,17 @@ static int rt2x00lib_probe_hw(struct rt2x00_dev *rt2x00dev)
|
|||
/*
|
||||
* Initialize extra TX headroom required.
|
||||
*/
|
||||
rt2x00dev->hw->extra_tx_headroom = rt2x00dev->ops->extra_tx_headroom;
|
||||
rt2x00dev->hw->extra_tx_headroom =
|
||||
max_t(unsigned int, IEEE80211_TX_STATUS_HEADROOM,
|
||||
rt2x00dev->ops->extra_tx_headroom);
|
||||
|
||||
/*
|
||||
* Take TX headroom required for alignment into account.
|
||||
*/
|
||||
if (test_bit(DRIVER_REQUIRE_L2PAD, &rt2x00dev->flags))
|
||||
rt2x00dev->hw->extra_tx_headroom += RT2X00_L2PAD_SIZE;
|
||||
else if (test_bit(DRIVER_REQUIRE_DMA, &rt2x00dev->flags))
|
||||
rt2x00dev->hw->extra_tx_headroom += RT2X00_ALIGN_SIZE;
|
||||
|
||||
/*
|
||||
* Register HW.
|
||||
|
|
|
@ -104,7 +104,7 @@ void rt2x00queue_map_txskb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb)
|
|||
* is also mapped to the DMA so it can be used for transfering
|
||||
* additional descriptor information to the hardware.
|
||||
*/
|
||||
skb_push(skb, rt2x00dev->hw->extra_tx_headroom);
|
||||
skb_push(skb, rt2x00dev->ops->extra_tx_headroom);
|
||||
|
||||
skbdesc->skb_dma =
|
||||
dma_map_single(rt2x00dev->dev, skb->data, skb->len, DMA_TO_DEVICE);
|
||||
|
@ -112,7 +112,7 @@ void rt2x00queue_map_txskb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb)
|
|||
/*
|
||||
* Restore data pointer to original location again.
|
||||
*/
|
||||
skb_pull(skb, rt2x00dev->hw->extra_tx_headroom);
|
||||
skb_pull(skb, rt2x00dev->ops->extra_tx_headroom);
|
||||
|
||||
skbdesc->flags |= SKBDESC_DMA_MAPPED_TX;
|
||||
}
|
||||
|
@ -134,7 +134,7 @@ void rt2x00queue_unmap_skb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb)
|
|||
* by the driver, but it was actually mapped to DMA.
|
||||
*/
|
||||
dma_unmap_single(rt2x00dev->dev, skbdesc->skb_dma,
|
||||
skb->len + rt2x00dev->hw->extra_tx_headroom,
|
||||
skb->len + rt2x00dev->ops->extra_tx_headroom,
|
||||
DMA_TO_DEVICE);
|
||||
skbdesc->flags &= ~SKBDESC_DMA_MAPPED_TX;
|
||||
}
|
||||
|
|
|
@ -987,12 +987,13 @@ static void zd_op_configure_filter(struct ieee80211_hw *hw,
|
|||
changed_flags &= SUPPORTED_FIF_FLAGS;
|
||||
*new_flags &= SUPPORTED_FIF_FLAGS;
|
||||
|
||||
/* changed_flags is always populated but this driver
|
||||
* doesn't support all FIF flags so its possible we don't
|
||||
* need to do anything */
|
||||
if (!changed_flags)
|
||||
return;
|
||||
|
||||
/*
|
||||
* If multicast parameter (as returned by zd_op_prepare_multicast)
|
||||
* has changed, no bit in changed_flags is set. To handle this
|
||||
* situation, we do not return if changed_flags is 0. If we do so,
|
||||
* we will have some issue with IPv6 which uses multicast for link
|
||||
* layer address resolution.
|
||||
*/
|
||||
if (*new_flags & (FIF_PROMISC_IN_BSS | FIF_ALLMULTI))
|
||||
zd_mc_add_all(&hash);
|
||||
|
||||
|
|
|
@ -338,7 +338,7 @@ static inline int sk_mc_loop(struct sock *sk)
|
|||
return inet6_sk(sk)->mc_loop;
|
||||
#endif
|
||||
}
|
||||
__WARN();
|
||||
WARN_ON(1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -559,6 +559,11 @@ static inline struct inet6_dev *ipv6_skb_idev(struct sk_buff *skb)
|
|||
return skb_dst(skb) ? ip6_dst_idev(skb_dst(skb)) : __in6_dev_get(skb->dev);
|
||||
}
|
||||
|
||||
static inline struct net *ipv6_skb_net(struct sk_buff *skb)
|
||||
{
|
||||
return skb_dst(skb) ? dev_net(skb_dst(skb)->dev) : dev_net(skb->dev);
|
||||
}
|
||||
|
||||
/* Router Alert as of RFC 2711 */
|
||||
|
||||
static int ipv6_hop_ra(struct sk_buff *skb, int optoff)
|
||||
|
@ -580,8 +585,8 @@ static int ipv6_hop_ra(struct sk_buff *skb, int optoff)
|
|||
static int ipv6_hop_jumbo(struct sk_buff *skb, int optoff)
|
||||
{
|
||||
const unsigned char *nh = skb_network_header(skb);
|
||||
struct net *net = ipv6_skb_net(skb);
|
||||
u32 pkt_len;
|
||||
struct net *net = dev_net(skb_dst(skb)->dev);
|
||||
|
||||
if (nh[optoff + 1] != 4 || (optoff & 3) != 2) {
|
||||
LIMIT_NETDEBUG(KERN_DEBUG "ipv6_hop_jumbo: wrong jumbo opt length/alignment %d\n",
|
||||
|
|
|
@ -15,12 +15,14 @@
|
|||
#include <linux/netdevice.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
#include <net/mac80211.h>
|
||||
#include <net/ieee80211_radiotap.h>
|
||||
#include "ieee80211_i.h"
|
||||
#include "sta_info.h"
|
||||
#include "debugfs_netdev.h"
|
||||
#include "mesh.h"
|
||||
#include "led.h"
|
||||
#include "driver-ops.h"
|
||||
#include "wme.h"
|
||||
|
||||
/**
|
||||
* DOC: Interface list locking
|
||||
|
@ -314,7 +316,7 @@ static int ieee80211_open(struct net_device *dev)
|
|||
if (sdata->vif.type == NL80211_IFTYPE_STATION)
|
||||
ieee80211_queue_work(&local->hw, &sdata->u.mgd.work);
|
||||
|
||||
netif_start_queue(dev);
|
||||
netif_tx_start_all_queues(dev);
|
||||
|
||||
return 0;
|
||||
err_del_interface:
|
||||
|
@ -343,7 +345,7 @@ static int ieee80211_stop(struct net_device *dev)
|
|||
/*
|
||||
* Stop TX on this interface first.
|
||||
*/
|
||||
netif_stop_queue(dev);
|
||||
netif_tx_stop_all_queues(dev);
|
||||
|
||||
/*
|
||||
* Now delete all active aggregation sessions.
|
||||
|
@ -644,6 +646,12 @@ static void ieee80211_teardown_sdata(struct net_device *dev)
|
|||
WARN_ON(flushed);
|
||||
}
|
||||
|
||||
static u16 ieee80211_netdev_select_queue(struct net_device *dev,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
return ieee80211_select_queue(IEEE80211_DEV_TO_SUB_IF(dev), skb);
|
||||
}
|
||||
|
||||
static const struct net_device_ops ieee80211_dataif_ops = {
|
||||
.ndo_open = ieee80211_open,
|
||||
.ndo_stop = ieee80211_stop,
|
||||
|
@ -652,8 +660,38 @@ static const struct net_device_ops ieee80211_dataif_ops = {
|
|||
.ndo_set_multicast_list = ieee80211_set_multicast_list,
|
||||
.ndo_change_mtu = ieee80211_change_mtu,
|
||||
.ndo_set_mac_address = eth_mac_addr,
|
||||
.ndo_select_queue = ieee80211_netdev_select_queue,
|
||||
};
|
||||
|
||||
static u16 ieee80211_monitor_select_queue(struct net_device *dev,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
struct ieee80211_hdr *hdr;
|
||||
struct ieee80211_radiotap_header *rtap = (void *)skb->data;
|
||||
u8 *p;
|
||||
|
||||
if (local->hw.queues < 4)
|
||||
return 0;
|
||||
|
||||
if (skb->len < 4 ||
|
||||
skb->len < le16_to_cpu(rtap->it_len) + 2 /* frame control */)
|
||||
return 0; /* doesn't matter, frame will be dropped */
|
||||
|
||||
hdr = (void *)((u8 *)skb->data + le16_to_cpu(rtap->it_len));
|
||||
|
||||
if (!ieee80211_is_data_qos(hdr->frame_control)) {
|
||||
skb->priority = 7;
|
||||
return ieee802_1d_to_ac[skb->priority];
|
||||
}
|
||||
|
||||
p = ieee80211_get_qos_ctl(hdr);
|
||||
skb->priority = *p & IEEE80211_QOS_CTL_TAG1D_MASK;
|
||||
|
||||
return ieee80211_downgrade_queue(local, skb);
|
||||
}
|
||||
|
||||
static const struct net_device_ops ieee80211_monitorif_ops = {
|
||||
.ndo_open = ieee80211_open,
|
||||
.ndo_stop = ieee80211_stop,
|
||||
|
@ -662,6 +700,7 @@ static const struct net_device_ops ieee80211_monitorif_ops = {
|
|||
.ndo_set_multicast_list = ieee80211_set_multicast_list,
|
||||
.ndo_change_mtu = ieee80211_change_mtu,
|
||||
.ndo_set_mac_address = eth_mac_addr,
|
||||
.ndo_select_queue = ieee80211_monitor_select_queue,
|
||||
};
|
||||
|
||||
static void ieee80211_if_setup(struct net_device *dev)
|
||||
|
@ -768,8 +807,8 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name,
|
|||
|
||||
ASSERT_RTNL();
|
||||
|
||||
ndev = alloc_netdev(sizeof(*sdata) + local->hw.vif_data_size,
|
||||
name, ieee80211_if_setup);
|
||||
ndev = alloc_netdev_mq(sizeof(*sdata) + local->hw.vif_data_size,
|
||||
name, ieee80211_if_setup, local->hw.queues);
|
||||
if (!ndev)
|
||||
return -ENOMEM;
|
||||
dev_net_set(ndev, wiphy_net(local->hw.wiphy));
|
||||
|
|
|
@ -942,7 +942,7 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
|
|||
ieee80211_recalc_ps(local, -1);
|
||||
mutex_unlock(&local->iflist_mtx);
|
||||
|
||||
netif_start_queue(sdata->dev);
|
||||
netif_tx_start_all_queues(sdata->dev);
|
||||
netif_carrier_on(sdata->dev);
|
||||
}
|
||||
|
||||
|
@ -1074,7 +1074,7 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
|
|||
* time -- we don't want the scan code to enable queues.
|
||||
*/
|
||||
|
||||
netif_stop_queue(sdata->dev);
|
||||
netif_tx_stop_all_queues(sdata->dev);
|
||||
netif_carrier_off(sdata->dev);
|
||||
|
||||
rcu_read_lock();
|
||||
|
@ -1963,7 +1963,9 @@ static void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
|
|||
rma = ieee80211_rx_mgmt_disassoc(sdata, mgmt, skb->len);
|
||||
break;
|
||||
case IEEE80211_STYPE_ACTION:
|
||||
/* XXX: differentiate, can only happen for CSA now! */
|
||||
if (mgmt->u.action.category != WLAN_CATEGORY_SPECTRUM_MGMT)
|
||||
break;
|
||||
|
||||
ieee80211_sta_process_chanswitch(sdata,
|
||||
&mgmt->u.action.u.chan_switch.sw_elem,
|
||||
ifmgd->associated);
|
||||
|
|
|
@ -1746,7 +1746,9 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx)
|
|||
memset(info, 0, sizeof(*info));
|
||||
info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING;
|
||||
info->control.vif = &rx->sdata->vif;
|
||||
ieee80211_select_queue(local, fwd_skb);
|
||||
skb_set_queue_mapping(skb,
|
||||
ieee80211_select_queue(rx->sdata, fwd_skb));
|
||||
ieee80211_set_qos_hdr(local, skb);
|
||||
if (is_multicast_ether_addr(fwd_hdr->addr1))
|
||||
IEEE80211_IFSTA_MESH_CTR_INC(&sdata->u.mesh,
|
||||
fwded_mcast);
|
||||
|
@ -2013,6 +2015,10 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx)
|
|||
}
|
||||
break;
|
||||
default:
|
||||
/* do not process rejected action frames */
|
||||
if (mgmt->u.action.category & 0x80)
|
||||
return RX_DROP_MONITOR;
|
||||
|
||||
return RX_CONTINUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -353,10 +353,10 @@ void ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted)
|
|||
if (sdata->vif.type == NL80211_IFTYPE_STATION) {
|
||||
if (sdata->u.mgd.associated) {
|
||||
ieee80211_scan_ps_disable(sdata);
|
||||
netif_wake_queue(sdata->dev);
|
||||
netif_tx_wake_all_queues(sdata->dev);
|
||||
}
|
||||
} else
|
||||
netif_wake_queue(sdata->dev);
|
||||
netif_tx_wake_all_queues(sdata->dev);
|
||||
|
||||
/* re-enable beaconing */
|
||||
if (sdata->vif.type == NL80211_IFTYPE_AP ||
|
||||
|
@ -411,7 +411,7 @@ static int ieee80211_start_sw_scan(struct ieee80211_local *local)
|
|||
* are handled in the scan state machine
|
||||
*/
|
||||
if (sdata->vif.type != NL80211_IFTYPE_STATION)
|
||||
netif_stop_queue(sdata->dev);
|
||||
netif_tx_stop_all_queues(sdata->dev);
|
||||
}
|
||||
mutex_unlock(&local->iflist_mtx);
|
||||
|
||||
|
@ -575,7 +575,7 @@ static void ieee80211_scan_state_leave_oper_channel(struct ieee80211_local *loca
|
|||
continue;
|
||||
|
||||
if (sdata->vif.type == NL80211_IFTYPE_STATION) {
|
||||
netif_stop_queue(sdata->dev);
|
||||
netif_tx_stop_all_queues(sdata->dev);
|
||||
if (sdata->u.mgd.associated)
|
||||
ieee80211_scan_ps_enable(sdata);
|
||||
}
|
||||
|
@ -610,7 +610,7 @@ static void ieee80211_scan_state_enter_oper_channel(struct ieee80211_local *loca
|
|||
if (sdata->vif.type == NL80211_IFTYPE_STATION) {
|
||||
if (sdata->u.mgd.associated)
|
||||
ieee80211_scan_ps_disable(sdata);
|
||||
netif_wake_queue(sdata->dev);
|
||||
netif_tx_wake_all_queues(sdata->dev);
|
||||
}
|
||||
}
|
||||
mutex_unlock(&local->iflist_mtx);
|
||||
|
|
|
@ -1512,7 +1512,7 @@ static void ieee80211_xmit(struct ieee80211_sub_if_data *sdata,
|
|||
return;
|
||||
}
|
||||
|
||||
ieee80211_select_queue(local, skb);
|
||||
ieee80211_set_qos_hdr(local, skb);
|
||||
ieee80211_tx(sdata, skb, false);
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
@ -2291,6 +2291,9 @@ void ieee80211_tx_skb(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb)
|
|||
skb_set_network_header(skb, 0);
|
||||
skb_set_transport_header(skb, 0);
|
||||
|
||||
/* send all internal mgmt frames on VO */
|
||||
skb_set_queue_mapping(skb, 0);
|
||||
|
||||
/*
|
||||
* The other path calling ieee80211_xmit is from the tasklet,
|
||||
* and while we can handle concurrent transmissions locking
|
||||
|
|
|
@ -269,6 +269,7 @@ static void __ieee80211_wake_queue(struct ieee80211_hw *hw, int queue,
|
|||
enum queue_stop_reason reason)
|
||||
{
|
||||
struct ieee80211_local *local = hw_to_local(hw);
|
||||
struct ieee80211_sub_if_data *sdata;
|
||||
|
||||
if (WARN_ON(queue >= hw->queues))
|
||||
return;
|
||||
|
@ -281,6 +282,11 @@ static void __ieee80211_wake_queue(struct ieee80211_hw *hw, int queue,
|
|||
|
||||
if (!skb_queue_empty(&local->pending[queue]))
|
||||
tasklet_schedule(&local->tx_pending_tasklet);
|
||||
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(sdata, &local->interfaces, list)
|
||||
netif_tx_wake_queue(netdev_get_tx_queue(sdata->dev, queue));
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
void ieee80211_wake_queue_by_reason(struct ieee80211_hw *hw, int queue,
|
||||
|
@ -305,11 +311,17 @@ static void __ieee80211_stop_queue(struct ieee80211_hw *hw, int queue,
|
|||
enum queue_stop_reason reason)
|
||||
{
|
||||
struct ieee80211_local *local = hw_to_local(hw);
|
||||
struct ieee80211_sub_if_data *sdata;
|
||||
|
||||
if (WARN_ON(queue >= hw->queues))
|
||||
return;
|
||||
|
||||
__set_bit(reason, &local->queue_stop_reasons[queue]);
|
||||
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(sdata, &local->interfaces, list)
|
||||
netif_tx_stop_queue(netdev_get_tx_queue(sdata->dev, queue));
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
void ieee80211_stop_queue_by_reason(struct ieee80211_hw *hw, int queue,
|
||||
|
|
|
@ -44,22 +44,69 @@ static int wme_downgrade_ac(struct sk_buff *skb)
|
|||
}
|
||||
|
||||
|
||||
/* Indicate which queue to use. */
|
||||
static u16 classify80211(struct ieee80211_local *local, struct sk_buff *skb)
|
||||
/* Indicate which queue to use. */
|
||||
u16 ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
struct sta_info *sta = NULL;
|
||||
u32 sta_flags = 0;
|
||||
const u8 *ra = NULL;
|
||||
bool qos = false;
|
||||
|
||||
if (!ieee80211_is_data(hdr->frame_control)) {
|
||||
/* management frames go on AC_VO queue, but are sent
|
||||
* without QoS control fields */
|
||||
return 0;
|
||||
if (local->hw.queues < 4 || skb->len < 6) {
|
||||
skb->priority = 0; /* required for correct WPA/11i MIC */
|
||||
return min_t(u16, local->hw.queues - 1,
|
||||
ieee802_1d_to_ac[skb->priority]);
|
||||
}
|
||||
|
||||
if (0 /* injected */) {
|
||||
/* use AC from radiotap */
|
||||
rcu_read_lock();
|
||||
switch (sdata->vif.type) {
|
||||
case NL80211_IFTYPE_AP_VLAN:
|
||||
rcu_read_lock();
|
||||
sta = rcu_dereference(sdata->u.vlan.sta);
|
||||
if (sta)
|
||||
sta_flags = get_sta_flags(sta);
|
||||
rcu_read_unlock();
|
||||
if (sta)
|
||||
break;
|
||||
case NL80211_IFTYPE_AP:
|
||||
ra = skb->data;
|
||||
break;
|
||||
case NL80211_IFTYPE_WDS:
|
||||
ra = sdata->u.wds.remote_addr;
|
||||
break;
|
||||
#ifdef CONFIG_MAC80211_MESH
|
||||
case NL80211_IFTYPE_MESH_POINT:
|
||||
/*
|
||||
* XXX: This is clearly broken ... but already was before,
|
||||
* because ieee80211_fill_mesh_addresses() would clear A1
|
||||
* except for multicast addresses.
|
||||
*/
|
||||
break;
|
||||
#endif
|
||||
case NL80211_IFTYPE_STATION:
|
||||
ra = sdata->u.mgd.bssid;
|
||||
break;
|
||||
case NL80211_IFTYPE_ADHOC:
|
||||
ra = skb->data;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (!ieee80211_is_data_qos(hdr->frame_control)) {
|
||||
if (!sta && ra && !is_multicast_ether_addr(ra)) {
|
||||
sta = sta_info_get(local, ra);
|
||||
if (sta)
|
||||
sta_flags = get_sta_flags(sta);
|
||||
}
|
||||
|
||||
if (sta_flags & WLAN_STA_WME)
|
||||
qos = true;
|
||||
|
||||
rcu_read_unlock();
|
||||
|
||||
if (!qos) {
|
||||
skb->priority = 0; /* required for correct WPA/11i MIC */
|
||||
return ieee802_1d_to_ac[skb->priority];
|
||||
}
|
||||
|
@ -68,6 +115,12 @@ static u16 classify80211(struct ieee80211_local *local, struct sk_buff *skb)
|
|||
* data frame has */
|
||||
skb->priority = cfg80211_classify8021d(skb);
|
||||
|
||||
return ieee80211_downgrade_queue(local, skb);
|
||||
}
|
||||
|
||||
u16 ieee80211_downgrade_queue(struct ieee80211_local *local,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
/* in case we are a client verify acm is not set for this ac */
|
||||
while (unlikely(local->wmm_acm & BIT(skb->priority))) {
|
||||
if (wme_downgrade_ac(skb)) {
|
||||
|
@ -85,24 +138,17 @@ static u16 classify80211(struct ieee80211_local *local, struct sk_buff *skb)
|
|||
return ieee802_1d_to_ac[skb->priority];
|
||||
}
|
||||
|
||||
void ieee80211_select_queue(struct ieee80211_local *local, struct sk_buff *skb)
|
||||
void ieee80211_set_qos_hdr(struct ieee80211_local *local, struct sk_buff *skb)
|
||||
{
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
|
||||
u16 queue;
|
||||
u8 tid;
|
||||
struct ieee80211_hdr *hdr = (void *)skb->data;
|
||||
|
||||
queue = classify80211(local, skb);
|
||||
if (unlikely(queue >= local->hw.queues))
|
||||
queue = local->hw.queues - 1;
|
||||
|
||||
/*
|
||||
* Now we know the 1d priority, fill in the QoS header if
|
||||
* there is one (and we haven't done this before).
|
||||
*/
|
||||
/* Fill in the QoS header if there is one. */
|
||||
if (ieee80211_is_data_qos(hdr->frame_control)) {
|
||||
u8 *p = ieee80211_get_qos_ctl(hdr);
|
||||
u8 ack_policy = 0;
|
||||
u8 ack_policy = 0, tid;
|
||||
|
||||
tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK;
|
||||
|
||||
if (unlikely(local->wifi_wme_noack_test))
|
||||
ack_policy |= QOS_CONTROL_ACK_POLICY_NOACK <<
|
||||
QOS_CONTROL_ACK_POLICY_SHIFT;
|
||||
|
@ -110,6 +156,4 @@ void ieee80211_select_queue(struct ieee80211_local *local, struct sk_buff *skb)
|
|||
*p++ = ack_policy | tid;
|
||||
*p = 0;
|
||||
}
|
||||
|
||||
skb_set_queue_mapping(skb, queue);
|
||||
}
|
||||
|
|
|
@ -20,7 +20,11 @@
|
|||
|
||||
extern const int ieee802_1d_to_ac[8];
|
||||
|
||||
void ieee80211_select_queue(struct ieee80211_local *local,
|
||||
struct sk_buff *skb);
|
||||
u16 ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
|
||||
struct sk_buff *skb);
|
||||
void ieee80211_set_qos_hdr(struct ieee80211_local *local, struct sk_buff *skb);
|
||||
u16 ieee80211_downgrade_queue(struct ieee80211_local *local,
|
||||
struct sk_buff *skb);
|
||||
|
||||
|
||||
#endif /* _WME_H */
|
||||
|
|
|
@ -745,9 +745,9 @@ static int cfg80211_netdev_notifier_call(struct notifier_block * nb,
|
|||
mutex_unlock(&rdev->devlist_mtx);
|
||||
dev_put(dev);
|
||||
}
|
||||
#ifdef CONFIG_CFG80211_WEXT
|
||||
cfg80211_lock_rdev(rdev);
|
||||
mutex_lock(&rdev->devlist_mtx);
|
||||
#ifdef CONFIG_CFG80211_WEXT
|
||||
wdev_lock(wdev);
|
||||
switch (wdev->iftype) {
|
||||
case NL80211_IFTYPE_ADHOC:
|
||||
|
@ -760,10 +760,10 @@ static int cfg80211_netdev_notifier_call(struct notifier_block * nb,
|
|||
break;
|
||||
}
|
||||
wdev_unlock(wdev);
|
||||
#endif
|
||||
rdev->opencount++;
|
||||
mutex_unlock(&rdev->devlist_mtx);
|
||||
cfg80211_unlock_rdev(rdev);
|
||||
#endif
|
||||
break;
|
||||
case NETDEV_UNREGISTER:
|
||||
/*
|
||||
|
|
|
@ -1690,7 +1690,7 @@ int regulatory_hint_user(const char *alpha2)
|
|||
request->wiphy_idx = WIPHY_IDX_STALE;
|
||||
request->alpha2[0] = alpha2[0];
|
||||
request->alpha2[1] = alpha2[1];
|
||||
request->initiator = NL80211_REGDOM_SET_BY_USER,
|
||||
request->initiator = NL80211_REGDOM_SET_BY_USER;
|
||||
|
||||
queue_regulatory_request(request);
|
||||
|
||||
|
|
Loading…
Reference in New Issue