mirror of https://gitee.com/openkylin/linux.git
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: (33 commits) sony-laptop: re-read the rfkill state when resuming from suspend sony-laptop: check for rfkill hard block at load time wext: add back wireless/ dir in sysfs for cfg80211 interfaces wext: Add bound checks for copy_from_user mac80211: improve/fix mlme messages cfg80211: always get BSS iwlwifi: fix 3945 ucode info retrieval after failure iwlwifi: fix memory leak in command queue handling iwlwifi: fix debugfs buffer handling cfg80211: don't set privacy w/o key cfg80211: wext: don't display BSSID unless associated net: Add explicit bound checks in net/socket.c bridge: Fix double-free in br_add_if. isdn: fix netjet/isdnhdlc build errors atm: dereference of he_dev->rbps_virt in he_init_group() ax25: Add missing dev_put in ax25_setsockopt Revert "sit: stateless autoconf for isatap" net: fix double skb free in dcbnl net: fix nlmsg len size for skb when error bit is set. net: fix vlan_get_size to include vlan_flags size ...
This commit is contained in:
commit
5a4c8d75f4
|
@ -921,9 +921,9 @@ he_init_group(struct he_dev *he_dev, int group)
|
||||||
he_dev->rbrq_phys);
|
he_dev->rbrq_phys);
|
||||||
i = CONFIG_RBPL_SIZE;
|
i = CONFIG_RBPL_SIZE;
|
||||||
out_free_rbpl_virt:
|
out_free_rbpl_virt:
|
||||||
while (--i)
|
while (i--)
|
||||||
pci_pool_free(he_dev->rbps_pool, he_dev->rbpl_virt[i].virt,
|
pci_pool_free(he_dev->rbpl_pool, he_dev->rbpl_virt[i].virt,
|
||||||
he_dev->rbps_base[i].phys);
|
he_dev->rbpl_base[i].phys);
|
||||||
kfree(he_dev->rbpl_virt);
|
kfree(he_dev->rbpl_virt);
|
||||||
|
|
||||||
out_free_rbpl_base:
|
out_free_rbpl_base:
|
||||||
|
@ -933,11 +933,11 @@ he_init_group(struct he_dev *he_dev, int group)
|
||||||
out_destroy_rbpl_pool:
|
out_destroy_rbpl_pool:
|
||||||
pci_pool_destroy(he_dev->rbpl_pool);
|
pci_pool_destroy(he_dev->rbpl_pool);
|
||||||
|
|
||||||
i = CONFIG_RBPL_SIZE;
|
i = CONFIG_RBPS_SIZE;
|
||||||
out_free_rbps_virt:
|
out_free_rbps_virt:
|
||||||
while (--i)
|
while (i--)
|
||||||
pci_pool_free(he_dev->rbpl_pool, he_dev->rbps_virt[i].virt,
|
pci_pool_free(he_dev->rbps_pool, he_dev->rbps_virt[i].virt,
|
||||||
he_dev->rbpl_base[i].phys);
|
he_dev->rbps_base[i].phys);
|
||||||
kfree(he_dev->rbps_virt);
|
kfree(he_dev->rbps_virt);
|
||||||
|
|
||||||
out_free_rbps_base:
|
out_free_rbps_base:
|
||||||
|
|
|
@ -78,6 +78,7 @@ config MISDN_NETJET
|
||||||
depends on PCI
|
depends on PCI
|
||||||
select MISDN_IPAC
|
select MISDN_IPAC
|
||||||
select ISDN_HDLC
|
select ISDN_HDLC
|
||||||
|
select ISDN_I4L
|
||||||
help
|
help
|
||||||
Enable support for Traverse Technologies NETJet PCI cards.
|
Enable support for Traverse Technologies NETJet PCI cards.
|
||||||
|
|
||||||
|
|
|
@ -141,8 +141,7 @@ endmenu
|
||||||
endif
|
endif
|
||||||
|
|
||||||
config ISDN_HDLC
|
config ISDN_HDLC
|
||||||
tristate
|
tristate
|
||||||
depends on HISAX_ST5481
|
|
||||||
select CRC_CCITT
|
select CRC_CCITT
|
||||||
select BITREVERSE
|
select BITREVERSE
|
||||||
|
|
||||||
|
|
|
@ -149,7 +149,6 @@ do { \
|
||||||
|
|
||||||
#define AUTO_ALL_MODES 0
|
#define AUTO_ALL_MODES 0
|
||||||
#define E1000_EEPROM_82544_APM 0x0004
|
#define E1000_EEPROM_82544_APM 0x0004
|
||||||
#define E1000_EEPROM_ICH8_APME 0x0004
|
|
||||||
#define E1000_EEPROM_APME 0x0400
|
#define E1000_EEPROM_APME 0x0400
|
||||||
|
|
||||||
#ifndef E1000_MASTER_SLAVE
|
#ifndef E1000_MASTER_SLAVE
|
||||||
|
@ -293,7 +292,6 @@ struct e1000_adapter {
|
||||||
|
|
||||||
u64 hw_csum_err;
|
u64 hw_csum_err;
|
||||||
u64 hw_csum_good;
|
u64 hw_csum_good;
|
||||||
u64 rx_hdr_split;
|
|
||||||
u32 alloc_rx_buff_failed;
|
u32 alloc_rx_buff_failed;
|
||||||
u32 rx_int_delay;
|
u32 rx_int_delay;
|
||||||
u32 rx_abs_int_delay;
|
u32 rx_abs_int_delay;
|
||||||
|
@ -317,7 +315,6 @@ struct e1000_adapter {
|
||||||
struct e1000_rx_ring test_rx_ring;
|
struct e1000_rx_ring test_rx_ring;
|
||||||
|
|
||||||
int msg_enable;
|
int msg_enable;
|
||||||
bool have_msi;
|
|
||||||
|
|
||||||
/* to not mess up cache alignment, always add to the bottom */
|
/* to not mess up cache alignment, always add to the bottom */
|
||||||
bool tso_force;
|
bool tso_force;
|
||||||
|
|
|
@ -82,7 +82,6 @@ static const struct e1000_stats e1000_gstrings_stats[] = {
|
||||||
{ "rx_long_byte_count", E1000_STAT(stats.gorcl) },
|
{ "rx_long_byte_count", E1000_STAT(stats.gorcl) },
|
||||||
{ "rx_csum_offload_good", E1000_STAT(hw_csum_good) },
|
{ "rx_csum_offload_good", E1000_STAT(hw_csum_good) },
|
||||||
{ "rx_csum_offload_errors", E1000_STAT(hw_csum_err) },
|
{ "rx_csum_offload_errors", E1000_STAT(hw_csum_err) },
|
||||||
{ "rx_header_split", E1000_STAT(rx_hdr_split) },
|
|
||||||
{ "alloc_rx_buff_failed", E1000_STAT(alloc_rx_buff_failed) },
|
{ "alloc_rx_buff_failed", E1000_STAT(alloc_rx_buff_failed) },
|
||||||
{ "tx_smbus", E1000_STAT(stats.mgptc) },
|
{ "tx_smbus", E1000_STAT(stats.mgptc) },
|
||||||
{ "rx_smbus", E1000_STAT(stats.mgprc) },
|
{ "rx_smbus", E1000_STAT(stats.mgprc) },
|
||||||
|
@ -114,8 +113,6 @@ static int e1000_get_settings(struct net_device *netdev,
|
||||||
SUPPORTED_1000baseT_Full|
|
SUPPORTED_1000baseT_Full|
|
||||||
SUPPORTED_Autoneg |
|
SUPPORTED_Autoneg |
|
||||||
SUPPORTED_TP);
|
SUPPORTED_TP);
|
||||||
if (hw->phy_type == e1000_phy_ife)
|
|
||||||
ecmd->supported &= ~SUPPORTED_1000baseT_Full;
|
|
||||||
ecmd->advertising = ADVERTISED_TP;
|
ecmd->advertising = ADVERTISED_TP;
|
||||||
|
|
||||||
if (hw->autoneg == 1) {
|
if (hw->autoneg == 1) {
|
||||||
|
@ -178,14 +175,6 @@ static int e1000_set_settings(struct net_device *netdev,
|
||||||
struct e1000_adapter *adapter = netdev_priv(netdev);
|
struct e1000_adapter *adapter = netdev_priv(netdev);
|
||||||
struct e1000_hw *hw = &adapter->hw;
|
struct e1000_hw *hw = &adapter->hw;
|
||||||
|
|
||||||
/* When SoL/IDER sessions are active, autoneg/speed/duplex
|
|
||||||
* cannot be changed */
|
|
||||||
if (e1000_check_phy_reset_block(hw)) {
|
|
||||||
DPRINTK(DRV, ERR, "Cannot change link characteristics "
|
|
||||||
"when SoL/IDER is active.\n");
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (test_and_set_bit(__E1000_RESETTING, &adapter->flags))
|
while (test_and_set_bit(__E1000_RESETTING, &adapter->flags))
|
||||||
msleep(1);
|
msleep(1);
|
||||||
|
|
||||||
|
@ -330,10 +319,7 @@ static int e1000_set_tso(struct net_device *netdev, u32 data)
|
||||||
else
|
else
|
||||||
netdev->features &= ~NETIF_F_TSO;
|
netdev->features &= ~NETIF_F_TSO;
|
||||||
|
|
||||||
if (data && (adapter->hw.mac_type > e1000_82547_rev_2))
|
netdev->features &= ~NETIF_F_TSO6;
|
||||||
netdev->features |= NETIF_F_TSO6;
|
|
||||||
else
|
|
||||||
netdev->features &= ~NETIF_F_TSO6;
|
|
||||||
|
|
||||||
DPRINTK(PROBE, INFO, "TSO is %s\n", data ? "Enabled" : "Disabled");
|
DPRINTK(PROBE, INFO, "TSO is %s\n", data ? "Enabled" : "Disabled");
|
||||||
adapter->tso_force = true;
|
adapter->tso_force = true;
|
||||||
|
@ -441,7 +427,6 @@ static void e1000_get_regs(struct net_device *netdev, struct ethtool_regs *regs,
|
||||||
regs_buff[24] = (u32)phy_data; /* phy local receiver status */
|
regs_buff[24] = (u32)phy_data; /* phy local receiver status */
|
||||||
regs_buff[25] = regs_buff[24]; /* phy remote receiver status */
|
regs_buff[25] = regs_buff[24]; /* phy remote receiver status */
|
||||||
if (hw->mac_type >= e1000_82540 &&
|
if (hw->mac_type >= e1000_82540 &&
|
||||||
hw->mac_type < e1000_82571 &&
|
|
||||||
hw->media_type == e1000_media_type_copper) {
|
hw->media_type == e1000_media_type_copper) {
|
||||||
regs_buff[26] = er32(MANC);
|
regs_buff[26] = er32(MANC);
|
||||||
}
|
}
|
||||||
|
@ -554,10 +539,8 @@ static int e1000_set_eeprom(struct net_device *netdev,
|
||||||
ret_val = e1000_write_eeprom(hw, first_word,
|
ret_val = e1000_write_eeprom(hw, first_word,
|
||||||
last_word - first_word + 1, eeprom_buff);
|
last_word - first_word + 1, eeprom_buff);
|
||||||
|
|
||||||
/* Update the checksum over the first part of the EEPROM if needed
|
/* Update the checksum over the first part of the EEPROM if needed */
|
||||||
* and flush shadow RAM for 82573 conrollers */
|
if ((ret_val == 0) && (first_word <= EEPROM_CHECKSUM_REG))
|
||||||
if ((ret_val == 0) && ((first_word <= EEPROM_CHECKSUM_REG) ||
|
|
||||||
(hw->mac_type == e1000_82573)))
|
|
||||||
e1000_update_eeprom_checksum(hw);
|
e1000_update_eeprom_checksum(hw);
|
||||||
|
|
||||||
kfree(eeprom_buff);
|
kfree(eeprom_buff);
|
||||||
|
@ -568,31 +551,12 @@ static void e1000_get_drvinfo(struct net_device *netdev,
|
||||||
struct ethtool_drvinfo *drvinfo)
|
struct ethtool_drvinfo *drvinfo)
|
||||||
{
|
{
|
||||||
struct e1000_adapter *adapter = netdev_priv(netdev);
|
struct e1000_adapter *adapter = netdev_priv(netdev);
|
||||||
struct e1000_hw *hw = &adapter->hw;
|
|
||||||
char firmware_version[32];
|
char firmware_version[32];
|
||||||
u16 eeprom_data;
|
|
||||||
|
|
||||||
strncpy(drvinfo->driver, e1000_driver_name, 32);
|
strncpy(drvinfo->driver, e1000_driver_name, 32);
|
||||||
strncpy(drvinfo->version, e1000_driver_version, 32);
|
strncpy(drvinfo->version, e1000_driver_version, 32);
|
||||||
|
|
||||||
/* EEPROM image version # is reported as firmware version # for
|
sprintf(firmware_version, "N/A");
|
||||||
* 8257{1|2|3} controllers */
|
|
||||||
e1000_read_eeprom(hw, 5, 1, &eeprom_data);
|
|
||||||
switch (hw->mac_type) {
|
|
||||||
case e1000_82571:
|
|
||||||
case e1000_82572:
|
|
||||||
case e1000_82573:
|
|
||||||
case e1000_80003es2lan:
|
|
||||||
case e1000_ich8lan:
|
|
||||||
sprintf(firmware_version, "%d.%d-%d",
|
|
||||||
(eeprom_data & 0xF000) >> 12,
|
|
||||||
(eeprom_data & 0x0FF0) >> 4,
|
|
||||||
eeprom_data & 0x000F);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
sprintf(firmware_version, "N/A");
|
|
||||||
}
|
|
||||||
|
|
||||||
strncpy(drvinfo->fw_version, firmware_version, 32);
|
strncpy(drvinfo->fw_version, firmware_version, 32);
|
||||||
strncpy(drvinfo->bus_info, pci_name(adapter->pdev), 32);
|
strncpy(drvinfo->bus_info, pci_name(adapter->pdev), 32);
|
||||||
drvinfo->regdump_len = e1000_get_regs_len(netdev);
|
drvinfo->regdump_len = e1000_get_regs_len(netdev);
|
||||||
|
@ -781,21 +745,9 @@ static int e1000_reg_test(struct e1000_adapter *adapter, u64 *data)
|
||||||
/* The status register is Read Only, so a write should fail.
|
/* The status register is Read Only, so a write should fail.
|
||||||
* Some bits that get toggled are ignored.
|
* Some bits that get toggled are ignored.
|
||||||
*/
|
*/
|
||||||
switch (hw->mac_type) {
|
|
||||||
/* there are several bits on newer hardware that are r/w */
|
/* there are several bits on newer hardware that are r/w */
|
||||||
case e1000_82571:
|
toggle = 0xFFFFF833;
|
||||||
case e1000_82572:
|
|
||||||
case e1000_80003es2lan:
|
|
||||||
toggle = 0x7FFFF3FF;
|
|
||||||
break;
|
|
||||||
case e1000_82573:
|
|
||||||
case e1000_ich8lan:
|
|
||||||
toggle = 0x7FFFF033;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
toggle = 0xFFFFF833;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
before = er32(STATUS);
|
before = er32(STATUS);
|
||||||
value = (er32(STATUS) & toggle);
|
value = (er32(STATUS) & toggle);
|
||||||
|
@ -810,12 +762,10 @@ static int e1000_reg_test(struct e1000_adapter *adapter, u64 *data)
|
||||||
/* restore previous status */
|
/* restore previous status */
|
||||||
ew32(STATUS, before);
|
ew32(STATUS, before);
|
||||||
|
|
||||||
if (hw->mac_type != e1000_ich8lan) {
|
REG_PATTERN_TEST(FCAL, 0xFFFFFFFF, 0xFFFFFFFF);
|
||||||
REG_PATTERN_TEST(FCAL, 0xFFFFFFFF, 0xFFFFFFFF);
|
REG_PATTERN_TEST(FCAH, 0x0000FFFF, 0xFFFFFFFF);
|
||||||
REG_PATTERN_TEST(FCAH, 0x0000FFFF, 0xFFFFFFFF);
|
REG_PATTERN_TEST(FCT, 0x0000FFFF, 0xFFFFFFFF);
|
||||||
REG_PATTERN_TEST(FCT, 0x0000FFFF, 0xFFFFFFFF);
|
REG_PATTERN_TEST(VET, 0x0000FFFF, 0xFFFFFFFF);
|
||||||
REG_PATTERN_TEST(VET, 0x0000FFFF, 0xFFFFFFFF);
|
|
||||||
}
|
|
||||||
|
|
||||||
REG_PATTERN_TEST(RDTR, 0x0000FFFF, 0xFFFFFFFF);
|
REG_PATTERN_TEST(RDTR, 0x0000FFFF, 0xFFFFFFFF);
|
||||||
REG_PATTERN_TEST(RDBAH, 0xFFFFFFFF, 0xFFFFFFFF);
|
REG_PATTERN_TEST(RDBAH, 0xFFFFFFFF, 0xFFFFFFFF);
|
||||||
|
@ -830,8 +780,7 @@ static int e1000_reg_test(struct e1000_adapter *adapter, u64 *data)
|
||||||
|
|
||||||
REG_SET_AND_CHECK(RCTL, 0xFFFFFFFF, 0x00000000);
|
REG_SET_AND_CHECK(RCTL, 0xFFFFFFFF, 0x00000000);
|
||||||
|
|
||||||
before = (hw->mac_type == e1000_ich8lan ?
|
before = 0x06DFB3FE;
|
||||||
0x06C3B33E : 0x06DFB3FE);
|
|
||||||
REG_SET_AND_CHECK(RCTL, before, 0x003FFFFB);
|
REG_SET_AND_CHECK(RCTL, before, 0x003FFFFB);
|
||||||
REG_SET_AND_CHECK(TCTL, 0xFFFFFFFF, 0x00000000);
|
REG_SET_AND_CHECK(TCTL, 0xFFFFFFFF, 0x00000000);
|
||||||
|
|
||||||
|
@ -839,12 +788,10 @@ static int e1000_reg_test(struct e1000_adapter *adapter, u64 *data)
|
||||||
|
|
||||||
REG_SET_AND_CHECK(RCTL, before, 0xFFFFFFFF);
|
REG_SET_AND_CHECK(RCTL, before, 0xFFFFFFFF);
|
||||||
REG_PATTERN_TEST(RDBAL, 0xFFFFFFF0, 0xFFFFFFFF);
|
REG_PATTERN_TEST(RDBAL, 0xFFFFFFF0, 0xFFFFFFFF);
|
||||||
if (hw->mac_type != e1000_ich8lan)
|
REG_PATTERN_TEST(TXCW, 0xC000FFFF, 0x0000FFFF);
|
||||||
REG_PATTERN_TEST(TXCW, 0xC000FFFF, 0x0000FFFF);
|
|
||||||
REG_PATTERN_TEST(TDBAL, 0xFFFFFFF0, 0xFFFFFFFF);
|
REG_PATTERN_TEST(TDBAL, 0xFFFFFFF0, 0xFFFFFFFF);
|
||||||
REG_PATTERN_TEST(TIDV, 0x0000FFFF, 0x0000FFFF);
|
REG_PATTERN_TEST(TIDV, 0x0000FFFF, 0x0000FFFF);
|
||||||
value = (hw->mac_type == e1000_ich8lan ?
|
value = E1000_RAR_ENTRIES;
|
||||||
E1000_RAR_ENTRIES_ICH8LAN : E1000_RAR_ENTRIES);
|
|
||||||
for (i = 0; i < value; i++) {
|
for (i = 0; i < value; i++) {
|
||||||
REG_PATTERN_TEST(RA + (((i << 1) + 1) << 2), 0x8003FFFF,
|
REG_PATTERN_TEST(RA + (((i << 1) + 1) << 2), 0x8003FFFF,
|
||||||
0xFFFFFFFF);
|
0xFFFFFFFF);
|
||||||
|
@ -859,8 +806,7 @@ static int e1000_reg_test(struct e1000_adapter *adapter, u64 *data)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
value = (hw->mac_type == e1000_ich8lan ?
|
value = E1000_MC_TBL_SIZE;
|
||||||
E1000_MC_TBL_SIZE_ICH8LAN : E1000_MC_TBL_SIZE);
|
|
||||||
for (i = 0; i < value; i++)
|
for (i = 0; i < value; i++)
|
||||||
REG_PATTERN_TEST(MTA + (i << 2), 0xFFFFFFFF, 0xFFFFFFFF);
|
REG_PATTERN_TEST(MTA + (i << 2), 0xFFFFFFFF, 0xFFFFFFFF);
|
||||||
|
|
||||||
|
@ -933,9 +879,6 @@ static int e1000_intr_test(struct e1000_adapter *adapter, u64 *data)
|
||||||
/* Test each interrupt */
|
/* Test each interrupt */
|
||||||
for (; i < 10; i++) {
|
for (; i < 10; i++) {
|
||||||
|
|
||||||
if (hw->mac_type == e1000_ich8lan && i == 8)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* Interrupt to test */
|
/* Interrupt to test */
|
||||||
mask = 1 << i;
|
mask = 1 << i;
|
||||||
|
|
||||||
|
@ -1289,35 +1232,20 @@ static int e1000_integrated_phy_loopback(struct e1000_adapter *adapter)
|
||||||
e1000_write_phy_reg(hw, PHY_CTRL, 0x9140);
|
e1000_write_phy_reg(hw, PHY_CTRL, 0x9140);
|
||||||
/* autoneg off */
|
/* autoneg off */
|
||||||
e1000_write_phy_reg(hw, PHY_CTRL, 0x8140);
|
e1000_write_phy_reg(hw, PHY_CTRL, 0x8140);
|
||||||
} else if (hw->phy_type == e1000_phy_gg82563)
|
}
|
||||||
e1000_write_phy_reg(hw,
|
|
||||||
GG82563_PHY_KMRN_MODE_CTRL,
|
|
||||||
0x1CC);
|
|
||||||
|
|
||||||
ctrl_reg = er32(CTRL);
|
ctrl_reg = er32(CTRL);
|
||||||
|
|
||||||
if (hw->phy_type == e1000_phy_ife) {
|
/* force 1000, set loopback */
|
||||||
/* force 100, set loopback */
|
e1000_write_phy_reg(hw, PHY_CTRL, 0x4140);
|
||||||
e1000_write_phy_reg(hw, PHY_CTRL, 0x6100);
|
|
||||||
|
|
||||||
/* Now set up the MAC to the same speed/duplex as the PHY. */
|
/* Now set up the MAC to the same speed/duplex as the PHY. */
|
||||||
ctrl_reg &= ~E1000_CTRL_SPD_SEL; /* Clear the speed sel bits */
|
ctrl_reg = er32(CTRL);
|
||||||
ctrl_reg |= (E1000_CTRL_FRCSPD | /* Set the Force Speed Bit */
|
ctrl_reg &= ~E1000_CTRL_SPD_SEL; /* Clear the speed sel bits */
|
||||||
E1000_CTRL_FRCDPX | /* Set the Force Duplex Bit */
|
ctrl_reg |= (E1000_CTRL_FRCSPD | /* Set the Force Speed Bit */
|
||||||
E1000_CTRL_SPD_100 |/* Force Speed to 100 */
|
E1000_CTRL_FRCDPX | /* Set the Force Duplex Bit */
|
||||||
E1000_CTRL_FD); /* Force Duplex to FULL */
|
E1000_CTRL_SPD_1000 |/* Force Speed to 1000 */
|
||||||
} else {
|
E1000_CTRL_FD); /* Force Duplex to FULL */
|
||||||
/* force 1000, set loopback */
|
|
||||||
e1000_write_phy_reg(hw, PHY_CTRL, 0x4140);
|
|
||||||
|
|
||||||
/* Now set up the MAC to the same speed/duplex as the PHY. */
|
|
||||||
ctrl_reg = er32(CTRL);
|
|
||||||
ctrl_reg &= ~E1000_CTRL_SPD_SEL; /* Clear the speed sel bits */
|
|
||||||
ctrl_reg |= (E1000_CTRL_FRCSPD | /* Set the Force Speed Bit */
|
|
||||||
E1000_CTRL_FRCDPX | /* Set the Force Duplex Bit */
|
|
||||||
E1000_CTRL_SPD_1000 |/* Force Speed to 1000 */
|
|
||||||
E1000_CTRL_FD); /* Force Duplex to FULL */
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hw->media_type == e1000_media_type_copper &&
|
if (hw->media_type == e1000_media_type_copper &&
|
||||||
hw->phy_type == e1000_phy_m88)
|
hw->phy_type == e1000_phy_m88)
|
||||||
|
@ -1373,14 +1301,8 @@ static int e1000_set_phy_loopback(struct e1000_adapter *adapter)
|
||||||
case e1000_82541_rev_2:
|
case e1000_82541_rev_2:
|
||||||
case e1000_82547:
|
case e1000_82547:
|
||||||
case e1000_82547_rev_2:
|
case e1000_82547_rev_2:
|
||||||
case e1000_82571:
|
|
||||||
case e1000_82572:
|
|
||||||
case e1000_82573:
|
|
||||||
case e1000_80003es2lan:
|
|
||||||
case e1000_ich8lan:
|
|
||||||
return e1000_integrated_phy_loopback(adapter);
|
return e1000_integrated_phy_loopback(adapter);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
/* Default PHY loopback work is to read the MII
|
/* Default PHY loopback work is to read the MII
|
||||||
* control register and assert bit 14 (loopback mode).
|
* control register and assert bit 14 (loopback mode).
|
||||||
|
@ -1409,14 +1331,6 @@ static int e1000_setup_loopback_test(struct e1000_adapter *adapter)
|
||||||
case e1000_82546_rev_3:
|
case e1000_82546_rev_3:
|
||||||
return e1000_set_phy_loopback(adapter);
|
return e1000_set_phy_loopback(adapter);
|
||||||
break;
|
break;
|
||||||
case e1000_82571:
|
|
||||||
case e1000_82572:
|
|
||||||
#define E1000_SERDES_LB_ON 0x410
|
|
||||||
e1000_set_phy_loopback(adapter);
|
|
||||||
ew32(SCTL, E1000_SERDES_LB_ON);
|
|
||||||
msleep(10);
|
|
||||||
return 0;
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
rctl = er32(RCTL);
|
rctl = er32(RCTL);
|
||||||
rctl |= E1000_RCTL_LBM_TCVR;
|
rctl |= E1000_RCTL_LBM_TCVR;
|
||||||
|
@ -1440,26 +1354,12 @@ static void e1000_loopback_cleanup(struct e1000_adapter *adapter)
|
||||||
ew32(RCTL, rctl);
|
ew32(RCTL, rctl);
|
||||||
|
|
||||||
switch (hw->mac_type) {
|
switch (hw->mac_type) {
|
||||||
case e1000_82571:
|
|
||||||
case e1000_82572:
|
|
||||||
if (hw->media_type == e1000_media_type_fiber ||
|
|
||||||
hw->media_type == e1000_media_type_internal_serdes) {
|
|
||||||
#define E1000_SERDES_LB_OFF 0x400
|
|
||||||
ew32(SCTL, E1000_SERDES_LB_OFF);
|
|
||||||
msleep(10);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* Fall Through */
|
|
||||||
case e1000_82545:
|
case e1000_82545:
|
||||||
case e1000_82546:
|
case e1000_82546:
|
||||||
case e1000_82545_rev_3:
|
case e1000_82545_rev_3:
|
||||||
case e1000_82546_rev_3:
|
case e1000_82546_rev_3:
|
||||||
default:
|
default:
|
||||||
hw->autoneg = true;
|
hw->autoneg = true;
|
||||||
if (hw->phy_type == e1000_phy_gg82563)
|
|
||||||
e1000_write_phy_reg(hw,
|
|
||||||
GG82563_PHY_KMRN_MODE_CTRL,
|
|
||||||
0x180);
|
|
||||||
e1000_read_phy_reg(hw, PHY_CTRL, &phy_reg);
|
e1000_read_phy_reg(hw, PHY_CTRL, &phy_reg);
|
||||||
if (phy_reg & MII_CR_LOOPBACK) {
|
if (phy_reg & MII_CR_LOOPBACK) {
|
||||||
phy_reg &= ~MII_CR_LOOPBACK;
|
phy_reg &= ~MII_CR_LOOPBACK;
|
||||||
|
@ -1560,17 +1460,6 @@ static int e1000_run_loopback_test(struct e1000_adapter *adapter)
|
||||||
|
|
||||||
static int e1000_loopback_test(struct e1000_adapter *adapter, u64 *data)
|
static int e1000_loopback_test(struct e1000_adapter *adapter, u64 *data)
|
||||||
{
|
{
|
||||||
struct e1000_hw *hw = &adapter->hw;
|
|
||||||
|
|
||||||
/* PHY loopback cannot be performed if SoL/IDER
|
|
||||||
* sessions are active */
|
|
||||||
if (e1000_check_phy_reset_block(hw)) {
|
|
||||||
DPRINTK(DRV, ERR, "Cannot do PHY loopback test "
|
|
||||||
"when SoL/IDER is active.\n");
|
|
||||||
*data = 0;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
*data = e1000_setup_desc_rings(adapter);
|
*data = e1000_setup_desc_rings(adapter);
|
||||||
if (*data)
|
if (*data)
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -1592,13 +1481,13 @@ static int e1000_link_test(struct e1000_adapter *adapter, u64 *data)
|
||||||
*data = 0;
|
*data = 0;
|
||||||
if (hw->media_type == e1000_media_type_internal_serdes) {
|
if (hw->media_type == e1000_media_type_internal_serdes) {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
hw->serdes_link_down = true;
|
hw->serdes_has_link = false;
|
||||||
|
|
||||||
/* On some blade server designs, link establishment
|
/* On some blade server designs, link establishment
|
||||||
* could take as long as 2-3 minutes */
|
* could take as long as 2-3 minutes */
|
||||||
do {
|
do {
|
||||||
e1000_check_for_link(hw);
|
e1000_check_for_link(hw);
|
||||||
if (!hw->serdes_link_down)
|
if (hw->serdes_has_link)
|
||||||
return *data;
|
return *data;
|
||||||
msleep(20);
|
msleep(20);
|
||||||
} while (i++ < 3750);
|
} while (i++ < 3750);
|
||||||
|
@ -1716,15 +1605,11 @@ static int e1000_wol_exclusion(struct e1000_adapter *adapter,
|
||||||
case E1000_DEV_ID_82545EM_COPPER:
|
case E1000_DEV_ID_82545EM_COPPER:
|
||||||
case E1000_DEV_ID_82546GB_QUAD_COPPER:
|
case E1000_DEV_ID_82546GB_QUAD_COPPER:
|
||||||
case E1000_DEV_ID_82546GB_PCIE:
|
case E1000_DEV_ID_82546GB_PCIE:
|
||||||
case E1000_DEV_ID_82571EB_SERDES_QUAD:
|
|
||||||
/* these don't support WoL at all */
|
/* these don't support WoL at all */
|
||||||
wol->supported = 0;
|
wol->supported = 0;
|
||||||
break;
|
break;
|
||||||
case E1000_DEV_ID_82546EB_FIBER:
|
case E1000_DEV_ID_82546EB_FIBER:
|
||||||
case E1000_DEV_ID_82546GB_FIBER:
|
case E1000_DEV_ID_82546GB_FIBER:
|
||||||
case E1000_DEV_ID_82571EB_FIBER:
|
|
||||||
case E1000_DEV_ID_82571EB_SERDES:
|
|
||||||
case E1000_DEV_ID_82571EB_COPPER:
|
|
||||||
/* Wake events not supported on port B */
|
/* Wake events not supported on port B */
|
||||||
if (er32(STATUS) & E1000_STATUS_FUNC_1) {
|
if (er32(STATUS) & E1000_STATUS_FUNC_1) {
|
||||||
wol->supported = 0;
|
wol->supported = 0;
|
||||||
|
@ -1733,10 +1618,6 @@ static int e1000_wol_exclusion(struct e1000_adapter *adapter,
|
||||||
/* return success for non excluded adapter ports */
|
/* return success for non excluded adapter ports */
|
||||||
retval = 0;
|
retval = 0;
|
||||||
break;
|
break;
|
||||||
case E1000_DEV_ID_82571EB_QUAD_COPPER:
|
|
||||||
case E1000_DEV_ID_82571EB_QUAD_FIBER:
|
|
||||||
case E1000_DEV_ID_82571EB_QUAD_COPPER_LOWPROFILE:
|
|
||||||
case E1000_DEV_ID_82571PT_QUAD_COPPER:
|
|
||||||
case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3:
|
case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3:
|
||||||
/* quad port adapters only support WoL on port A */
|
/* quad port adapters only support WoL on port A */
|
||||||
if (!adapter->quad_port_a) {
|
if (!adapter->quad_port_a) {
|
||||||
|
@ -1872,30 +1753,15 @@ static int e1000_phys_id(struct net_device *netdev, u32 data)
|
||||||
if (!data)
|
if (!data)
|
||||||
data = INT_MAX;
|
data = INT_MAX;
|
||||||
|
|
||||||
if (hw->mac_type < e1000_82571) {
|
if (!adapter->blink_timer.function) {
|
||||||
if (!adapter->blink_timer.function) {
|
init_timer(&adapter->blink_timer);
|
||||||
init_timer(&adapter->blink_timer);
|
adapter->blink_timer.function = e1000_led_blink_callback;
|
||||||
adapter->blink_timer.function = e1000_led_blink_callback;
|
adapter->blink_timer.data = (unsigned long)adapter;
|
||||||
adapter->blink_timer.data = (unsigned long)adapter;
|
|
||||||
}
|
|
||||||
e1000_setup_led(hw);
|
|
||||||
mod_timer(&adapter->blink_timer, jiffies);
|
|
||||||
msleep_interruptible(data * 1000);
|
|
||||||
del_timer_sync(&adapter->blink_timer);
|
|
||||||
} else if (hw->phy_type == e1000_phy_ife) {
|
|
||||||
if (!adapter->blink_timer.function) {
|
|
||||||
init_timer(&adapter->blink_timer);
|
|
||||||
adapter->blink_timer.function = e1000_led_blink_callback;
|
|
||||||
adapter->blink_timer.data = (unsigned long)adapter;
|
|
||||||
}
|
|
||||||
mod_timer(&adapter->blink_timer, jiffies);
|
|
||||||
msleep_interruptible(data * 1000);
|
|
||||||
del_timer_sync(&adapter->blink_timer);
|
|
||||||
e1000_write_phy_reg(&(adapter->hw), IFE_PHY_SPECIAL_CONTROL_LED, 0);
|
|
||||||
} else {
|
|
||||||
e1000_blink_led_start(hw);
|
|
||||||
msleep_interruptible(data * 1000);
|
|
||||||
}
|
}
|
||||||
|
e1000_setup_led(hw);
|
||||||
|
mod_timer(&adapter->blink_timer, jiffies);
|
||||||
|
msleep_interruptible(data * 1000);
|
||||||
|
del_timer_sync(&adapter->blink_timer);
|
||||||
|
|
||||||
e1000_led_off(hw);
|
e1000_led_off(hw);
|
||||||
clear_bit(E1000_LED_ON, &adapter->led_status);
|
clear_bit(E1000_LED_ON, &adapter->led_status);
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -518,22 +518,6 @@ void __devinit e1000_check_options(struct e1000_adapter *adapter)
|
||||||
adapter->smart_power_down = opt.def;
|
adapter->smart_power_down = opt.def;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
{ /* Kumeran Lock Loss Workaround */
|
|
||||||
opt = (struct e1000_option) {
|
|
||||||
.type = enable_option,
|
|
||||||
.name = "Kumeran Lock Loss Workaround",
|
|
||||||
.err = "defaulting to Enabled",
|
|
||||||
.def = OPTION_ENABLED
|
|
||||||
};
|
|
||||||
|
|
||||||
if (num_KumeranLockLoss > bd) {
|
|
||||||
unsigned int kmrn_lock_loss = KumeranLockLoss[bd];
|
|
||||||
e1000_validate_option(&kmrn_lock_loss, &opt, adapter);
|
|
||||||
adapter->hw.kmrn_lock_loss_workaround_disabled = !kmrn_lock_loss;
|
|
||||||
} else {
|
|
||||||
adapter->hw.kmrn_lock_loss_workaround_disabled = !opt.def;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (adapter->hw.media_type) {
|
switch (adapter->hw.media_type) {
|
||||||
case e1000_media_type_fiber:
|
case e1000_media_type_fiber:
|
||||||
|
@ -626,12 +610,6 @@ static void __devinit e1000_check_copper_options(struct e1000_adapter *adapter)
|
||||||
.p = dplx_list }}
|
.p = dplx_list }}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (e1000_check_phy_reset_block(&adapter->hw)) {
|
|
||||||
DPRINTK(PROBE, INFO,
|
|
||||||
"Link active due to SoL/IDER Session. "
|
|
||||||
"Speed/Duplex/AutoNeg parameter ignored.\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (num_Duplex > bd) {
|
if (num_Duplex > bd) {
|
||||||
dplx = Duplex[bd];
|
dplx = Duplex[bd];
|
||||||
e1000_validate_option(&dplx, &opt, adapter);
|
e1000_validate_option(&dplx, &opt, adapter);
|
||||||
|
|
|
@ -99,6 +99,8 @@ static struct iwl_lib_ops iwl1000_lib = {
|
||||||
.setup_deferred_work = iwl5000_setup_deferred_work,
|
.setup_deferred_work = iwl5000_setup_deferred_work,
|
||||||
.is_valid_rtc_data_addr = iwl5000_hw_valid_rtc_data_addr,
|
.is_valid_rtc_data_addr = iwl5000_hw_valid_rtc_data_addr,
|
||||||
.load_ucode = iwl5000_load_ucode,
|
.load_ucode = iwl5000_load_ucode,
|
||||||
|
.dump_nic_event_log = iwl_dump_nic_event_log,
|
||||||
|
.dump_nic_error_log = iwl_dump_nic_error_log,
|
||||||
.init_alive_start = iwl5000_init_alive_start,
|
.init_alive_start = iwl5000_init_alive_start,
|
||||||
.alive_notify = iwl5000_alive_notify,
|
.alive_notify = iwl5000_alive_notify,
|
||||||
.send_tx_power = iwl5000_send_tx_power,
|
.send_tx_power = iwl5000_send_tx_power,
|
||||||
|
|
|
@ -2839,6 +2839,8 @@ static struct iwl_lib_ops iwl3945_lib = {
|
||||||
.txq_free_tfd = iwl3945_hw_txq_free_tfd,
|
.txq_free_tfd = iwl3945_hw_txq_free_tfd,
|
||||||
.txq_init = iwl3945_hw_tx_queue_init,
|
.txq_init = iwl3945_hw_tx_queue_init,
|
||||||
.load_ucode = iwl3945_load_bsm,
|
.load_ucode = iwl3945_load_bsm,
|
||||||
|
.dump_nic_event_log = iwl3945_dump_nic_event_log,
|
||||||
|
.dump_nic_error_log = iwl3945_dump_nic_error_log,
|
||||||
.apm_ops = {
|
.apm_ops = {
|
||||||
.init = iwl3945_apm_init,
|
.init = iwl3945_apm_init,
|
||||||
.reset = iwl3945_apm_reset,
|
.reset = iwl3945_apm_reset,
|
||||||
|
|
|
@ -209,6 +209,8 @@ extern int __must_check iwl3945_send_cmd(struct iwl_priv *priv,
|
||||||
struct iwl_host_cmd *cmd);
|
struct iwl_host_cmd *cmd);
|
||||||
extern unsigned int iwl3945_fill_beacon_frame(struct iwl_priv *priv,
|
extern unsigned int iwl3945_fill_beacon_frame(struct iwl_priv *priv,
|
||||||
struct ieee80211_hdr *hdr,int left);
|
struct ieee80211_hdr *hdr,int left);
|
||||||
|
extern void iwl3945_dump_nic_event_log(struct iwl_priv *priv);
|
||||||
|
extern void iwl3945_dump_nic_error_log(struct iwl_priv *priv);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Currently used by iwl-3945-rs... look at restructuring so that it doesn't
|
* Currently used by iwl-3945-rs... look at restructuring so that it doesn't
|
||||||
|
|
|
@ -2298,6 +2298,8 @@ static struct iwl_lib_ops iwl4965_lib = {
|
||||||
.alive_notify = iwl4965_alive_notify,
|
.alive_notify = iwl4965_alive_notify,
|
||||||
.init_alive_start = iwl4965_init_alive_start,
|
.init_alive_start = iwl4965_init_alive_start,
|
||||||
.load_ucode = iwl4965_load_bsm,
|
.load_ucode = iwl4965_load_bsm,
|
||||||
|
.dump_nic_event_log = iwl_dump_nic_event_log,
|
||||||
|
.dump_nic_error_log = iwl_dump_nic_error_log,
|
||||||
.apm_ops = {
|
.apm_ops = {
|
||||||
.init = iwl4965_apm_init,
|
.init = iwl4965_apm_init,
|
||||||
.reset = iwl4965_apm_reset,
|
.reset = iwl4965_apm_reset,
|
||||||
|
|
|
@ -1535,6 +1535,8 @@ struct iwl_lib_ops iwl5000_lib = {
|
||||||
.rx_handler_setup = iwl5000_rx_handler_setup,
|
.rx_handler_setup = iwl5000_rx_handler_setup,
|
||||||
.setup_deferred_work = iwl5000_setup_deferred_work,
|
.setup_deferred_work = iwl5000_setup_deferred_work,
|
||||||
.is_valid_rtc_data_addr = iwl5000_hw_valid_rtc_data_addr,
|
.is_valid_rtc_data_addr = iwl5000_hw_valid_rtc_data_addr,
|
||||||
|
.dump_nic_event_log = iwl_dump_nic_event_log,
|
||||||
|
.dump_nic_error_log = iwl_dump_nic_error_log,
|
||||||
.load_ucode = iwl5000_load_ucode,
|
.load_ucode = iwl5000_load_ucode,
|
||||||
.init_alive_start = iwl5000_init_alive_start,
|
.init_alive_start = iwl5000_init_alive_start,
|
||||||
.alive_notify = iwl5000_alive_notify,
|
.alive_notify = iwl5000_alive_notify,
|
||||||
|
@ -1585,6 +1587,8 @@ static struct iwl_lib_ops iwl5150_lib = {
|
||||||
.rx_handler_setup = iwl5000_rx_handler_setup,
|
.rx_handler_setup = iwl5000_rx_handler_setup,
|
||||||
.setup_deferred_work = iwl5000_setup_deferred_work,
|
.setup_deferred_work = iwl5000_setup_deferred_work,
|
||||||
.is_valid_rtc_data_addr = iwl5000_hw_valid_rtc_data_addr,
|
.is_valid_rtc_data_addr = iwl5000_hw_valid_rtc_data_addr,
|
||||||
|
.dump_nic_event_log = iwl_dump_nic_event_log,
|
||||||
|
.dump_nic_error_log = iwl_dump_nic_error_log,
|
||||||
.load_ucode = iwl5000_load_ucode,
|
.load_ucode = iwl5000_load_ucode,
|
||||||
.init_alive_start = iwl5000_init_alive_start,
|
.init_alive_start = iwl5000_init_alive_start,
|
||||||
.alive_notify = iwl5000_alive_notify,
|
.alive_notify = iwl5000_alive_notify,
|
||||||
|
|
|
@ -100,6 +100,8 @@ static struct iwl_lib_ops iwl6000_lib = {
|
||||||
.setup_deferred_work = iwl5000_setup_deferred_work,
|
.setup_deferred_work = iwl5000_setup_deferred_work,
|
||||||
.is_valid_rtc_data_addr = iwl5000_hw_valid_rtc_data_addr,
|
.is_valid_rtc_data_addr = iwl5000_hw_valid_rtc_data_addr,
|
||||||
.load_ucode = iwl5000_load_ucode,
|
.load_ucode = iwl5000_load_ucode,
|
||||||
|
.dump_nic_event_log = iwl_dump_nic_event_log,
|
||||||
|
.dump_nic_error_log = iwl_dump_nic_error_log,
|
||||||
.init_alive_start = iwl5000_init_alive_start,
|
.init_alive_start = iwl5000_init_alive_start,
|
||||||
.alive_notify = iwl5000_alive_notify,
|
.alive_notify = iwl5000_alive_notify,
|
||||||
.send_tx_power = iwl5000_send_tx_power,
|
.send_tx_power = iwl5000_send_tx_power,
|
||||||
|
|
|
@ -1526,6 +1526,191 @@ static int iwl_read_ucode(struct iwl_priv *priv)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_IWLWIFI_DEBUG
|
||||||
|
static const char *desc_lookup_text[] = {
|
||||||
|
"OK",
|
||||||
|
"FAIL",
|
||||||
|
"BAD_PARAM",
|
||||||
|
"BAD_CHECKSUM",
|
||||||
|
"NMI_INTERRUPT_WDG",
|
||||||
|
"SYSASSERT",
|
||||||
|
"FATAL_ERROR",
|
||||||
|
"BAD_COMMAND",
|
||||||
|
"HW_ERROR_TUNE_LOCK",
|
||||||
|
"HW_ERROR_TEMPERATURE",
|
||||||
|
"ILLEGAL_CHAN_FREQ",
|
||||||
|
"VCC_NOT_STABLE",
|
||||||
|
"FH_ERROR",
|
||||||
|
"NMI_INTERRUPT_HOST",
|
||||||
|
"NMI_INTERRUPT_ACTION_PT",
|
||||||
|
"NMI_INTERRUPT_UNKNOWN",
|
||||||
|
"UCODE_VERSION_MISMATCH",
|
||||||
|
"HW_ERROR_ABS_LOCK",
|
||||||
|
"HW_ERROR_CAL_LOCK_FAIL",
|
||||||
|
"NMI_INTERRUPT_INST_ACTION_PT",
|
||||||
|
"NMI_INTERRUPT_DATA_ACTION_PT",
|
||||||
|
"NMI_TRM_HW_ER",
|
||||||
|
"NMI_INTERRUPT_TRM",
|
||||||
|
"NMI_INTERRUPT_BREAK_POINT"
|
||||||
|
"DEBUG_0",
|
||||||
|
"DEBUG_1",
|
||||||
|
"DEBUG_2",
|
||||||
|
"DEBUG_3",
|
||||||
|
"UNKNOWN"
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *desc_lookup(int i)
|
||||||
|
{
|
||||||
|
int max = ARRAY_SIZE(desc_lookup_text) - 1;
|
||||||
|
|
||||||
|
if (i < 0 || i > max)
|
||||||
|
i = max;
|
||||||
|
|
||||||
|
return desc_lookup_text[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ERROR_START_OFFSET (1 * sizeof(u32))
|
||||||
|
#define ERROR_ELEM_SIZE (7 * sizeof(u32))
|
||||||
|
|
||||||
|
void iwl_dump_nic_error_log(struct iwl_priv *priv)
|
||||||
|
{
|
||||||
|
u32 data2, line;
|
||||||
|
u32 desc, time, count, base, data1;
|
||||||
|
u32 blink1, blink2, ilink1, ilink2;
|
||||||
|
|
||||||
|
if (priv->ucode_type == UCODE_INIT)
|
||||||
|
base = le32_to_cpu(priv->card_alive_init.error_event_table_ptr);
|
||||||
|
else
|
||||||
|
base = le32_to_cpu(priv->card_alive.error_event_table_ptr);
|
||||||
|
|
||||||
|
if (!priv->cfg->ops->lib->is_valid_rtc_data_addr(base)) {
|
||||||
|
IWL_ERR(priv, "Not valid error log pointer 0x%08X\n", base);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
count = iwl_read_targ_mem(priv, base);
|
||||||
|
|
||||||
|
if (ERROR_START_OFFSET <= count * ERROR_ELEM_SIZE) {
|
||||||
|
IWL_ERR(priv, "Start IWL Error Log Dump:\n");
|
||||||
|
IWL_ERR(priv, "Status: 0x%08lX, count: %d\n",
|
||||||
|
priv->status, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
desc = iwl_read_targ_mem(priv, base + 1 * sizeof(u32));
|
||||||
|
blink1 = iwl_read_targ_mem(priv, base + 3 * sizeof(u32));
|
||||||
|
blink2 = iwl_read_targ_mem(priv, base + 4 * sizeof(u32));
|
||||||
|
ilink1 = iwl_read_targ_mem(priv, base + 5 * sizeof(u32));
|
||||||
|
ilink2 = iwl_read_targ_mem(priv, base + 6 * sizeof(u32));
|
||||||
|
data1 = iwl_read_targ_mem(priv, base + 7 * sizeof(u32));
|
||||||
|
data2 = iwl_read_targ_mem(priv, base + 8 * sizeof(u32));
|
||||||
|
line = iwl_read_targ_mem(priv, base + 9 * sizeof(u32));
|
||||||
|
time = iwl_read_targ_mem(priv, base + 11 * sizeof(u32));
|
||||||
|
|
||||||
|
IWL_ERR(priv, "Desc Time "
|
||||||
|
"data1 data2 line\n");
|
||||||
|
IWL_ERR(priv, "%-28s (#%02d) %010u 0x%08X 0x%08X %u\n",
|
||||||
|
desc_lookup(desc), desc, time, data1, data2, line);
|
||||||
|
IWL_ERR(priv, "blink1 blink2 ilink1 ilink2\n");
|
||||||
|
IWL_ERR(priv, "0x%05X 0x%05X 0x%05X 0x%05X\n", blink1, blink2,
|
||||||
|
ilink1, ilink2);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#define EVENT_START_OFFSET (4 * sizeof(u32))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* iwl_print_event_log - Dump error event log to syslog
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static void iwl_print_event_log(struct iwl_priv *priv, u32 start_idx,
|
||||||
|
u32 num_events, u32 mode)
|
||||||
|
{
|
||||||
|
u32 i;
|
||||||
|
u32 base; /* SRAM byte address of event log header */
|
||||||
|
u32 event_size; /* 2 u32s, or 3 u32s if timestamp recorded */
|
||||||
|
u32 ptr; /* SRAM byte address of log data */
|
||||||
|
u32 ev, time, data; /* event log data */
|
||||||
|
|
||||||
|
if (num_events == 0)
|
||||||
|
return;
|
||||||
|
if (priv->ucode_type == UCODE_INIT)
|
||||||
|
base = le32_to_cpu(priv->card_alive_init.log_event_table_ptr);
|
||||||
|
else
|
||||||
|
base = le32_to_cpu(priv->card_alive.log_event_table_ptr);
|
||||||
|
|
||||||
|
if (mode == 0)
|
||||||
|
event_size = 2 * sizeof(u32);
|
||||||
|
else
|
||||||
|
event_size = 3 * sizeof(u32);
|
||||||
|
|
||||||
|
ptr = base + EVENT_START_OFFSET + (start_idx * event_size);
|
||||||
|
|
||||||
|
/* "time" is actually "data" for mode 0 (no timestamp).
|
||||||
|
* place event id # at far right for easier visual parsing. */
|
||||||
|
for (i = 0; i < num_events; i++) {
|
||||||
|
ev = iwl_read_targ_mem(priv, ptr);
|
||||||
|
ptr += sizeof(u32);
|
||||||
|
time = iwl_read_targ_mem(priv, ptr);
|
||||||
|
ptr += sizeof(u32);
|
||||||
|
if (mode == 0) {
|
||||||
|
/* data, ev */
|
||||||
|
IWL_ERR(priv, "EVT_LOG:0x%08x:%04u\n", time, ev);
|
||||||
|
} else {
|
||||||
|
data = iwl_read_targ_mem(priv, ptr);
|
||||||
|
ptr += sizeof(u32);
|
||||||
|
IWL_ERR(priv, "EVT_LOGT:%010u:0x%08x:%04u\n",
|
||||||
|
time, data, ev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void iwl_dump_nic_event_log(struct iwl_priv *priv)
|
||||||
|
{
|
||||||
|
u32 base; /* SRAM byte address of event log header */
|
||||||
|
u32 capacity; /* event log capacity in # entries */
|
||||||
|
u32 mode; /* 0 - no timestamp, 1 - timestamp recorded */
|
||||||
|
u32 num_wraps; /* # times uCode wrapped to top of log */
|
||||||
|
u32 next_entry; /* index of next entry to be written by uCode */
|
||||||
|
u32 size; /* # entries that we'll print */
|
||||||
|
|
||||||
|
if (priv->ucode_type == UCODE_INIT)
|
||||||
|
base = le32_to_cpu(priv->card_alive_init.log_event_table_ptr);
|
||||||
|
else
|
||||||
|
base = le32_to_cpu(priv->card_alive.log_event_table_ptr);
|
||||||
|
|
||||||
|
if (!priv->cfg->ops->lib->is_valid_rtc_data_addr(base)) {
|
||||||
|
IWL_ERR(priv, "Invalid event log pointer 0x%08X\n", base);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* event log header */
|
||||||
|
capacity = iwl_read_targ_mem(priv, base);
|
||||||
|
mode = iwl_read_targ_mem(priv, base + (1 * sizeof(u32)));
|
||||||
|
num_wraps = iwl_read_targ_mem(priv, base + (2 * sizeof(u32)));
|
||||||
|
next_entry = iwl_read_targ_mem(priv, base + (3 * sizeof(u32)));
|
||||||
|
|
||||||
|
size = num_wraps ? capacity : next_entry;
|
||||||
|
|
||||||
|
/* bail out if nothing in log */
|
||||||
|
if (size == 0) {
|
||||||
|
IWL_ERR(priv, "Start IWL Event Log Dump: nothing in log\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
IWL_ERR(priv, "Start IWL Event Log Dump: display count %d, wraps %d\n",
|
||||||
|
size, num_wraps);
|
||||||
|
|
||||||
|
/* if uCode has wrapped back to top of log, start at the oldest entry,
|
||||||
|
* i.e the next one that uCode would fill. */
|
||||||
|
if (num_wraps)
|
||||||
|
iwl_print_event_log(priv, next_entry,
|
||||||
|
capacity - next_entry, mode);
|
||||||
|
/* (then/else) start at top of log */
|
||||||
|
iwl_print_event_log(priv, 0, next_entry, mode);
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* iwl_alive_start - called after REPLY_ALIVE notification received
|
* iwl_alive_start - called after REPLY_ALIVE notification received
|
||||||
* from protocol/runtime uCode (initialization uCode's
|
* from protocol/runtime uCode (initialization uCode's
|
||||||
|
|
|
@ -1309,189 +1309,6 @@ static void iwl_print_rx_config_cmd(struct iwl_priv *priv)
|
||||||
IWL_DEBUG_RADIO(priv, "u8[6] bssid_addr: %pM\n", rxon->bssid_addr);
|
IWL_DEBUG_RADIO(priv, "u8[6] bssid_addr: %pM\n", rxon->bssid_addr);
|
||||||
IWL_DEBUG_RADIO(priv, "u16 assoc_id: 0x%x\n", le16_to_cpu(rxon->assoc_id));
|
IWL_DEBUG_RADIO(priv, "u16 assoc_id: 0x%x\n", le16_to_cpu(rxon->assoc_id));
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *desc_lookup_text[] = {
|
|
||||||
"OK",
|
|
||||||
"FAIL",
|
|
||||||
"BAD_PARAM",
|
|
||||||
"BAD_CHECKSUM",
|
|
||||||
"NMI_INTERRUPT_WDG",
|
|
||||||
"SYSASSERT",
|
|
||||||
"FATAL_ERROR",
|
|
||||||
"BAD_COMMAND",
|
|
||||||
"HW_ERROR_TUNE_LOCK",
|
|
||||||
"HW_ERROR_TEMPERATURE",
|
|
||||||
"ILLEGAL_CHAN_FREQ",
|
|
||||||
"VCC_NOT_STABLE",
|
|
||||||
"FH_ERROR",
|
|
||||||
"NMI_INTERRUPT_HOST",
|
|
||||||
"NMI_INTERRUPT_ACTION_PT",
|
|
||||||
"NMI_INTERRUPT_UNKNOWN",
|
|
||||||
"UCODE_VERSION_MISMATCH",
|
|
||||||
"HW_ERROR_ABS_LOCK",
|
|
||||||
"HW_ERROR_CAL_LOCK_FAIL",
|
|
||||||
"NMI_INTERRUPT_INST_ACTION_PT",
|
|
||||||
"NMI_INTERRUPT_DATA_ACTION_PT",
|
|
||||||
"NMI_TRM_HW_ER",
|
|
||||||
"NMI_INTERRUPT_TRM",
|
|
||||||
"NMI_INTERRUPT_BREAK_POINT"
|
|
||||||
"DEBUG_0",
|
|
||||||
"DEBUG_1",
|
|
||||||
"DEBUG_2",
|
|
||||||
"DEBUG_3",
|
|
||||||
"UNKNOWN"
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char *desc_lookup(int i)
|
|
||||||
{
|
|
||||||
int max = ARRAY_SIZE(desc_lookup_text) - 1;
|
|
||||||
|
|
||||||
if (i < 0 || i > max)
|
|
||||||
i = max;
|
|
||||||
|
|
||||||
return desc_lookup_text[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
#define ERROR_START_OFFSET (1 * sizeof(u32))
|
|
||||||
#define ERROR_ELEM_SIZE (7 * sizeof(u32))
|
|
||||||
|
|
||||||
static void iwl_dump_nic_error_log(struct iwl_priv *priv)
|
|
||||||
{
|
|
||||||
u32 data2, line;
|
|
||||||
u32 desc, time, count, base, data1;
|
|
||||||
u32 blink1, blink2, ilink1, ilink2;
|
|
||||||
|
|
||||||
if (priv->ucode_type == UCODE_INIT)
|
|
||||||
base = le32_to_cpu(priv->card_alive_init.error_event_table_ptr);
|
|
||||||
else
|
|
||||||
base = le32_to_cpu(priv->card_alive.error_event_table_ptr);
|
|
||||||
|
|
||||||
if (!priv->cfg->ops->lib->is_valid_rtc_data_addr(base)) {
|
|
||||||
IWL_ERR(priv, "Not valid error log pointer 0x%08X\n", base);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
count = iwl_read_targ_mem(priv, base);
|
|
||||||
|
|
||||||
if (ERROR_START_OFFSET <= count * ERROR_ELEM_SIZE) {
|
|
||||||
IWL_ERR(priv, "Start IWL Error Log Dump:\n");
|
|
||||||
IWL_ERR(priv, "Status: 0x%08lX, count: %d\n",
|
|
||||||
priv->status, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
desc = iwl_read_targ_mem(priv, base + 1 * sizeof(u32));
|
|
||||||
blink1 = iwl_read_targ_mem(priv, base + 3 * sizeof(u32));
|
|
||||||
blink2 = iwl_read_targ_mem(priv, base + 4 * sizeof(u32));
|
|
||||||
ilink1 = iwl_read_targ_mem(priv, base + 5 * sizeof(u32));
|
|
||||||
ilink2 = iwl_read_targ_mem(priv, base + 6 * sizeof(u32));
|
|
||||||
data1 = iwl_read_targ_mem(priv, base + 7 * sizeof(u32));
|
|
||||||
data2 = iwl_read_targ_mem(priv, base + 8 * sizeof(u32));
|
|
||||||
line = iwl_read_targ_mem(priv, base + 9 * sizeof(u32));
|
|
||||||
time = iwl_read_targ_mem(priv, base + 11 * sizeof(u32));
|
|
||||||
|
|
||||||
IWL_ERR(priv, "Desc Time "
|
|
||||||
"data1 data2 line\n");
|
|
||||||
IWL_ERR(priv, "%-28s (#%02d) %010u 0x%08X 0x%08X %u\n",
|
|
||||||
desc_lookup(desc), desc, time, data1, data2, line);
|
|
||||||
IWL_ERR(priv, "blink1 blink2 ilink1 ilink2\n");
|
|
||||||
IWL_ERR(priv, "0x%05X 0x%05X 0x%05X 0x%05X\n", blink1, blink2,
|
|
||||||
ilink1, ilink2);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#define EVENT_START_OFFSET (4 * sizeof(u32))
|
|
||||||
|
|
||||||
/**
|
|
||||||
* iwl_print_event_log - Dump error event log to syslog
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
static void iwl_print_event_log(struct iwl_priv *priv, u32 start_idx,
|
|
||||||
u32 num_events, u32 mode)
|
|
||||||
{
|
|
||||||
u32 i;
|
|
||||||
u32 base; /* SRAM byte address of event log header */
|
|
||||||
u32 event_size; /* 2 u32s, or 3 u32s if timestamp recorded */
|
|
||||||
u32 ptr; /* SRAM byte address of log data */
|
|
||||||
u32 ev, time, data; /* event log data */
|
|
||||||
|
|
||||||
if (num_events == 0)
|
|
||||||
return;
|
|
||||||
if (priv->ucode_type == UCODE_INIT)
|
|
||||||
base = le32_to_cpu(priv->card_alive_init.log_event_table_ptr);
|
|
||||||
else
|
|
||||||
base = le32_to_cpu(priv->card_alive.log_event_table_ptr);
|
|
||||||
|
|
||||||
if (mode == 0)
|
|
||||||
event_size = 2 * sizeof(u32);
|
|
||||||
else
|
|
||||||
event_size = 3 * sizeof(u32);
|
|
||||||
|
|
||||||
ptr = base + EVENT_START_OFFSET + (start_idx * event_size);
|
|
||||||
|
|
||||||
/* "time" is actually "data" for mode 0 (no timestamp).
|
|
||||||
* place event id # at far right for easier visual parsing. */
|
|
||||||
for (i = 0; i < num_events; i++) {
|
|
||||||
ev = iwl_read_targ_mem(priv, ptr);
|
|
||||||
ptr += sizeof(u32);
|
|
||||||
time = iwl_read_targ_mem(priv, ptr);
|
|
||||||
ptr += sizeof(u32);
|
|
||||||
if (mode == 0) {
|
|
||||||
/* data, ev */
|
|
||||||
IWL_ERR(priv, "EVT_LOG:0x%08x:%04u\n", time, ev);
|
|
||||||
} else {
|
|
||||||
data = iwl_read_targ_mem(priv, ptr);
|
|
||||||
ptr += sizeof(u32);
|
|
||||||
IWL_ERR(priv, "EVT_LOGT:%010u:0x%08x:%04u\n",
|
|
||||||
time, data, ev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void iwl_dump_nic_event_log(struct iwl_priv *priv)
|
|
||||||
{
|
|
||||||
u32 base; /* SRAM byte address of event log header */
|
|
||||||
u32 capacity; /* event log capacity in # entries */
|
|
||||||
u32 mode; /* 0 - no timestamp, 1 - timestamp recorded */
|
|
||||||
u32 num_wraps; /* # times uCode wrapped to top of log */
|
|
||||||
u32 next_entry; /* index of next entry to be written by uCode */
|
|
||||||
u32 size; /* # entries that we'll print */
|
|
||||||
|
|
||||||
if (priv->ucode_type == UCODE_INIT)
|
|
||||||
base = le32_to_cpu(priv->card_alive_init.log_event_table_ptr);
|
|
||||||
else
|
|
||||||
base = le32_to_cpu(priv->card_alive.log_event_table_ptr);
|
|
||||||
|
|
||||||
if (!priv->cfg->ops->lib->is_valid_rtc_data_addr(base)) {
|
|
||||||
IWL_ERR(priv, "Invalid event log pointer 0x%08X\n", base);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* event log header */
|
|
||||||
capacity = iwl_read_targ_mem(priv, base);
|
|
||||||
mode = iwl_read_targ_mem(priv, base + (1 * sizeof(u32)));
|
|
||||||
num_wraps = iwl_read_targ_mem(priv, base + (2 * sizeof(u32)));
|
|
||||||
next_entry = iwl_read_targ_mem(priv, base + (3 * sizeof(u32)));
|
|
||||||
|
|
||||||
size = num_wraps ? capacity : next_entry;
|
|
||||||
|
|
||||||
/* bail out if nothing in log */
|
|
||||||
if (size == 0) {
|
|
||||||
IWL_ERR(priv, "Start IWL Event Log Dump: nothing in log\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
IWL_ERR(priv, "Start IWL Event Log Dump: display count %d, wraps %d\n",
|
|
||||||
size, num_wraps);
|
|
||||||
|
|
||||||
/* if uCode has wrapped back to top of log, start at the oldest entry,
|
|
||||||
* i.e the next one that uCode would fill. */
|
|
||||||
if (num_wraps)
|
|
||||||
iwl_print_event_log(priv, next_entry,
|
|
||||||
capacity - next_entry, mode);
|
|
||||||
/* (then/else) start at top of log */
|
|
||||||
iwl_print_event_log(priv, 0, next_entry, mode);
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
/**
|
/**
|
||||||
* iwl_irq_handle_error - called for HW or SW error interrupt from card
|
* iwl_irq_handle_error - called for HW or SW error interrupt from card
|
||||||
|
@ -1506,8 +1323,8 @@ void iwl_irq_handle_error(struct iwl_priv *priv)
|
||||||
|
|
||||||
#ifdef CONFIG_IWLWIFI_DEBUG
|
#ifdef CONFIG_IWLWIFI_DEBUG
|
||||||
if (iwl_get_debug_level(priv) & IWL_DL_FW_ERRORS) {
|
if (iwl_get_debug_level(priv) & IWL_DL_FW_ERRORS) {
|
||||||
iwl_dump_nic_error_log(priv);
|
priv->cfg->ops->lib->dump_nic_error_log(priv);
|
||||||
iwl_dump_nic_event_log(priv);
|
priv->cfg->ops->lib->dump_nic_event_log(priv);
|
||||||
iwl_print_rx_config_cmd(priv);
|
iwl_print_rx_config_cmd(priv);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -166,6 +166,8 @@ struct iwl_lib_ops {
|
||||||
int (*is_valid_rtc_data_addr)(u32 addr);
|
int (*is_valid_rtc_data_addr)(u32 addr);
|
||||||
/* 1st ucode load */
|
/* 1st ucode load */
|
||||||
int (*load_ucode)(struct iwl_priv *priv);
|
int (*load_ucode)(struct iwl_priv *priv);
|
||||||
|
void (*dump_nic_event_log)(struct iwl_priv *priv);
|
||||||
|
void (*dump_nic_error_log)(struct iwl_priv *priv);
|
||||||
/* power management */
|
/* power management */
|
||||||
struct iwl_apm_ops apm_ops;
|
struct iwl_apm_ops apm_ops;
|
||||||
|
|
||||||
|
@ -540,7 +542,19 @@ int iwl_pci_resume(struct pci_dev *pdev);
|
||||||
/*****************************************************
|
/*****************************************************
|
||||||
* Error Handling Debugging
|
* Error Handling Debugging
|
||||||
******************************************************/
|
******************************************************/
|
||||||
|
#ifdef CONFIG_IWLWIFI_DEBUG
|
||||||
void iwl_dump_nic_event_log(struct iwl_priv *priv);
|
void iwl_dump_nic_event_log(struct iwl_priv *priv);
|
||||||
|
void iwl_dump_nic_error_log(struct iwl_priv *priv);
|
||||||
|
#else
|
||||||
|
static inline void iwl_dump_nic_event_log(struct iwl_priv *priv)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void iwl_dump_nic_error_log(struct iwl_priv *priv)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void iwl_clear_isr_stats(struct iwl_priv *priv);
|
void iwl_clear_isr_stats(struct iwl_priv *priv);
|
||||||
|
|
||||||
/*****************************************************
|
/*****************************************************
|
||||||
|
|
|
@ -410,7 +410,7 @@ static ssize_t iwl_dbgfs_nvm_read(struct file *file,
|
||||||
pos += scnprintf(buf + pos, buf_size - pos, "0x%.4x ", ofs);
|
pos += scnprintf(buf + pos, buf_size - pos, "0x%.4x ", ofs);
|
||||||
hex_dump_to_buffer(ptr + ofs, 16 , 16, 2, buf + pos,
|
hex_dump_to_buffer(ptr + ofs, 16 , 16, 2, buf + pos,
|
||||||
buf_size - pos, 0);
|
buf_size - pos, 0);
|
||||||
pos += strlen(buf);
|
pos += strlen(buf + pos);
|
||||||
if (buf_size - pos > 0)
|
if (buf_size - pos > 0)
|
||||||
buf[pos++] = '\n';
|
buf[pos++] = '\n';
|
||||||
}
|
}
|
||||||
|
@ -436,7 +436,7 @@ static ssize_t iwl_dbgfs_log_event_write(struct file *file,
|
||||||
if (sscanf(buf, "%d", &event_log_flag) != 1)
|
if (sscanf(buf, "%d", &event_log_flag) != 1)
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
if (event_log_flag == 1)
|
if (event_log_flag == 1)
|
||||||
iwl_dump_nic_event_log(priv);
|
priv->cfg->ops->lib->dump_nic_event_log(priv);
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
@ -909,7 +909,7 @@ static ssize_t iwl_dbgfs_traffic_log_read(struct file *file,
|
||||||
"0x%.4x ", ofs);
|
"0x%.4x ", ofs);
|
||||||
hex_dump_to_buffer(ptr + ofs, 16, 16, 2,
|
hex_dump_to_buffer(ptr + ofs, 16, 16, 2,
|
||||||
buf + pos, bufsz - pos, 0);
|
buf + pos, bufsz - pos, 0);
|
||||||
pos += strlen(buf);
|
pos += strlen(buf + pos);
|
||||||
if (bufsz - pos > 0)
|
if (bufsz - pos > 0)
|
||||||
buf[pos++] = '\n';
|
buf[pos++] = '\n';
|
||||||
}
|
}
|
||||||
|
@ -932,7 +932,7 @@ static ssize_t iwl_dbgfs_traffic_log_read(struct file *file,
|
||||||
"0x%.4x ", ofs);
|
"0x%.4x ", ofs);
|
||||||
hex_dump_to_buffer(ptr + ofs, 16, 16, 2,
|
hex_dump_to_buffer(ptr + ofs, 16, 16, 2,
|
||||||
buf + pos, bufsz - pos, 0);
|
buf + pos, bufsz - pos, 0);
|
||||||
pos += strlen(buf);
|
pos += strlen(buf + pos);
|
||||||
if (bufsz - pos > 0)
|
if (bufsz - pos > 0)
|
||||||
buf[pos++] = '\n';
|
buf[pos++] = '\n';
|
||||||
}
|
}
|
||||||
|
|
|
@ -197,6 +197,12 @@ void iwl_cmd_queue_free(struct iwl_priv *priv)
|
||||||
pci_free_consistent(dev, priv->hw_params.tfd_size *
|
pci_free_consistent(dev, priv->hw_params.tfd_size *
|
||||||
txq->q.n_bd, txq->tfds, txq->q.dma_addr);
|
txq->q.n_bd, txq->tfds, txq->q.dma_addr);
|
||||||
|
|
||||||
|
/* deallocate arrays */
|
||||||
|
kfree(txq->cmd);
|
||||||
|
kfree(txq->meta);
|
||||||
|
txq->cmd = NULL;
|
||||||
|
txq->meta = NULL;
|
||||||
|
|
||||||
/* 0-fill queue descriptor structure */
|
/* 0-fill queue descriptor structure */
|
||||||
memset(txq, 0, sizeof(*txq));
|
memset(txq, 0, sizeof(*txq));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1481,6 +1481,7 @@ static inline void iwl_synchronize_irq(struct iwl_priv *priv)
|
||||||
tasklet_kill(&priv->irq_tasklet);
|
tasklet_kill(&priv->irq_tasklet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_IWLWIFI_DEBUG
|
||||||
static const char *desc_lookup(int i)
|
static const char *desc_lookup(int i)
|
||||||
{
|
{
|
||||||
switch (i) {
|
switch (i) {
|
||||||
|
@ -1504,7 +1505,7 @@ static const char *desc_lookup(int i)
|
||||||
#define ERROR_START_OFFSET (1 * sizeof(u32))
|
#define ERROR_START_OFFSET (1 * sizeof(u32))
|
||||||
#define ERROR_ELEM_SIZE (7 * sizeof(u32))
|
#define ERROR_ELEM_SIZE (7 * sizeof(u32))
|
||||||
|
|
||||||
static void iwl3945_dump_nic_error_log(struct iwl_priv *priv)
|
void iwl3945_dump_nic_error_log(struct iwl_priv *priv)
|
||||||
{
|
{
|
||||||
u32 i;
|
u32 i;
|
||||||
u32 desc, time, count, base, data1;
|
u32 desc, time, count, base, data1;
|
||||||
|
@ -1598,7 +1599,7 @@ static void iwl3945_print_event_log(struct iwl_priv *priv, u32 start_idx,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void iwl3945_dump_nic_event_log(struct iwl_priv *priv)
|
void iwl3945_dump_nic_event_log(struct iwl_priv *priv)
|
||||||
{
|
{
|
||||||
u32 base; /* SRAM byte address of event log header */
|
u32 base; /* SRAM byte address of event log header */
|
||||||
u32 capacity; /* event log capacity in # entries */
|
u32 capacity; /* event log capacity in # entries */
|
||||||
|
@ -1640,6 +1641,16 @@ static void iwl3945_dump_nic_event_log(struct iwl_priv *priv)
|
||||||
iwl3945_print_event_log(priv, 0, next_entry, mode);
|
iwl3945_print_event_log(priv, 0, next_entry, mode);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
void iwl3945_dump_nic_event_log(struct iwl_priv *priv)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void iwl3945_dump_nic_error_log(struct iwl_priv *priv)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
static void iwl3945_irq_tasklet(struct iwl_priv *priv)
|
static void iwl3945_irq_tasklet(struct iwl_priv *priv)
|
||||||
{
|
{
|
||||||
|
@ -3683,21 +3694,6 @@ static ssize_t dump_error_log(struct device *d,
|
||||||
|
|
||||||
static DEVICE_ATTR(dump_errors, S_IWUSR, NULL, dump_error_log);
|
static DEVICE_ATTR(dump_errors, S_IWUSR, NULL, dump_error_log);
|
||||||
|
|
||||||
static ssize_t dump_event_log(struct device *d,
|
|
||||||
struct device_attribute *attr,
|
|
||||||
const char *buf, size_t count)
|
|
||||||
{
|
|
||||||
struct iwl_priv *priv = dev_get_drvdata(d);
|
|
||||||
char *p = (char *)buf;
|
|
||||||
|
|
||||||
if (p[0] == '1')
|
|
||||||
iwl3945_dump_nic_event_log(priv);
|
|
||||||
|
|
||||||
return strnlen(buf, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
static DEVICE_ATTR(dump_events, S_IWUSR, NULL, dump_event_log);
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
*
|
*
|
||||||
* driver setup and tear down
|
* driver setup and tear down
|
||||||
|
@ -3742,7 +3738,6 @@ static struct attribute *iwl3945_sysfs_entries[] = {
|
||||||
&dev_attr_antenna.attr,
|
&dev_attr_antenna.attr,
|
||||||
&dev_attr_channels.attr,
|
&dev_attr_channels.attr,
|
||||||
&dev_attr_dump_errors.attr,
|
&dev_attr_dump_errors.attr,
|
||||||
&dev_attr_dump_events.attr,
|
|
||||||
&dev_attr_flags.attr,
|
&dev_attr_flags.attr,
|
||||||
&dev_attr_filter_flags.attr,
|
&dev_attr_filter_flags.attr,
|
||||||
#ifdef CONFIG_IWL3945_SPECTRUM_MEASUREMENT
|
#ifdef CONFIG_IWL3945_SPECTRUM_MEASUREMENT
|
||||||
|
|
|
@ -1041,6 +1041,9 @@ static int sony_nc_resume(struct acpi_device *device)
|
||||||
sony_backlight_update_status(sony_backlight_device) < 0)
|
sony_backlight_update_status(sony_backlight_device) < 0)
|
||||||
printk(KERN_WARNING DRV_PFX "unable to restore brightness level\n");
|
printk(KERN_WARNING DRV_PFX "unable to restore brightness level\n");
|
||||||
|
|
||||||
|
/* re-read rfkill state */
|
||||||
|
sony_nc_rfkill_update();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1078,6 +1081,8 @@ static int sony_nc_setup_rfkill(struct acpi_device *device,
|
||||||
struct rfkill *rfk;
|
struct rfkill *rfk;
|
||||||
enum rfkill_type type;
|
enum rfkill_type type;
|
||||||
const char *name;
|
const char *name;
|
||||||
|
int result;
|
||||||
|
bool hwblock;
|
||||||
|
|
||||||
switch (nc_type) {
|
switch (nc_type) {
|
||||||
case SONY_WIFI:
|
case SONY_WIFI:
|
||||||
|
@ -1105,6 +1110,10 @@ static int sony_nc_setup_rfkill(struct acpi_device *device,
|
||||||
if (!rfk)
|
if (!rfk)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
sony_call_snc_handle(0x124, 0x200, &result);
|
||||||
|
hwblock = !(result & 0x1);
|
||||||
|
rfkill_set_hw_state(rfk, hwblock);
|
||||||
|
|
||||||
err = rfkill_register(rfk);
|
err = rfkill_register(rfk);
|
||||||
if (err) {
|
if (err) {
|
||||||
rfkill_destroy(rfk);
|
rfkill_destroy(rfk);
|
||||||
|
|
|
@ -44,7 +44,7 @@ struct ip_tunnel_prl {
|
||||||
__u16 flags;
|
__u16 flags;
|
||||||
__u16 __reserved;
|
__u16 __reserved;
|
||||||
__u32 datalen;
|
__u32 datalen;
|
||||||
__u32 rs_delay;
|
__u32 __reserved2;
|
||||||
/* data follows */
|
/* data follows */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -27,18 +27,11 @@ struct ip_tunnel
|
||||||
unsigned int prl_count; /* # of entries in PRL */
|
unsigned int prl_count; /* # of entries in PRL */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* ISATAP: default interval between RS in secondy */
|
|
||||||
#define IPTUNNEL_RS_DEFAULT_DELAY (900)
|
|
||||||
|
|
||||||
struct ip_tunnel_prl_entry
|
struct ip_tunnel_prl_entry
|
||||||
{
|
{
|
||||||
struct ip_tunnel_prl_entry *next;
|
struct ip_tunnel_prl_entry *next;
|
||||||
__be32 addr;
|
__be32 addr;
|
||||||
u16 flags;
|
u16 flags;
|
||||||
unsigned long rs_delay;
|
|
||||||
struct timer_list rs_timer;
|
|
||||||
struct ip_tunnel *tunnel;
|
|
||||||
spinlock_t lock;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define IPTUNNEL_XMIT() do { \
|
#define IPTUNNEL_XMIT() do { \
|
||||||
|
|
|
@ -14,6 +14,7 @@ extern int wext_handle_ioctl(struct net *net, struct ifreq *ifr, unsigned int cm
|
||||||
void __user *arg);
|
void __user *arg);
|
||||||
extern int compat_wext_handle_ioctl(struct net *net, unsigned int cmd,
|
extern int compat_wext_handle_ioctl(struct net *net, unsigned int cmd,
|
||||||
unsigned long arg);
|
unsigned long arg);
|
||||||
|
extern struct iw_statistics *get_wireless_stats(struct net_device *dev);
|
||||||
#else
|
#else
|
||||||
static inline int wext_proc_init(struct net *net)
|
static inline int wext_proc_init(struct net *net)
|
||||||
{
|
{
|
||||||
|
|
|
@ -169,6 +169,7 @@ static size_t vlan_get_size(const struct net_device *dev)
|
||||||
struct vlan_dev_info *vlan = vlan_dev_info(dev);
|
struct vlan_dev_info *vlan = vlan_dev_info(dev);
|
||||||
|
|
||||||
return nla_total_size(2) + /* IFLA_VLAN_ID */
|
return nla_total_size(2) + /* IFLA_VLAN_ID */
|
||||||
|
sizeof(struct ifla_vlan_flags) + /* IFLA_VLAN_FLAGS */
|
||||||
vlan_qos_map_size(vlan->nr_ingress_mappings) +
|
vlan_qos_map_size(vlan->nr_ingress_mappings) +
|
||||||
vlan_qos_map_size(vlan->nr_egress_mappings);
|
vlan_qos_map_size(vlan->nr_egress_mappings);
|
||||||
}
|
}
|
||||||
|
|
|
@ -641,15 +641,10 @@ static int ax25_setsockopt(struct socket *sock, int level, int optname,
|
||||||
|
|
||||||
case SO_BINDTODEVICE:
|
case SO_BINDTODEVICE:
|
||||||
if (optlen > IFNAMSIZ)
|
if (optlen > IFNAMSIZ)
|
||||||
optlen=IFNAMSIZ;
|
optlen = IFNAMSIZ;
|
||||||
if (copy_from_user(devname, optval, optlen)) {
|
|
||||||
res = -EFAULT;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
dev = dev_get_by_name(&init_net, devname);
|
if (copy_from_user(devname, optval, optlen)) {
|
||||||
if (dev == NULL) {
|
res = -EFAULT;
|
||||||
res = -ENODEV;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -657,12 +652,18 @@ static int ax25_setsockopt(struct socket *sock, int level, int optname,
|
||||||
(sock->state != SS_UNCONNECTED ||
|
(sock->state != SS_UNCONNECTED ||
|
||||||
sk->sk_state == TCP_LISTEN)) {
|
sk->sk_state == TCP_LISTEN)) {
|
||||||
res = -EADDRNOTAVAIL;
|
res = -EADDRNOTAVAIL;
|
||||||
dev_put(dev);
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
dev = dev_get_by_name(&init_net, devname);
|
||||||
|
if (!dev) {
|
||||||
|
res = -ENODEV;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ax25->ax25_dev = ax25_dev_ax25dev(dev);
|
ax25->ax25_dev = ax25_dev_ax25dev(dev);
|
||||||
ax25_fillin_cb(ax25, ax25->ax25_dev);
|
ax25_fillin_cb(ax25, ax25->ax25_dev);
|
||||||
|
dev_put(dev);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -432,6 +432,7 @@ int br_add_if(struct net_bridge *br, struct net_device *dev)
|
||||||
br_fdb_delete_by_port(br, p, 1);
|
br_fdb_delete_by_port(br, p, 1);
|
||||||
err1:
|
err1:
|
||||||
kobject_put(&p->kobj);
|
kobject_put(&p->kobj);
|
||||||
|
p = NULL; /* kobject_put frees */
|
||||||
err0:
|
err0:
|
||||||
dev_set_promiscuity(dev, -1);
|
dev_set_promiscuity(dev, -1);
|
||||||
put_back:
|
put_back:
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
#include <net/sock.h>
|
#include <net/sock.h>
|
||||||
#include <linux/rtnetlink.h>
|
#include <linux/rtnetlink.h>
|
||||||
#include <linux/wireless.h>
|
#include <linux/wireless.h>
|
||||||
#include <net/iw_handler.h>
|
#include <net/wext.h>
|
||||||
|
|
||||||
#include "net-sysfs.h"
|
#include "net-sysfs.h"
|
||||||
|
|
||||||
|
@ -363,15 +363,13 @@ static ssize_t wireless_show(struct device *d, char *buf,
|
||||||
char *))
|
char *))
|
||||||
{
|
{
|
||||||
struct net_device *dev = to_net_dev(d);
|
struct net_device *dev = to_net_dev(d);
|
||||||
const struct iw_statistics *iw = NULL;
|
const struct iw_statistics *iw;
|
||||||
ssize_t ret = -EINVAL;
|
ssize_t ret = -EINVAL;
|
||||||
|
|
||||||
read_lock(&dev_base_lock);
|
read_lock(&dev_base_lock);
|
||||||
if (dev_isalive(dev)) {
|
if (dev_isalive(dev)) {
|
||||||
if (dev->wireless_handlers &&
|
iw = get_wireless_stats(dev);
|
||||||
dev->wireless_handlers->get_wireless_stats)
|
if (iw)
|
||||||
iw = dev->wireless_handlers->get_wireless_stats(dev);
|
|
||||||
if (iw != NULL)
|
|
||||||
ret = (*format)(iw, buf);
|
ret = (*format)(iw, buf);
|
||||||
}
|
}
|
||||||
read_unlock(&dev_base_lock);
|
read_unlock(&dev_base_lock);
|
||||||
|
@ -505,7 +503,7 @@ int netdev_register_kobject(struct net_device *net)
|
||||||
*groups++ = &netstat_group;
|
*groups++ = &netstat_group;
|
||||||
|
|
||||||
#ifdef CONFIG_WIRELESS_EXT_SYSFS
|
#ifdef CONFIG_WIRELESS_EXT_SYSFS
|
||||||
if (net->wireless_handlers && net->wireless_handlers->get_wireless_stats)
|
if (net->wireless_handlers || net->ieee80211_ptr)
|
||||||
*groups++ = &wireless_group;
|
*groups++ = &wireless_group;
|
||||||
#endif
|
#endif
|
||||||
#endif /* CONFIG_SYSFS */
|
#endif /* CONFIG_SYSFS */
|
||||||
|
|
|
@ -194,7 +194,7 @@ static int dcbnl_reply(u8 value, u8 event, u8 cmd, u8 attr, u32 pid,
|
||||||
nlmsg_end(dcbnl_skb, nlh);
|
nlmsg_end(dcbnl_skb, nlh);
|
||||||
ret = rtnl_unicast(dcbnl_skb, &init_net, pid);
|
ret = rtnl_unicast(dcbnl_skb, &init_net, pid);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err;
|
return -EINVAL;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
nlmsg_failure:
|
nlmsg_failure:
|
||||||
|
@ -275,7 +275,7 @@ static int dcbnl_getpfccfg(struct net_device *netdev, struct nlattr **tb,
|
||||||
|
|
||||||
ret = rtnl_unicast(dcbnl_skb, &init_net, pid);
|
ret = rtnl_unicast(dcbnl_skb, &init_net, pid);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err;
|
goto err_out;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
nlmsg_failure:
|
nlmsg_failure:
|
||||||
|
@ -316,12 +316,11 @@ static int dcbnl_getperm_hwaddr(struct net_device *netdev, struct nlattr **tb,
|
||||||
|
|
||||||
ret = rtnl_unicast(dcbnl_skb, &init_net, pid);
|
ret = rtnl_unicast(dcbnl_skb, &init_net, pid);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err;
|
goto err_out;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
nlmsg_failure:
|
nlmsg_failure:
|
||||||
err:
|
|
||||||
kfree_skb(dcbnl_skb);
|
kfree_skb(dcbnl_skb);
|
||||||
err_out:
|
err_out:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -383,7 +382,7 @@ static int dcbnl_getcap(struct net_device *netdev, struct nlattr **tb,
|
||||||
|
|
||||||
ret = rtnl_unicast(dcbnl_skb, &init_net, pid);
|
ret = rtnl_unicast(dcbnl_skb, &init_net, pid);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err;
|
goto err_out;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
nlmsg_failure:
|
nlmsg_failure:
|
||||||
|
@ -460,7 +459,7 @@ static int dcbnl_getnumtcs(struct net_device *netdev, struct nlattr **tb,
|
||||||
ret = rtnl_unicast(dcbnl_skb, &init_net, pid);
|
ret = rtnl_unicast(dcbnl_skb, &init_net, pid);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto err;
|
goto err_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -799,7 +798,7 @@ static int __dcbnl_pg_getcfg(struct net_device *netdev, struct nlattr **tb,
|
||||||
|
|
||||||
ret = rtnl_unicast(dcbnl_skb, &init_net, pid);
|
ret = rtnl_unicast(dcbnl_skb, &init_net, pid);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err;
|
goto err_out;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -1063,7 +1062,7 @@ static int dcbnl_bcn_getcfg(struct net_device *netdev, struct nlattr **tb,
|
||||||
|
|
||||||
ret = rtnl_unicast(dcbnl_skb, &init_net, pid);
|
ret = rtnl_unicast(dcbnl_skb, &init_net, pid);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err;
|
goto err_out;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
|
@ -658,7 +658,6 @@ void ndisc_send_rs(struct net_device *dev, const struct in6_addr *saddr,
|
||||||
&icmp6h, NULL,
|
&icmp6h, NULL,
|
||||||
send_sllao ? ND_OPT_SOURCE_LL_ADDR : 0);
|
send_sllao ? ND_OPT_SOURCE_LL_ADDR : 0);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ndisc_send_rs);
|
|
||||||
|
|
||||||
|
|
||||||
static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb)
|
static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb)
|
||||||
|
|
|
@ -15,7 +15,6 @@
|
||||||
* Roger Venning <r.venning@telstra.com>: 6to4 support
|
* Roger Venning <r.venning@telstra.com>: 6to4 support
|
||||||
* Nate Thompson <nate@thebog.net>: 6to4 support
|
* Nate Thompson <nate@thebog.net>: 6to4 support
|
||||||
* Fred Templin <fred.l.templin@boeing.com>: isatap support
|
* Fred Templin <fred.l.templin@boeing.com>: isatap support
|
||||||
* Sascha Hlusiak <mail@saschahlusiak.de>: stateless autoconf for isatap
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
@ -223,44 +222,6 @@ static struct ip_tunnel * ipip6_tunnel_locate(struct net *net,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ipip6_tunnel_rs_timer(unsigned long data)
|
|
||||||
{
|
|
||||||
struct ip_tunnel_prl_entry *p = (struct ip_tunnel_prl_entry *) data;
|
|
||||||
struct inet6_dev *ifp;
|
|
||||||
struct inet6_ifaddr *addr;
|
|
||||||
|
|
||||||
spin_lock(&p->lock);
|
|
||||||
ifp = __in6_dev_get(p->tunnel->dev);
|
|
||||||
|
|
||||||
read_lock_bh(&ifp->lock);
|
|
||||||
for (addr = ifp->addr_list; addr; addr = addr->if_next) {
|
|
||||||
struct in6_addr rtr;
|
|
||||||
|
|
||||||
if (!(ipv6_addr_type(&addr->addr) & IPV6_ADDR_LINKLOCAL))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* Send RS to guessed linklocal address of router
|
|
||||||
*
|
|
||||||
* Better: send to ff02::2 encapsuled in unicast directly
|
|
||||||
* to router-v4 instead of guessing the v6 address.
|
|
||||||
*
|
|
||||||
* Cisco/Windows seem to not set the u/l bit correctly,
|
|
||||||
* so we won't guess right.
|
|
||||||
*/
|
|
||||||
ipv6_addr_set(&rtr, htonl(0xFE800000), 0, 0, 0);
|
|
||||||
if (!__ipv6_isatap_ifid(rtr.s6_addr + 8,
|
|
||||||
p->addr)) {
|
|
||||||
ndisc_send_rs(p->tunnel->dev, &addr->addr, &rtr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
read_unlock_bh(&ifp->lock);
|
|
||||||
|
|
||||||
mod_timer(&p->rs_timer, jiffies + HZ * p->rs_delay);
|
|
||||||
spin_unlock(&p->lock);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct ip_tunnel_prl_entry *
|
static struct ip_tunnel_prl_entry *
|
||||||
__ipip6_tunnel_locate_prl(struct ip_tunnel *t, __be32 addr)
|
__ipip6_tunnel_locate_prl(struct ip_tunnel *t, __be32 addr)
|
||||||
{
|
{
|
||||||
|
@ -319,7 +280,6 @@ static int ipip6_tunnel_get_prl(struct ip_tunnel *t,
|
||||||
continue;
|
continue;
|
||||||
kp[c].addr = prl->addr;
|
kp[c].addr = prl->addr;
|
||||||
kp[c].flags = prl->flags;
|
kp[c].flags = prl->flags;
|
||||||
kp[c].rs_delay = prl->rs_delay;
|
|
||||||
c++;
|
c++;
|
||||||
if (kprl.addr != htonl(INADDR_ANY))
|
if (kprl.addr != htonl(INADDR_ANY))
|
||||||
break;
|
break;
|
||||||
|
@ -369,23 +329,11 @@ ipip6_tunnel_add_prl(struct ip_tunnel *t, struct ip_tunnel_prl *a, int chg)
|
||||||
}
|
}
|
||||||
|
|
||||||
p->next = t->prl;
|
p->next = t->prl;
|
||||||
p->tunnel = t;
|
|
||||||
t->prl = p;
|
t->prl = p;
|
||||||
t->prl_count++;
|
t->prl_count++;
|
||||||
|
|
||||||
spin_lock_init(&p->lock);
|
|
||||||
setup_timer(&p->rs_timer, ipip6_tunnel_rs_timer, (unsigned long) p);
|
|
||||||
update:
|
update:
|
||||||
p->addr = a->addr;
|
p->addr = a->addr;
|
||||||
p->flags = a->flags;
|
p->flags = a->flags;
|
||||||
p->rs_delay = a->rs_delay;
|
|
||||||
if (p->rs_delay == 0)
|
|
||||||
p->rs_delay = IPTUNNEL_RS_DEFAULT_DELAY;
|
|
||||||
spin_lock(&p->lock);
|
|
||||||
del_timer(&p->rs_timer);
|
|
||||||
if (p->flags & PRL_DEFAULT)
|
|
||||||
mod_timer(&p->rs_timer, jiffies + 1);
|
|
||||||
spin_unlock(&p->lock);
|
|
||||||
out:
|
out:
|
||||||
write_unlock(&ipip6_lock);
|
write_unlock(&ipip6_lock);
|
||||||
return err;
|
return err;
|
||||||
|
@ -404,9 +352,6 @@ ipip6_tunnel_del_prl(struct ip_tunnel *t, struct ip_tunnel_prl *a)
|
||||||
if ((*p)->addr == a->addr) {
|
if ((*p)->addr == a->addr) {
|
||||||
x = *p;
|
x = *p;
|
||||||
*p = x->next;
|
*p = x->next;
|
||||||
spin_lock(&x->lock);
|
|
||||||
del_timer(&x->rs_timer);
|
|
||||||
spin_unlock(&x->lock);
|
|
||||||
kfree(x);
|
kfree(x);
|
||||||
t->prl_count--;
|
t->prl_count--;
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -417,9 +362,6 @@ ipip6_tunnel_del_prl(struct ip_tunnel *t, struct ip_tunnel_prl *a)
|
||||||
while (t->prl) {
|
while (t->prl) {
|
||||||
x = t->prl;
|
x = t->prl;
|
||||||
t->prl = t->prl->next;
|
t->prl = t->prl->next;
|
||||||
spin_lock(&x->lock);
|
|
||||||
del_timer(&x->rs_timer);
|
|
||||||
spin_unlock(&x->lock);
|
|
||||||
kfree(x);
|
kfree(x);
|
||||||
t->prl_count--;
|
t->prl_count--;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1388,8 +1388,8 @@ ieee80211_rx_mgmt_disassoc(struct ieee80211_sub_if_data *sdata,
|
||||||
|
|
||||||
reason_code = le16_to_cpu(mgmt->u.disassoc.reason_code);
|
reason_code = le16_to_cpu(mgmt->u.disassoc.reason_code);
|
||||||
|
|
||||||
printk(KERN_DEBUG "%s: disassociated (Reason: %u)\n",
|
printk(KERN_DEBUG "%s: disassociated from %pM (Reason: %u)\n",
|
||||||
sdata->dev->name, reason_code);
|
sdata->dev->name, mgmt->sa, reason_code);
|
||||||
|
|
||||||
ieee80211_set_disassoc(sdata, false);
|
ieee80211_set_disassoc(sdata, false);
|
||||||
return RX_MGMT_CFG80211_DISASSOC;
|
return RX_MGMT_CFG80211_DISASSOC;
|
||||||
|
@ -1675,7 +1675,7 @@ static void ieee80211_rx_mgmt_probe_resp(struct ieee80211_sub_if_data *sdata,
|
||||||
|
|
||||||
/* direct probe may be part of the association flow */
|
/* direct probe may be part of the association flow */
|
||||||
if (wk && wk->state == IEEE80211_MGD_STATE_PROBE) {
|
if (wk && wk->state == IEEE80211_MGD_STATE_PROBE) {
|
||||||
printk(KERN_DEBUG "%s direct probe responded\n",
|
printk(KERN_DEBUG "%s: direct probe responded\n",
|
||||||
sdata->dev->name);
|
sdata->dev->name);
|
||||||
wk->tries = 0;
|
wk->tries = 0;
|
||||||
wk->state = IEEE80211_MGD_STATE_AUTH;
|
wk->state = IEEE80211_MGD_STATE_AUTH;
|
||||||
|
@ -2502,9 +2502,6 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
|
||||||
struct ieee80211_mgd_work *wk;
|
struct ieee80211_mgd_work *wk;
|
||||||
const u8 *bssid = NULL;
|
const u8 *bssid = NULL;
|
||||||
|
|
||||||
printk(KERN_DEBUG "%s: deauthenticating by local choice (reason=%d)\n",
|
|
||||||
sdata->dev->name, req->reason_code);
|
|
||||||
|
|
||||||
mutex_lock(&ifmgd->mtx);
|
mutex_lock(&ifmgd->mtx);
|
||||||
|
|
||||||
if (ifmgd->associated && &ifmgd->associated->cbss == req->bss) {
|
if (ifmgd->associated && &ifmgd->associated->cbss == req->bss) {
|
||||||
|
@ -2532,6 +2529,9 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
|
||||||
|
|
||||||
mutex_unlock(&ifmgd->mtx);
|
mutex_unlock(&ifmgd->mtx);
|
||||||
|
|
||||||
|
printk(KERN_DEBUG "%s: deauthenticating from %pM by local choice (reason=%d)\n",
|
||||||
|
sdata->dev->name, bssid, req->reason_code);
|
||||||
|
|
||||||
ieee80211_send_deauth_disassoc(sdata, bssid,
|
ieee80211_send_deauth_disassoc(sdata, bssid,
|
||||||
IEEE80211_STYPE_DEAUTH, req->reason_code,
|
IEEE80211_STYPE_DEAUTH, req->reason_code,
|
||||||
cookie);
|
cookie);
|
||||||
|
@ -2545,9 +2545,6 @@ int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata,
|
||||||
{
|
{
|
||||||
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
|
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
|
||||||
|
|
||||||
printk(KERN_DEBUG "%s: disassociating by local choice (reason=%d)\n",
|
|
||||||
sdata->dev->name, req->reason_code);
|
|
||||||
|
|
||||||
mutex_lock(&ifmgd->mtx);
|
mutex_lock(&ifmgd->mtx);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2561,6 +2558,9 @@ int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata,
|
||||||
return -ENOLINK;
|
return -ENOLINK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
printk(KERN_DEBUG "%s: disassociating from %pM by local choice (reason=%d)\n",
|
||||||
|
sdata->dev->name, req->bss->bssid, req->reason_code);
|
||||||
|
|
||||||
ieee80211_set_disassoc(sdata, false);
|
ieee80211_set_disassoc(sdata, false);
|
||||||
|
|
||||||
mutex_unlock(&ifmgd->mtx);
|
mutex_unlock(&ifmgd->mtx);
|
||||||
|
|
|
@ -1788,7 +1788,7 @@ void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err)
|
||||||
}
|
}
|
||||||
|
|
||||||
rep = __nlmsg_put(skb, NETLINK_CB(in_skb).pid, nlh->nlmsg_seq,
|
rep = __nlmsg_put(skb, NETLINK_CB(in_skb).pid, nlh->nlmsg_seq,
|
||||||
NLMSG_ERROR, sizeof(struct nlmsgerr), 0);
|
NLMSG_ERROR, payload, 0);
|
||||||
errmsg = nlmsg_data(rep);
|
errmsg = nlmsg_data(rep);
|
||||||
errmsg->error = err;
|
errmsg->error = err;
|
||||||
memcpy(&errmsg->msg, nlh, err ? nlh->nlmsg_len : sizeof(*nlh));
|
memcpy(&errmsg->msg, nlh, err ? nlh->nlmsg_len : sizeof(*nlh));
|
||||||
|
|
|
@ -2098,12 +2098,17 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long __user *, args)
|
||||||
unsigned long a[6];
|
unsigned long a[6];
|
||||||
unsigned long a0, a1;
|
unsigned long a0, a1;
|
||||||
int err;
|
int err;
|
||||||
|
unsigned int len;
|
||||||
|
|
||||||
if (call < 1 || call > SYS_ACCEPT4)
|
if (call < 1 || call > SYS_ACCEPT4)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
len = nargs[call];
|
||||||
|
if (len > sizeof(a))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
/* copy_from_user should be SMP safe. */
|
/* copy_from_user should be SMP safe. */
|
||||||
if (copy_from_user(a, args, nargs[call]))
|
if (copy_from_user(a, args, len))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
audit_socketcall(nargs[call] / sizeof(unsigned long), a);
|
audit_socketcall(nargs[call] / sizeof(unsigned long), a);
|
||||||
|
|
|
@ -762,9 +762,8 @@ int __cfg80211_connect(struct cfg80211_registered_device *rdev,
|
||||||
wdev->conn->params.ssid = wdev->ssid;
|
wdev->conn->params.ssid = wdev->ssid;
|
||||||
wdev->conn->params.ssid_len = connect->ssid_len;
|
wdev->conn->params.ssid_len = connect->ssid_len;
|
||||||
|
|
||||||
/* don't care about result -- but fill bssid & channel */
|
/* see if we have the bss already */
|
||||||
if (!wdev->conn->params.bssid || !wdev->conn->params.channel)
|
bss = cfg80211_get_conn_bss(wdev);
|
||||||
bss = cfg80211_get_conn_bss(wdev);
|
|
||||||
|
|
||||||
wdev->sme_state = CFG80211_SME_CONNECTING;
|
wdev->sme_state = CFG80211_SME_CONNECTING;
|
||||||
wdev->connect_keys = connkeys;
|
wdev->connect_keys = connkeys;
|
||||||
|
|
|
@ -30,7 +30,8 @@ int cfg80211_mgd_wext_connect(struct cfg80211_registered_device *rdev,
|
||||||
if (wdev->wext.keys) {
|
if (wdev->wext.keys) {
|
||||||
wdev->wext.keys->def = wdev->wext.default_key;
|
wdev->wext.keys->def = wdev->wext.default_key;
|
||||||
wdev->wext.keys->defmgmt = wdev->wext.default_mgmt_key;
|
wdev->wext.keys->defmgmt = wdev->wext.default_mgmt_key;
|
||||||
wdev->wext.connect.privacy = true;
|
if (wdev->wext.default_key != -1)
|
||||||
|
wdev->wext.connect.privacy = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!wdev->wext.connect.ssid_len)
|
if (!wdev->wext.connect.ssid_len)
|
||||||
|
@ -229,8 +230,7 @@ int cfg80211_mgd_wext_giwessid(struct net_device *dev,
|
||||||
data->flags = 1;
|
data->flags = 1;
|
||||||
data->length = wdev->wext.connect.ssid_len;
|
data->length = wdev->wext.connect.ssid_len;
|
||||||
memcpy(ssid, wdev->wext.connect.ssid, data->length);
|
memcpy(ssid, wdev->wext.connect.ssid, data->length);
|
||||||
} else
|
}
|
||||||
data->flags = 0;
|
|
||||||
wdev_unlock(wdev);
|
wdev_unlock(wdev);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -306,8 +306,6 @@ int cfg80211_mgd_wext_giwap(struct net_device *dev,
|
||||||
wdev_lock(wdev);
|
wdev_lock(wdev);
|
||||||
if (wdev->current_bss)
|
if (wdev->current_bss)
|
||||||
memcpy(ap_addr->sa_data, wdev->current_bss->pub.bssid, ETH_ALEN);
|
memcpy(ap_addr->sa_data, wdev->current_bss->pub.bssid, ETH_ALEN);
|
||||||
else if (wdev->wext.connect.bssid)
|
|
||||||
memcpy(ap_addr->sa_data, wdev->wext.connect.bssid, ETH_ALEN);
|
|
||||||
else
|
else
|
||||||
memset(ap_addr->sa_data, 0, ETH_ALEN);
|
memset(ap_addr->sa_data, 0, ETH_ALEN);
|
||||||
wdev_unlock(wdev);
|
wdev_unlock(wdev);
|
||||||
|
|
|
@ -470,7 +470,7 @@ static iw_handler get_handler(struct net_device *dev, unsigned int cmd)
|
||||||
/*
|
/*
|
||||||
* Get statistics out of the driver
|
* Get statistics out of the driver
|
||||||
*/
|
*/
|
||||||
static struct iw_statistics *get_wireless_stats(struct net_device *dev)
|
struct iw_statistics *get_wireless_stats(struct net_device *dev)
|
||||||
{
|
{
|
||||||
/* New location */
|
/* New location */
|
||||||
if ((dev->wireless_handlers != NULL) &&
|
if ((dev->wireless_handlers != NULL) &&
|
||||||
|
@ -773,10 +773,13 @@ static int ioctl_standard_iw_point(struct iw_point *iwp, unsigned int cmd,
|
||||||
essid_compat = 1;
|
essid_compat = 1;
|
||||||
else if (IW_IS_SET(cmd) && (iwp->length != 0)) {
|
else if (IW_IS_SET(cmd) && (iwp->length != 0)) {
|
||||||
char essid[IW_ESSID_MAX_SIZE + 1];
|
char essid[IW_ESSID_MAX_SIZE + 1];
|
||||||
|
unsigned int len;
|
||||||
|
len = iwp->length * descr->token_size;
|
||||||
|
|
||||||
err = copy_from_user(essid, iwp->pointer,
|
if (len > IW_ESSID_MAX_SIZE)
|
||||||
iwp->length *
|
return -EFAULT;
|
||||||
descr->token_size);
|
|
||||||
|
err = copy_from_user(essid, iwp->pointer, len);
|
||||||
if (err)
|
if (err)
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue