mirror of
https://github.com/torvalds/linux.git
synced 2024-12-26 12:52:30 +00:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (54 commits) ipv6: check for IPv4 mapped addresses when connecting IPv6 sockets mlx4: decreasing ref count when removing mac net: Fix security_socket_sendmsg() bypass problem. net: Cap number of elements for sendmmsg net: sendmmsg should only return an error if no messages were sent ixgbe: fix PHY link setup for 82599 ixgbe: fix __ixgbe_notify_dca() bail out code igb: fix WOL on second port of i350 device e1000e: minor re-order of #include files e1000e: remove unnecessary check for NULL pointer intel drivers: repair missing flush operations macb: restore wrap bit when performing underrun cleanup cdc_ncm: fix endianness problem. irda: use PCI_VENDOR_ID_* mlx4: Fixing Ethernet unicast packet steering net: fix NULL dereferences in check_peer_redir() bnx2x: Clear MDIO access warning during first driver load bnx2x: Fix BCM578xx MAC test bnx2x: Fix BCM54618se invalid link indication bnx2x: Fix BCM84833 link ...
This commit is contained in:
commit
07d952dc66
@ -599,7 +599,7 @@ num_unsol_na
|
||||
affect only the active-backup mode. These options were added for
|
||||
bonding versions 3.3.0 and 3.4.0 respectively.
|
||||
|
||||
From Linux 2.6.40 and bonding version 3.7.1, these notifications
|
||||
From Linux 3.0 and bonding version 3.7.1, these notifications
|
||||
are generated by the ipv4 and ipv6 code and the numbers of
|
||||
repetitions cannot be set independently.
|
||||
|
||||
|
10
MAINTAINERS
10
MAINTAINERS
@ -2643,9 +2643,8 @@ S: Maintained
|
||||
F: arch/x86/math-emu/
|
||||
|
||||
FRAME RELAY DLCI/FRAD (Sangoma drivers too)
|
||||
M: Mike McLagan <mike.mclagan@linux.org>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
S: Orphan
|
||||
F: drivers/net/wan/dlci.c
|
||||
F: drivers/net/wan/sdla.c
|
||||
|
||||
@ -4415,10 +4414,10 @@ F: net/*/netfilter/
|
||||
F: net/netfilter/
|
||||
|
||||
NETLABEL
|
||||
M: Paul Moore <paul.moore@hp.com>
|
||||
M: Paul Moore <paul@paul-moore.com>
|
||||
W: http://netlabel.sf.net
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
S: Maintained
|
||||
F: Documentation/netlabel/
|
||||
F: include/net/netlabel.h
|
||||
F: net/netlabel/
|
||||
@ -4463,7 +4462,6 @@ F: include/linux/netdevice.h
|
||||
NETWORKING [IPv4/IPv6]
|
||||
M: "David S. Miller" <davem@davemloft.net>
|
||||
M: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
|
||||
M: "Pekka Savola (ipv6)" <pekkas@netcore.fi>
|
||||
M: James Morris <jmorris@namei.org>
|
||||
M: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>
|
||||
M: Patrick McHardy <kaber@trash.net>
|
||||
@ -4476,7 +4474,7 @@ F: include/net/ip*
|
||||
F: arch/x86/net/*
|
||||
|
||||
NETWORKING [LABELED] (NetLabel, CIPSO, Labeled IPsec, SECMARK)
|
||||
M: Paul Moore <paul.moore@hp.com>
|
||||
M: Paul Moore <paul@paul-moore.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
|
@ -57,6 +57,7 @@ void proc_fork_connector(struct task_struct *task)
|
||||
struct proc_event *ev;
|
||||
__u8 buffer[CN_PROC_MSG_SIZE];
|
||||
struct timespec ts;
|
||||
struct task_struct *parent;
|
||||
|
||||
if (atomic_read(&proc_event_num_listeners) < 1)
|
||||
return;
|
||||
@ -67,8 +68,11 @@ void proc_fork_connector(struct task_struct *task)
|
||||
ktime_get_ts(&ts); /* get high res monotonic timestamp */
|
||||
put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns);
|
||||
ev->what = PROC_EVENT_FORK;
|
||||
ev->event_data.fork.parent_pid = task->real_parent->pid;
|
||||
ev->event_data.fork.parent_tgid = task->real_parent->tgid;
|
||||
rcu_read_lock();
|
||||
parent = rcu_dereference(task->real_parent);
|
||||
ev->event_data.fork.parent_pid = parent->pid;
|
||||
ev->event_data.fork.parent_tgid = parent->tgid;
|
||||
rcu_read_unlock();
|
||||
ev->event_data.fork.child_pid = task->pid;
|
||||
ev->event_data.fork.child_tgid = task->tgid;
|
||||
|
||||
|
@ -1989,14 +1989,20 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* It's important to set the bp->state to the value different from
|
||||
* BNX2X_STATE_OPEN and only then stop the Tx. Otherwise bnx2x_tx_int()
|
||||
* may restart the Tx from the NAPI context (see bnx2x_tx_int()).
|
||||
*/
|
||||
bp->state = BNX2X_STATE_CLOSING_WAIT4_HALT;
|
||||
smp_mb();
|
||||
|
||||
/* Stop Tx */
|
||||
bnx2x_tx_disable(bp);
|
||||
|
||||
#ifdef BCM_CNIC
|
||||
bnx2x_cnic_notify(bp, CNIC_CTL_STOP_CMD);
|
||||
#endif
|
||||
bp->state = BNX2X_STATE_CLOSING_WAIT4_HALT;
|
||||
smp_mb();
|
||||
|
||||
bp->rx_mode = BNX2X_RX_MODE_NONE;
|
||||
|
||||
|
@ -1204,6 +1204,8 @@ struct drv_port_mb {
|
||||
|
||||
#define LINK_STATUS_PFC_ENABLED 0x20000000
|
||||
|
||||
#define LINK_STATUS_PHYSICAL_LINK_FLAG 0x40000000
|
||||
|
||||
u32 port_stx;
|
||||
|
||||
u32 stat_nig_timer;
|
||||
|
@ -1546,6 +1546,12 @@ static void bnx2x_umac_enable(struct link_params *params,
|
||||
vars->line_speed);
|
||||
break;
|
||||
}
|
||||
if (!(vars->flow_ctrl & BNX2X_FLOW_CTRL_TX))
|
||||
val |= UMAC_COMMAND_CONFIG_REG_IGNORE_TX_PAUSE;
|
||||
|
||||
if (!(vars->flow_ctrl & BNX2X_FLOW_CTRL_RX))
|
||||
val |= UMAC_COMMAND_CONFIG_REG_PAUSE_IGNORE;
|
||||
|
||||
REG_WR(bp, umac_base + UMAC_REG_COMMAND_CONFIG, val);
|
||||
udelay(50);
|
||||
|
||||
@ -1661,10 +1667,20 @@ static void bnx2x_xmac_disable(struct link_params *params)
|
||||
{
|
||||
u8 port = params->port;
|
||||
struct bnx2x *bp = params->bp;
|
||||
u32 xmac_base = (port) ? GRCBASE_XMAC1 : GRCBASE_XMAC0;
|
||||
u32 pfc_ctrl, xmac_base = (port) ? GRCBASE_XMAC1 : GRCBASE_XMAC0;
|
||||
|
||||
if (REG_RD(bp, MISC_REG_RESET_REG_2) &
|
||||
MISC_REGISTERS_RESET_REG_2_XMAC) {
|
||||
/*
|
||||
* Send an indication to change the state in the NIG back to XON
|
||||
* Clearing this bit enables the next set of this bit to get
|
||||
* rising edge
|
||||
*/
|
||||
pfc_ctrl = REG_RD(bp, xmac_base + XMAC_REG_PFC_CTRL_HI);
|
||||
REG_WR(bp, xmac_base + XMAC_REG_PFC_CTRL_HI,
|
||||
(pfc_ctrl & ~(1<<1)));
|
||||
REG_WR(bp, xmac_base + XMAC_REG_PFC_CTRL_HI,
|
||||
(pfc_ctrl | (1<<1)));
|
||||
DP(NETIF_MSG_LINK, "Disable XMAC on port %x\n", port);
|
||||
REG_WR(bp, xmac_base + XMAC_REG_CTRL, 0);
|
||||
usleep_range(1000, 1000);
|
||||
@ -1729,6 +1745,10 @@ static int bnx2x_emac_enable(struct link_params *params,
|
||||
|
||||
DP(NETIF_MSG_LINK, "enabling EMAC\n");
|
||||
|
||||
/* Disable BMAC */
|
||||
REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_CLEAR,
|
||||
(MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << port));
|
||||
|
||||
/* enable emac and not bmac */
|
||||
REG_WR(bp, NIG_REG_EGRESS_EMAC0_PORT + port*4, 1);
|
||||
|
||||
@ -2583,12 +2603,6 @@ static int bnx2x_bmac1_enable(struct link_params *params,
|
||||
REG_WR_DMAE(bp, bmac_addr + BIGMAC_REGISTER_RX_LLFC_MSG_FLDS,
|
||||
wb_data, 2);
|
||||
|
||||
if (vars->phy_flags & PHY_TX_ERROR_CHECK_FLAG) {
|
||||
REG_RD_DMAE(bp, bmac_addr + BIGMAC_REGISTER_RX_LSS_STATUS,
|
||||
wb_data, 2);
|
||||
if (wb_data[0] > 0)
|
||||
return -ESRCH;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -2654,16 +2668,6 @@ static int bnx2x_bmac2_enable(struct link_params *params,
|
||||
udelay(30);
|
||||
bnx2x_update_pfc_bmac2(params, vars, is_lb);
|
||||
|
||||
if (vars->phy_flags & PHY_TX_ERROR_CHECK_FLAG) {
|
||||
REG_RD_DMAE(bp, bmac_addr + BIGMAC2_REGISTER_RX_LSS_STAT,
|
||||
wb_data, 2);
|
||||
if (wb_data[0] > 0) {
|
||||
DP(NETIF_MSG_LINK, "Got bad LSS status 0x%x\n",
|
||||
wb_data[0]);
|
||||
return -ESRCH;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -2949,7 +2953,9 @@ static int bnx2x_cl45_read(struct bnx2x *bp, struct bnx2x_phy *phy,
|
||||
u32 val;
|
||||
u16 i;
|
||||
int rc = 0;
|
||||
|
||||
if (phy->flags & FLAGS_MDC_MDIO_WA_B0)
|
||||
bnx2x_bits_en(bp, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_STATUS,
|
||||
EMAC_MDIO_STATUS_10MB);
|
||||
/* address */
|
||||
val = ((phy->addr << 21) | (devad << 16) | reg |
|
||||
EMAC_MDIO_COMM_COMMAND_ADDRESS |
|
||||
@ -3003,6 +3009,9 @@ static int bnx2x_cl45_read(struct bnx2x *bp, struct bnx2x_phy *phy,
|
||||
}
|
||||
}
|
||||
|
||||
if (phy->flags & FLAGS_MDC_MDIO_WA_B0)
|
||||
bnx2x_bits_dis(bp, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_STATUS,
|
||||
EMAC_MDIO_STATUS_10MB);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -3012,6 +3021,9 @@ static int bnx2x_cl45_write(struct bnx2x *bp, struct bnx2x_phy *phy,
|
||||
u32 tmp;
|
||||
u8 i;
|
||||
int rc = 0;
|
||||
if (phy->flags & FLAGS_MDC_MDIO_WA_B0)
|
||||
bnx2x_bits_en(bp, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_STATUS,
|
||||
EMAC_MDIO_STATUS_10MB);
|
||||
|
||||
/* address */
|
||||
|
||||
@ -3065,7 +3077,9 @@ static int bnx2x_cl45_write(struct bnx2x *bp, struct bnx2x_phy *phy,
|
||||
bnx2x_cl45_read(bp, phy, devad, 0xf, &temp_val);
|
||||
}
|
||||
}
|
||||
|
||||
if (phy->flags & FLAGS_MDC_MDIO_WA_B0)
|
||||
bnx2x_bits_dis(bp, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_STATUS,
|
||||
EMAC_MDIO_STATUS_10MB);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -4353,6 +4367,9 @@ void bnx2x_link_status_update(struct link_params *params,
|
||||
|
||||
vars->link_up = (vars->link_status & LINK_STATUS_LINK_UP);
|
||||
vars->phy_flags = PHY_XGXS_FLAG;
|
||||
if (vars->link_status & LINK_STATUS_PHYSICAL_LINK_FLAG)
|
||||
vars->phy_flags |= PHY_PHYSICAL_LINK_FLAG;
|
||||
|
||||
if (vars->link_up) {
|
||||
DP(NETIF_MSG_LINK, "phy link up\n");
|
||||
|
||||
@ -4444,6 +4461,8 @@ void bnx2x_link_status_update(struct link_params *params,
|
||||
|
||||
/* indicate no mac active */
|
||||
vars->mac_type = MAC_TYPE_NONE;
|
||||
if (vars->link_status & LINK_STATUS_PHYSICAL_LINK_FLAG)
|
||||
vars->phy_flags |= PHY_HALF_OPEN_CONN_FLAG;
|
||||
}
|
||||
|
||||
/* Sync media type */
|
||||
@ -5903,20 +5922,30 @@ int bnx2x_set_led(struct link_params *params,
|
||||
tmp = EMAC_RD(bp, EMAC_REG_EMAC_LED);
|
||||
EMAC_WR(bp, EMAC_REG_EMAC_LED,
|
||||
(tmp | EMAC_LED_OVERRIDE));
|
||||
return rc;
|
||||
/*
|
||||
* return here without enabling traffic
|
||||
* LED blink andsetting rate in ON mode.
|
||||
* In oper mode, enabling LED blink
|
||||
* and setting rate is needed.
|
||||
*/
|
||||
if (mode == LED_MODE_ON)
|
||||
return rc;
|
||||
}
|
||||
} else if (SINGLE_MEDIA_DIRECT(params) &&
|
||||
(CHIP_IS_E1x(bp) ||
|
||||
CHIP_IS_E2(bp))) {
|
||||
} else if (SINGLE_MEDIA_DIRECT(params)) {
|
||||
/*
|
||||
* This is a work-around for HW issue found when link
|
||||
* is up in CL73
|
||||
*/
|
||||
REG_WR(bp, NIG_REG_LED_MODE_P0 + port*4, 0);
|
||||
REG_WR(bp, NIG_REG_LED_10G_P0 + port*4, 1);
|
||||
} else {
|
||||
if (CHIP_IS_E1x(bp) ||
|
||||
CHIP_IS_E2(bp) ||
|
||||
(mode == LED_MODE_ON))
|
||||
REG_WR(bp, NIG_REG_LED_MODE_P0 + port*4, 0);
|
||||
else
|
||||
REG_WR(bp, NIG_REG_LED_MODE_P0 + port*4,
|
||||
hw_led_mode);
|
||||
} else
|
||||
REG_WR(bp, NIG_REG_LED_MODE_P0 + port*4, hw_led_mode);
|
||||
}
|
||||
|
||||
REG_WR(bp, NIG_REG_LED_CONTROL_OVERRIDE_TRAFFIC_P0 + port*4, 0);
|
||||
/* Set blinking rate to ~15.9Hz */
|
||||
@ -6160,6 +6189,7 @@ static int bnx2x_update_link_down(struct link_params *params,
|
||||
/* update shared memory */
|
||||
vars->link_status &= ~(LINK_STATUS_SPEED_AND_DUPLEX_MASK |
|
||||
LINK_STATUS_LINK_UP |
|
||||
LINK_STATUS_PHYSICAL_LINK_FLAG |
|
||||
LINK_STATUS_AUTO_NEGOTIATE_COMPLETE |
|
||||
LINK_STATUS_RX_FLOW_CONTROL_FLAG_MASK |
|
||||
LINK_STATUS_TX_FLOW_CONTROL_FLAG_MASK |
|
||||
@ -6197,7 +6227,8 @@ static int bnx2x_update_link_up(struct link_params *params,
|
||||
u8 port = params->port;
|
||||
int rc = 0;
|
||||
|
||||
vars->link_status |= LINK_STATUS_LINK_UP;
|
||||
vars->link_status |= (LINK_STATUS_LINK_UP |
|
||||
LINK_STATUS_PHYSICAL_LINK_FLAG);
|
||||
vars->phy_flags |= PHY_PHYSICAL_LINK_FLAG;
|
||||
|
||||
if (vars->flow_ctrl & BNX2X_FLOW_CTRL_TX)
|
||||
@ -7998,6 +8029,9 @@ static void bnx2x_warpcore_set_limiting_mode(struct link_params *params,
|
||||
bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD,
|
||||
MDIO_WC_REG_UC_INFO_B1_FIRMWARE_MODE, &val);
|
||||
|
||||
/* Restart microcode to re-read the new mode */
|
||||
bnx2x_warpcore_reset_lane(bp, phy, 1);
|
||||
bnx2x_warpcore_reset_lane(bp, phy, 0);
|
||||
|
||||
}
|
||||
|
||||
@ -8116,7 +8150,6 @@ void bnx2x_handle_module_detect_int(struct link_params *params)
|
||||
offsetof(struct shmem_region, dev_info.
|
||||
port_feature_config[params->port].
|
||||
config));
|
||||
|
||||
bnx2x_set_gpio_int(bp, gpio_num,
|
||||
MISC_REGISTERS_GPIO_INT_OUTPUT_SET,
|
||||
gpio_port);
|
||||
@ -8125,8 +8158,9 @@ void bnx2x_handle_module_detect_int(struct link_params *params)
|
||||
* Disable transmit for this module
|
||||
*/
|
||||
phy->media_type = ETH_PHY_NOT_PRESENT;
|
||||
if ((val & PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_MASK) ==
|
||||
PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_DISABLE_TX_LASER)
|
||||
if (((val & PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_MASK) ==
|
||||
PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_DISABLE_TX_LASER) ||
|
||||
CHIP_IS_E3(bp))
|
||||
bnx2x_sfp_set_transmitter(params, phy, 0);
|
||||
}
|
||||
}
|
||||
@ -8228,9 +8262,6 @@ static u8 bnx2x_8706_config_init(struct bnx2x_phy *phy,
|
||||
u16 cnt, val, tmp1;
|
||||
struct bnx2x *bp = params->bp;
|
||||
|
||||
/* SPF+ PHY: Set flag to check for Tx error */
|
||||
vars->phy_flags = PHY_TX_ERROR_CHECK_FLAG;
|
||||
|
||||
bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2,
|
||||
MISC_REGISTERS_GPIO_OUTPUT_HIGH, params->port);
|
||||
/* HW reset */
|
||||
@ -8414,9 +8445,6 @@ static int bnx2x_8726_config_init(struct bnx2x_phy *phy,
|
||||
struct bnx2x *bp = params->bp;
|
||||
DP(NETIF_MSG_LINK, "Initializing BCM8726\n");
|
||||
|
||||
/* SPF+ PHY: Set flag to check for Tx error */
|
||||
vars->phy_flags = PHY_TX_ERROR_CHECK_FLAG;
|
||||
|
||||
bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD, MDIO_PMA_REG_CTRL, 1<<15);
|
||||
bnx2x_wait_reset_complete(bp, phy, params);
|
||||
|
||||
@ -8585,9 +8613,6 @@ static int bnx2x_8727_config_init(struct bnx2x_phy *phy,
|
||||
struct bnx2x *bp = params->bp;
|
||||
/* Enable PMD link, MOD_ABS_FLT, and 1G link alarm */
|
||||
|
||||
/* SPF+ PHY: Set flag to check for Tx error */
|
||||
vars->phy_flags = PHY_TX_ERROR_CHECK_FLAG;
|
||||
|
||||
bnx2x_wait_reset_complete(bp, phy, params);
|
||||
rx_alarm_ctrl_val = (1<<2) | (1<<5) ;
|
||||
/* Should be 0x6 to enable XS on Tx side. */
|
||||
@ -9243,7 +9268,13 @@ static int bnx2x_848xx_cmn_config_init(struct bnx2x_phy *phy,
|
||||
if (phy->req_duplex == DUPLEX_FULL)
|
||||
autoneg_val |= (1<<8);
|
||||
|
||||
bnx2x_cl45_write(bp, phy,
|
||||
/*
|
||||
* Always write this if this is not 84833.
|
||||
* For 84833, write it only when it's a forced speed.
|
||||
*/
|
||||
if ((phy->type != PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833) ||
|
||||
((autoneg_val & (1<<12)) == 0))
|
||||
bnx2x_cl45_write(bp, phy,
|
||||
MDIO_AN_DEVAD,
|
||||
MDIO_AN_REG_8481_LEGACY_MII_CTRL, autoneg_val);
|
||||
|
||||
@ -9257,13 +9288,12 @@ static int bnx2x_848xx_cmn_config_init(struct bnx2x_phy *phy,
|
||||
bnx2x_cl45_write(bp, phy,
|
||||
MDIO_AN_DEVAD, MDIO_AN_REG_CTRL,
|
||||
0x3200);
|
||||
} else if (phy->req_line_speed != SPEED_10 &&
|
||||
phy->req_line_speed != SPEED_100) {
|
||||
} else
|
||||
bnx2x_cl45_write(bp, phy,
|
||||
MDIO_AN_DEVAD,
|
||||
MDIO_AN_REG_8481_10GBASE_T_AN_CTRL,
|
||||
1);
|
||||
}
|
||||
|
||||
/* Save spirom version */
|
||||
bnx2x_save_848xx_spirom_version(phy, params);
|
||||
|
||||
@ -9756,11 +9786,9 @@ static void bnx2x_848x3_link_reset(struct bnx2x_phy *phy,
|
||||
bnx2x_cl45_read(bp, phy,
|
||||
MDIO_CTL_DEVAD,
|
||||
0x400f, &val16);
|
||||
/* Put to low power mode on newer FW */
|
||||
if ((val16 & 0x303f) > 0x1009)
|
||||
bnx2x_cl45_write(bp, phy,
|
||||
MDIO_PMA_DEVAD,
|
||||
MDIO_PMA_REG_CTRL, 0x800);
|
||||
bnx2x_cl45_write(bp, phy,
|
||||
MDIO_PMA_DEVAD,
|
||||
MDIO_PMA_REG_CTRL, 0x800);
|
||||
}
|
||||
}
|
||||
|
||||
@ -10191,8 +10219,15 @@ static void bnx2x_54618se_link_reset(struct bnx2x_phy *phy,
|
||||
u32 cfg_pin;
|
||||
u8 port;
|
||||
|
||||
/* This works with E3 only, no need to check the chip
|
||||
before determining the port. */
|
||||
/*
|
||||
* In case of no EPIO routed to reset the GPHY, put it
|
||||
* in low power mode.
|
||||
*/
|
||||
bnx2x_cl22_write(bp, phy, MDIO_PMA_REG_CTRL, 0x800);
|
||||
/*
|
||||
* This works with E3 only, no need to check the chip
|
||||
* before determining the port.
|
||||
*/
|
||||
port = params->port;
|
||||
cfg_pin = (REG_RD(bp, params->shmem_base +
|
||||
offsetof(struct shmem_region,
|
||||
@ -10603,7 +10638,8 @@ static struct bnx2x_phy phy_warpcore = {
|
||||
.type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT,
|
||||
.addr = 0xff,
|
||||
.def_md_devad = 0,
|
||||
.flags = FLAGS_HW_LOCK_REQUIRED,
|
||||
.flags = (FLAGS_HW_LOCK_REQUIRED |
|
||||
FLAGS_TX_ERROR_CHECK),
|
||||
.rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
|
||||
.tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
|
||||
.mdio_ctrl = 0,
|
||||
@ -10729,7 +10765,8 @@ static struct bnx2x_phy phy_8706 = {
|
||||
.type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8706,
|
||||
.addr = 0xff,
|
||||
.def_md_devad = 0,
|
||||
.flags = FLAGS_INIT_XGXS_FIRST,
|
||||
.flags = (FLAGS_INIT_XGXS_FIRST |
|
||||
FLAGS_TX_ERROR_CHECK),
|
||||
.rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
|
||||
.tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
|
||||
.mdio_ctrl = 0,
|
||||
@ -10760,7 +10797,8 @@ static struct bnx2x_phy phy_8726 = {
|
||||
.addr = 0xff,
|
||||
.def_md_devad = 0,
|
||||
.flags = (FLAGS_HW_LOCK_REQUIRED |
|
||||
FLAGS_INIT_XGXS_FIRST),
|
||||
FLAGS_INIT_XGXS_FIRST |
|
||||
FLAGS_TX_ERROR_CHECK),
|
||||
.rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
|
||||
.tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
|
||||
.mdio_ctrl = 0,
|
||||
@ -10791,7 +10829,8 @@ static struct bnx2x_phy phy_8727 = {
|
||||
.type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727,
|
||||
.addr = 0xff,
|
||||
.def_md_devad = 0,
|
||||
.flags = FLAGS_FAN_FAILURE_DET_REQ,
|
||||
.flags = (FLAGS_FAN_FAILURE_DET_REQ |
|
||||
FLAGS_TX_ERROR_CHECK),
|
||||
.rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
|
||||
.tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
|
||||
.mdio_ctrl = 0,
|
||||
@ -11112,6 +11151,8 @@ static int bnx2x_populate_int_phy(struct bnx2x *bp, u32 shmem_base, u8 port,
|
||||
*/
|
||||
if (CHIP_REV(bp) == CHIP_REV_Ax)
|
||||
phy->flags |= FLAGS_MDC_MDIO_WA;
|
||||
else
|
||||
phy->flags |= FLAGS_MDC_MDIO_WA_B0;
|
||||
} else {
|
||||
switch (switch_cfg) {
|
||||
case SWITCH_CFG_1G:
|
||||
@ -11500,13 +11541,12 @@ void bnx2x_init_xmac_loopback(struct link_params *params,
|
||||
* Set WC to loopback mode since link is required to provide clock
|
||||
* to the XMAC in 20G mode
|
||||
*/
|
||||
if (vars->line_speed == SPEED_20000) {
|
||||
bnx2x_set_aer_mmd(params, ¶ms->phy[0]);
|
||||
bnx2x_warpcore_reset_lane(bp, ¶ms->phy[0], 0);
|
||||
params->phy[INT_PHY].config_loopback(
|
||||
bnx2x_set_aer_mmd(params, ¶ms->phy[0]);
|
||||
bnx2x_warpcore_reset_lane(bp, ¶ms->phy[0], 0);
|
||||
params->phy[INT_PHY].config_loopback(
|
||||
¶ms->phy[INT_PHY],
|
||||
params);
|
||||
}
|
||||
|
||||
bnx2x_xmac_enable(params, vars, 1);
|
||||
REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0);
|
||||
}
|
||||
@ -11684,12 +11724,16 @@ int bnx2x_link_reset(struct link_params *params, struct link_vars *vars,
|
||||
bnx2x_set_led(params, vars, LED_MODE_OFF, 0);
|
||||
|
||||
if (reset_ext_phy) {
|
||||
bnx2x_set_mdio_clk(bp, params->chip_id, port);
|
||||
for (phy_index = EXT_PHY1; phy_index < params->num_phys;
|
||||
phy_index++) {
|
||||
if (params->phy[phy_index].link_reset)
|
||||
if (params->phy[phy_index].link_reset) {
|
||||
bnx2x_set_aer_mmd(params,
|
||||
¶ms->phy[phy_index]);
|
||||
params->phy[phy_index].link_reset(
|
||||
¶ms->phy[phy_index],
|
||||
params);
|
||||
}
|
||||
if (params->phy[phy_index].flags &
|
||||
FLAGS_REARM_LATCH_SIGNAL)
|
||||
clear_latch_ind = 1;
|
||||
@ -12178,10 +12222,6 @@ static void bnx2x_analyze_link_error(struct link_params *params,
|
||||
u8 led_mode;
|
||||
u32 half_open_conn = (vars->phy_flags & PHY_HALF_OPEN_CONN_FLAG) > 0;
|
||||
|
||||
/*DP(NETIF_MSG_LINK, "CHECK LINK: %x half_open:%x-> lss:%x\n",
|
||||
vars->link_up,
|
||||
half_open_conn, lss_status);*/
|
||||
|
||||
if ((lss_status ^ half_open_conn) == 0)
|
||||
return;
|
||||
|
||||
@ -12194,6 +12234,7 @@ static void bnx2x_analyze_link_error(struct link_params *params,
|
||||
* b. Update link_vars->link_up
|
||||
*/
|
||||
if (lss_status) {
|
||||
DP(NETIF_MSG_LINK, "Remote Fault detected !!!\n");
|
||||
vars->link_status &= ~LINK_STATUS_LINK_UP;
|
||||
vars->link_up = 0;
|
||||
vars->phy_flags |= PHY_HALF_OPEN_CONN_FLAG;
|
||||
@ -12203,6 +12244,7 @@ static void bnx2x_analyze_link_error(struct link_params *params,
|
||||
*/
|
||||
led_mode = LED_MODE_OFF;
|
||||
} else {
|
||||
DP(NETIF_MSG_LINK, "Remote Fault cleared\n");
|
||||
vars->link_status |= LINK_STATUS_LINK_UP;
|
||||
vars->link_up = 1;
|
||||
vars->phy_flags &= ~PHY_HALF_OPEN_CONN_FLAG;
|
||||
@ -12219,6 +12261,15 @@ static void bnx2x_analyze_link_error(struct link_params *params,
|
||||
bnx2x_notify_link_changed(bp);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* Description:
|
||||
* This function checks for half opened connection change indication.
|
||||
* When such change occurs, it calls the bnx2x_analyze_link_error
|
||||
* to check if Remote Fault is set or cleared. Reception of remote fault
|
||||
* status message in the MAC indicates that the peer's MAC has detected
|
||||
* a fault, for example, due to break in the TX side of fiber.
|
||||
*
|
||||
******************************************************************************/
|
||||
static void bnx2x_check_half_open_conn(struct link_params *params,
|
||||
struct link_vars *vars)
|
||||
{
|
||||
@ -12229,9 +12280,28 @@ static void bnx2x_check_half_open_conn(struct link_params *params,
|
||||
if ((vars->phy_flags & PHY_PHYSICAL_LINK_FLAG) == 0)
|
||||
return;
|
||||
|
||||
if (!CHIP_IS_E3(bp) &&
|
||||
if (CHIP_IS_E3(bp) &&
|
||||
(REG_RD(bp, MISC_REG_RESET_REG_2) &
|
||||
(MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << params->port))) {
|
||||
(MISC_REGISTERS_RESET_REG_2_XMAC))) {
|
||||
/* Check E3 XMAC */
|
||||
/*
|
||||
* Note that link speed cannot be queried here, since it may be
|
||||
* zero while link is down. In case UMAC is active, LSS will
|
||||
* simply not be set
|
||||
*/
|
||||
mac_base = (params->port) ? GRCBASE_XMAC1 : GRCBASE_XMAC0;
|
||||
|
||||
/* Clear stick bits (Requires rising edge) */
|
||||
REG_WR(bp, mac_base + XMAC_REG_CLEAR_RX_LSS_STATUS, 0);
|
||||
REG_WR(bp, mac_base + XMAC_REG_CLEAR_RX_LSS_STATUS,
|
||||
XMAC_CLEAR_RX_LSS_STATUS_REG_CLEAR_LOCAL_FAULT_STATUS |
|
||||
XMAC_CLEAR_RX_LSS_STATUS_REG_CLEAR_REMOTE_FAULT_STATUS);
|
||||
if (REG_RD(bp, mac_base + XMAC_REG_RX_LSS_STATUS))
|
||||
lss_status = 1;
|
||||
|
||||
bnx2x_analyze_link_error(params, vars, lss_status);
|
||||
} else if (REG_RD(bp, MISC_REG_RESET_REG_2) &
|
||||
(MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << params->port)) {
|
||||
/* Check E1X / E2 BMAC */
|
||||
u32 lss_status_reg;
|
||||
u32 wb_data[2];
|
||||
@ -12253,14 +12323,20 @@ static void bnx2x_check_half_open_conn(struct link_params *params,
|
||||
void bnx2x_period_func(struct link_params *params, struct link_vars *vars)
|
||||
{
|
||||
struct bnx2x *bp = params->bp;
|
||||
u16 phy_idx;
|
||||
if (!params) {
|
||||
DP(NETIF_MSG_LINK, "Ininitliazed params !\n");
|
||||
DP(NETIF_MSG_LINK, "Uninitialized params !\n");
|
||||
return;
|
||||
}
|
||||
/* DP(NETIF_MSG_LINK, "Periodic called vars->phy_flags 0x%x speed 0x%x
|
||||
RESET_REG_2 0x%x\n", vars->phy_flags, vars->line_speed,
|
||||
REG_RD(bp, MISC_REG_RESET_REG_2)); */
|
||||
bnx2x_check_half_open_conn(params, vars);
|
||||
|
||||
for (phy_idx = INT_PHY; phy_idx < MAX_PHYS; phy_idx++) {
|
||||
if (params->phy[phy_idx].flags & FLAGS_TX_ERROR_CHECK) {
|
||||
bnx2x_set_aer_mmd(params, ¶ms->phy[phy_idx]);
|
||||
bnx2x_check_half_open_conn(params, vars);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (CHIP_IS_E3(bp))
|
||||
bnx2x_check_over_curr(params, vars);
|
||||
}
|
||||
|
@ -145,6 +145,8 @@ struct bnx2x_phy {
|
||||
#define FLAGS_SFP_NOT_APPROVED (1<<7)
|
||||
#define FLAGS_MDC_MDIO_WA (1<<8)
|
||||
#define FLAGS_DUMMY_READ (1<<9)
|
||||
#define FLAGS_MDC_MDIO_WA_B0 (1<<10)
|
||||
#define FLAGS_TX_ERROR_CHECK (1<<12)
|
||||
|
||||
/* preemphasis values for the rx side */
|
||||
u16 rx_preemphasis[4];
|
||||
@ -276,7 +278,6 @@ struct link_vars {
|
||||
#define PHY_PHYSICAL_LINK_FLAG (1<<2)
|
||||
#define PHY_HALF_OPEN_CONN_FLAG (1<<3)
|
||||
#define PHY_OVER_CURRENT_FLAG (1<<4)
|
||||
#define PHY_TX_ERROR_CHECK_FLAG (1<<5)
|
||||
|
||||
u8 mac_type;
|
||||
#define MAC_TYPE_NONE 0
|
||||
|
@ -4771,9 +4771,11 @@
|
||||
The fields are: [4:0] - tail pointer; 10:5] - Link List size; 15:11] -
|
||||
header pointer. */
|
||||
#define UCM_REG_XX_TABLE 0xe0300
|
||||
#define UMAC_COMMAND_CONFIG_REG_IGNORE_TX_PAUSE (0x1<<28)
|
||||
#define UMAC_COMMAND_CONFIG_REG_LOOP_ENA (0x1<<15)
|
||||
#define UMAC_COMMAND_CONFIG_REG_NO_LGTH_CHECK (0x1<<24)
|
||||
#define UMAC_COMMAND_CONFIG_REG_PAD_EN (0x1<<5)
|
||||
#define UMAC_COMMAND_CONFIG_REG_PAUSE_IGNORE (0x1<<8)
|
||||
#define UMAC_COMMAND_CONFIG_REG_PROMIS_EN (0x1<<4)
|
||||
#define UMAC_COMMAND_CONFIG_REG_RX_ENA (0x1<<1)
|
||||
#define UMAC_COMMAND_CONFIG_REG_SW_RESET (0x1<<13)
|
||||
@ -5622,8 +5624,9 @@
|
||||
#define EMAC_MDIO_COMM_START_BUSY (1L<<29)
|
||||
#define EMAC_MDIO_MODE_AUTO_POLL (1L<<4)
|
||||
#define EMAC_MDIO_MODE_CLAUSE_45 (1L<<31)
|
||||
#define EMAC_MDIO_MODE_CLOCK_CNT (0x3fL<<16)
|
||||
#define EMAC_MDIO_MODE_CLOCK_CNT (0x3ffL<<16)
|
||||
#define EMAC_MDIO_MODE_CLOCK_CNT_BITSHIFT 16
|
||||
#define EMAC_MDIO_STATUS_10MB (1L<<1)
|
||||
#define EMAC_MODE_25G_MODE (1L<<5)
|
||||
#define EMAC_MODE_HALF_DUPLEX (1L<<1)
|
||||
#define EMAC_MODE_PORT_GMII (2L<<2)
|
||||
@ -5634,6 +5637,7 @@
|
||||
#define EMAC_REG_EMAC_MAC_MATCH 0x10
|
||||
#define EMAC_REG_EMAC_MDIO_COMM 0xac
|
||||
#define EMAC_REG_EMAC_MDIO_MODE 0xb4
|
||||
#define EMAC_REG_EMAC_MDIO_STATUS 0xb0
|
||||
#define EMAC_REG_EMAC_MODE 0x0
|
||||
#define EMAC_REG_EMAC_RX_MODE 0xc8
|
||||
#define EMAC_REG_EMAC_RX_MTU_SIZE 0x9c
|
||||
|
@ -838,6 +838,7 @@ static int e1000_intr_test(struct e1000_adapter *adapter, u64 *data)
|
||||
|
||||
/* Disable all the interrupts */
|
||||
ew32(IMC, 0xFFFFFFFF);
|
||||
E1000_WRITE_FLUSH();
|
||||
msleep(10);
|
||||
|
||||
/* Test each interrupt */
|
||||
@ -856,6 +857,7 @@ static int e1000_intr_test(struct e1000_adapter *adapter, u64 *data)
|
||||
adapter->test_icr = 0;
|
||||
ew32(IMC, mask);
|
||||
ew32(ICS, mask);
|
||||
E1000_WRITE_FLUSH();
|
||||
msleep(10);
|
||||
|
||||
if (adapter->test_icr & mask) {
|
||||
@ -873,6 +875,7 @@ static int e1000_intr_test(struct e1000_adapter *adapter, u64 *data)
|
||||
adapter->test_icr = 0;
|
||||
ew32(IMS, mask);
|
||||
ew32(ICS, mask);
|
||||
E1000_WRITE_FLUSH();
|
||||
msleep(10);
|
||||
|
||||
if (!(adapter->test_icr & mask)) {
|
||||
@ -890,6 +893,7 @@ static int e1000_intr_test(struct e1000_adapter *adapter, u64 *data)
|
||||
adapter->test_icr = 0;
|
||||
ew32(IMC, ~mask & 0x00007FFF);
|
||||
ew32(ICS, ~mask & 0x00007FFF);
|
||||
E1000_WRITE_FLUSH();
|
||||
msleep(10);
|
||||
|
||||
if (adapter->test_icr) {
|
||||
@ -901,6 +905,7 @@ static int e1000_intr_test(struct e1000_adapter *adapter, u64 *data)
|
||||
|
||||
/* Disable all the interrupts */
|
||||
ew32(IMC, 0xFFFFFFFF);
|
||||
E1000_WRITE_FLUSH();
|
||||
msleep(10);
|
||||
|
||||
/* Unhook test interrupt handler */
|
||||
@ -1394,6 +1399,7 @@ static int e1000_run_loopback_test(struct e1000_adapter *adapter)
|
||||
if (unlikely(++k == txdr->count)) k = 0;
|
||||
}
|
||||
ew32(TDT, k);
|
||||
E1000_WRITE_FLUSH();
|
||||
msleep(200);
|
||||
time = jiffies; /* set the start time for the receive */
|
||||
good_cnt = 0;
|
||||
|
@ -446,6 +446,7 @@ s32 e1000_reset_hw(struct e1000_hw *hw)
|
||||
/* Must reset the PHY before resetting the MAC */
|
||||
if ((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) {
|
||||
ew32(CTRL, (ctrl | E1000_CTRL_PHY_RST));
|
||||
E1000_WRITE_FLUSH();
|
||||
msleep(5);
|
||||
}
|
||||
|
||||
@ -3752,6 +3753,7 @@ static s32 e1000_acquire_eeprom(struct e1000_hw *hw)
|
||||
/* Clear SK and CS */
|
||||
eecd &= ~(E1000_EECD_CS | E1000_EECD_SK);
|
||||
ew32(EECD, eecd);
|
||||
E1000_WRITE_FLUSH();
|
||||
udelay(1);
|
||||
}
|
||||
|
||||
@ -3824,6 +3826,7 @@ static void e1000_release_eeprom(struct e1000_hw *hw)
|
||||
eecd &= ~E1000_EECD_SK; /* Lower SCK */
|
||||
|
||||
ew32(EECD, eecd);
|
||||
E1000_WRITE_FLUSH();
|
||||
|
||||
udelay(hw->eeprom.delay_usec);
|
||||
} else if (hw->eeprom.type == e1000_eeprom_microwire) {
|
||||
|
@ -1313,6 +1313,7 @@ static s32 e1000_read_kmrn_reg_80003es2lan(struct e1000_hw *hw, u32 offset,
|
||||
kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) &
|
||||
E1000_KMRNCTRLSTA_OFFSET) | E1000_KMRNCTRLSTA_REN;
|
||||
ew32(KMRNCTRLSTA, kmrnctrlsta);
|
||||
e1e_flush();
|
||||
|
||||
udelay(2);
|
||||
|
||||
@ -1347,6 +1348,7 @@ static s32 e1000_write_kmrn_reg_80003es2lan(struct e1000_hw *hw, u32 offset,
|
||||
kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) &
|
||||
E1000_KMRNCTRLSTA_OFFSET) | data;
|
||||
ew32(KMRNCTRLSTA, kmrnctrlsta);
|
||||
e1e_flush();
|
||||
|
||||
udelay(2);
|
||||
|
||||
|
@ -28,8 +28,8 @@
|
||||
|
||||
/* ethtool support for e1000 */
|
||||
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/slab.h>
|
||||
@ -964,6 +964,7 @@ static int e1000_intr_test(struct e1000_adapter *adapter, u64 *data)
|
||||
|
||||
/* Disable all the interrupts */
|
||||
ew32(IMC, 0xFFFFFFFF);
|
||||
e1e_flush();
|
||||
usleep_range(10000, 20000);
|
||||
|
||||
/* Test each interrupt */
|
||||
@ -996,6 +997,7 @@ static int e1000_intr_test(struct e1000_adapter *adapter, u64 *data)
|
||||
adapter->test_icr = 0;
|
||||
ew32(IMC, mask);
|
||||
ew32(ICS, mask);
|
||||
e1e_flush();
|
||||
usleep_range(10000, 20000);
|
||||
|
||||
if (adapter->test_icr & mask) {
|
||||
@ -1014,6 +1016,7 @@ static int e1000_intr_test(struct e1000_adapter *adapter, u64 *data)
|
||||
adapter->test_icr = 0;
|
||||
ew32(IMS, mask);
|
||||
ew32(ICS, mask);
|
||||
e1e_flush();
|
||||
usleep_range(10000, 20000);
|
||||
|
||||
if (!(adapter->test_icr & mask)) {
|
||||
@ -1032,6 +1035,7 @@ static int e1000_intr_test(struct e1000_adapter *adapter, u64 *data)
|
||||
adapter->test_icr = 0;
|
||||
ew32(IMC, ~mask & 0x00007FFF);
|
||||
ew32(ICS, ~mask & 0x00007FFF);
|
||||
e1e_flush();
|
||||
usleep_range(10000, 20000);
|
||||
|
||||
if (adapter->test_icr) {
|
||||
@ -1043,6 +1047,7 @@ static int e1000_intr_test(struct e1000_adapter *adapter, u64 *data)
|
||||
|
||||
/* Disable all the interrupts */
|
||||
ew32(IMC, 0xFFFFFFFF);
|
||||
e1e_flush();
|
||||
usleep_range(10000, 20000);
|
||||
|
||||
/* Unhook test interrupt handler */
|
||||
@ -1276,6 +1281,7 @@ static int e1000_integrated_phy_loopback(struct e1000_adapter *adapter)
|
||||
E1000_CTRL_FD); /* Force Duplex to FULL */
|
||||
|
||||
ew32(CTRL, ctrl_reg);
|
||||
e1e_flush();
|
||||
udelay(500);
|
||||
|
||||
return 0;
|
||||
@ -1418,6 +1424,7 @@ static int e1000_set_82571_fiber_loopback(struct e1000_adapter *adapter)
|
||||
*/
|
||||
#define E1000_SERDES_LB_ON 0x410
|
||||
ew32(SCTL, E1000_SERDES_LB_ON);
|
||||
e1e_flush();
|
||||
usleep_range(10000, 20000);
|
||||
|
||||
return 0;
|
||||
@ -1513,6 +1520,7 @@ static void e1000_loopback_cleanup(struct e1000_adapter *adapter)
|
||||
hw->phy.media_type == e1000_media_type_internal_serdes) {
|
||||
#define E1000_SERDES_LB_OFF 0x400
|
||||
ew32(SCTL, E1000_SERDES_LB_OFF);
|
||||
e1e_flush();
|
||||
usleep_range(10000, 20000);
|
||||
break;
|
||||
}
|
||||
@ -1592,6 +1600,7 @@ static int e1000_run_loopback_test(struct e1000_adapter *adapter)
|
||||
k = 0;
|
||||
}
|
||||
ew32(TDT, k);
|
||||
e1e_flush();
|
||||
msleep(200);
|
||||
time = jiffies; /* set the start time for the receive */
|
||||
good_cnt = 0;
|
||||
|
@ -283,6 +283,7 @@ static void e1000_toggle_lanphypc_value_ich8lan(struct e1000_hw *hw)
|
||||
ctrl |= E1000_CTRL_LANPHYPC_OVERRIDE;
|
||||
ctrl &= ~E1000_CTRL_LANPHYPC_VALUE;
|
||||
ew32(CTRL, ctrl);
|
||||
e1e_flush();
|
||||
udelay(10);
|
||||
ctrl &= ~E1000_CTRL_LANPHYPC_OVERRIDE;
|
||||
ew32(CTRL, ctrl);
|
||||
@ -1230,9 +1231,11 @@ s32 e1000_configure_k1_ich8lan(struct e1000_hw *hw, bool k1_enable)
|
||||
ew32(CTRL, reg);
|
||||
|
||||
ew32(CTRL_EXT, ctrl_ext | E1000_CTRL_EXT_SPD_BYPS);
|
||||
e1e_flush();
|
||||
udelay(20);
|
||||
ew32(CTRL, ctrl_reg);
|
||||
ew32(CTRL_EXT, ctrl_ext);
|
||||
e1e_flush();
|
||||
udelay(20);
|
||||
|
||||
out:
|
||||
@ -2134,8 +2137,7 @@ static s32 e1000_read_nvm_ich8lan(struct e1000_hw *hw, u16 offset, u16 words,
|
||||
|
||||
ret_val = 0;
|
||||
for (i = 0; i < words; i++) {
|
||||
if ((dev_spec->shadow_ram) &&
|
||||
(dev_spec->shadow_ram[offset+i].modified)) {
|
||||
if (dev_spec->shadow_ram[offset+i].modified) {
|
||||
data[i] = dev_spec->shadow_ram[offset+i].value;
|
||||
} else {
|
||||
ret_val = e1000_read_flash_word_ich8lan(hw,
|
||||
@ -3090,6 +3092,7 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw)
|
||||
ret_val = e1000_acquire_swflag_ich8lan(hw);
|
||||
e_dbg("Issuing a global reset to ich8lan\n");
|
||||
ew32(CTRL, (ctrl | E1000_CTRL_RST));
|
||||
/* cannot issue a flush here because it hangs the hardware */
|
||||
msleep(20);
|
||||
|
||||
if (!ret_val)
|
||||
|
@ -1986,6 +1986,7 @@ static s32 e1000_ready_nvm_eeprom(struct e1000_hw *hw)
|
||||
/* Clear SK and CS */
|
||||
eecd &= ~(E1000_EECD_CS | E1000_EECD_SK);
|
||||
ew32(EECD, eecd);
|
||||
e1e_flush();
|
||||
udelay(1);
|
||||
|
||||
/*
|
||||
|
@ -31,12 +31,12 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/pagemap.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/tcp.h>
|
||||
#include <linux/ipv6.h>
|
||||
#include <linux/slab.h>
|
||||
|
@ -537,6 +537,7 @@ static s32 __e1000_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data,
|
||||
kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) &
|
||||
E1000_KMRNCTRLSTA_OFFSET) | E1000_KMRNCTRLSTA_REN;
|
||||
ew32(KMRNCTRLSTA, kmrnctrlsta);
|
||||
e1e_flush();
|
||||
|
||||
udelay(2);
|
||||
|
||||
@ -609,6 +610,7 @@ static s32 __e1000_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data,
|
||||
kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) &
|
||||
E1000_KMRNCTRLSTA_OFFSET) | data;
|
||||
ew32(KMRNCTRLSTA, kmrnctrlsta);
|
||||
e1e_flush();
|
||||
|
||||
udelay(2);
|
||||
|
||||
|
@ -285,6 +285,7 @@ static s32 igb_ready_nvm_eeprom(struct e1000_hw *hw)
|
||||
/* Clear SK and CS */
|
||||
eecd &= ~(E1000_EECD_CS | E1000_EECD_SK);
|
||||
wr32(E1000_EECD, eecd);
|
||||
wrfl();
|
||||
udelay(1);
|
||||
timeout = NVM_MAX_RETRY_SPI;
|
||||
|
||||
|
@ -1225,6 +1225,7 @@ static int igb_intr_test(struct igb_adapter *adapter, u64 *data)
|
||||
|
||||
/* Disable all the interrupts */
|
||||
wr32(E1000_IMC, ~0);
|
||||
wrfl();
|
||||
msleep(10);
|
||||
|
||||
/* Define all writable bits for ICS */
|
||||
@ -1268,6 +1269,7 @@ static int igb_intr_test(struct igb_adapter *adapter, u64 *data)
|
||||
|
||||
wr32(E1000_IMC, mask);
|
||||
wr32(E1000_ICS, mask);
|
||||
wrfl();
|
||||
msleep(10);
|
||||
|
||||
if (adapter->test_icr & mask) {
|
||||
@ -1289,6 +1291,7 @@ static int igb_intr_test(struct igb_adapter *adapter, u64 *data)
|
||||
|
||||
wr32(E1000_IMS, mask);
|
||||
wr32(E1000_ICS, mask);
|
||||
wrfl();
|
||||
msleep(10);
|
||||
|
||||
if (!(adapter->test_icr & mask)) {
|
||||
@ -1310,6 +1313,7 @@ static int igb_intr_test(struct igb_adapter *adapter, u64 *data)
|
||||
|
||||
wr32(E1000_IMC, ~mask);
|
||||
wr32(E1000_ICS, ~mask);
|
||||
wrfl();
|
||||
msleep(10);
|
||||
|
||||
if (adapter->test_icr & mask) {
|
||||
@ -1321,6 +1325,7 @@ static int igb_intr_test(struct igb_adapter *adapter, u64 *data)
|
||||
|
||||
/* Disable all the interrupts */
|
||||
wr32(E1000_IMC, ~0);
|
||||
wrfl();
|
||||
msleep(10);
|
||||
|
||||
/* Unhook test interrupt handler */
|
||||
|
@ -1052,6 +1052,7 @@ msi_only:
|
||||
kfree(adapter->vf_data);
|
||||
adapter->vf_data = NULL;
|
||||
wr32(E1000_IOVCTL, E1000_IOVCTL_REUSE_VFQ);
|
||||
wrfl();
|
||||
msleep(100);
|
||||
dev_info(&adapter->pdev->dev, "IOV Disabled\n");
|
||||
}
|
||||
@ -2022,7 +2023,7 @@ static int __devinit igb_probe(struct pci_dev *pdev,
|
||||
|
||||
if (hw->bus.func == 0)
|
||||
hw->nvm.ops.read(hw, NVM_INIT_CONTROL3_PORT_A, 1, &eeprom_data);
|
||||
else if (hw->mac.type == e1000_82580)
|
||||
else if (hw->mac.type >= e1000_82580)
|
||||
hw->nvm.ops.read(hw, NVM_INIT_CONTROL3_PORT_A +
|
||||
NVM_82580_LAN_FUNC_OFFSET(hw->bus.func), 1,
|
||||
&eeprom_data);
|
||||
@ -2198,6 +2199,7 @@ static void __devexit igb_remove(struct pci_dev *pdev)
|
||||
kfree(adapter->vf_data);
|
||||
adapter->vf_data = NULL;
|
||||
wr32(E1000_IOVCTL, E1000_IOVCTL_REUSE_VFQ);
|
||||
wrfl();
|
||||
msleep(100);
|
||||
dev_info(&pdev->dev, "IOV Disabled\n");
|
||||
}
|
||||
|
@ -1226,6 +1226,7 @@ static void igbvf_configure_tx(struct igbvf_adapter *adapter)
|
||||
/* disable transmits */
|
||||
txdctl = er32(TXDCTL(0));
|
||||
ew32(TXDCTL(0), txdctl & ~E1000_TXDCTL_QUEUE_ENABLE);
|
||||
e1e_flush();
|
||||
msleep(10);
|
||||
|
||||
/* Setup the HW Tx Head and Tail descriptor pointers */
|
||||
@ -1306,6 +1307,7 @@ static void igbvf_configure_rx(struct igbvf_adapter *adapter)
|
||||
/* disable receives */
|
||||
rxdctl = er32(RXDCTL(0));
|
||||
ew32(RXDCTL(0), rxdctl & ~E1000_RXDCTL_QUEUE_ENABLE);
|
||||
e1e_flush();
|
||||
msleep(10);
|
||||
|
||||
rdlen = rx_ring->count * sizeof(union e1000_adv_rx_desc);
|
||||
|
@ -2405,8 +2405,6 @@ static int __init smsc_superio_lpc(unsigned short cfg_base)
|
||||
* addresses making a subsystem device table necessary.
|
||||
*/
|
||||
#ifdef CONFIG_PCI
|
||||
#define PCIID_VENDOR_INTEL 0x8086
|
||||
#define PCIID_VENDOR_ALI 0x10b9
|
||||
static struct smsc_ircc_subsystem_configuration subsystem_configurations[] __initdata = {
|
||||
/*
|
||||
* Subsystems needing entries:
|
||||
@ -2416,7 +2414,7 @@ static struct smsc_ircc_subsystem_configuration subsystem_configurations[] __ini
|
||||
*/
|
||||
{
|
||||
/* Guessed entry */
|
||||
.vendor = PCIID_VENDOR_INTEL, /* Intel 82801DBM LPC bridge */
|
||||
.vendor = PCI_VENDOR_ID_INTEL, /* Intel 82801DBM LPC bridge */
|
||||
.device = 0x24cc,
|
||||
.subvendor = 0x103c,
|
||||
.subdevice = 0x08bc,
|
||||
@ -2429,7 +2427,7 @@ static struct smsc_ircc_subsystem_configuration subsystem_configurations[] __ini
|
||||
.name = "HP nx5000 family",
|
||||
},
|
||||
{
|
||||
.vendor = PCIID_VENDOR_INTEL, /* Intel 82801DBM LPC bridge */
|
||||
.vendor = PCI_VENDOR_ID_INTEL, /* Intel 82801DBM LPC bridge */
|
||||
.device = 0x24cc,
|
||||
.subvendor = 0x103c,
|
||||
.subdevice = 0x088c,
|
||||
@ -2443,7 +2441,7 @@ static struct smsc_ircc_subsystem_configuration subsystem_configurations[] __ini
|
||||
.name = "HP nc8000 family",
|
||||
},
|
||||
{
|
||||
.vendor = PCIID_VENDOR_INTEL, /* Intel 82801DBM LPC bridge */
|
||||
.vendor = PCI_VENDOR_ID_INTEL, /* Intel 82801DBM LPC bridge */
|
||||
.device = 0x24cc,
|
||||
.subvendor = 0x103c,
|
||||
.subdevice = 0x0890,
|
||||
@ -2456,7 +2454,7 @@ static struct smsc_ircc_subsystem_configuration subsystem_configurations[] __ini
|
||||
.name = "HP nc6000 family",
|
||||
},
|
||||
{
|
||||
.vendor = PCIID_VENDOR_INTEL, /* Intel 82801DBM LPC bridge */
|
||||
.vendor = PCI_VENDOR_ID_INTEL, /* Intel 82801DBM LPC bridge */
|
||||
.device = 0x24cc,
|
||||
.subvendor = 0x0e11,
|
||||
.subdevice = 0x0860,
|
||||
@ -2471,7 +2469,7 @@ static struct smsc_ircc_subsystem_configuration subsystem_configurations[] __ini
|
||||
},
|
||||
{
|
||||
/* Intel 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge */
|
||||
.vendor = PCIID_VENDOR_INTEL,
|
||||
.vendor = PCI_VENDOR_ID_INTEL,
|
||||
.device = 0x24c0,
|
||||
.subvendor = 0x1179,
|
||||
.subdevice = 0xffff, /* 0xffff is "any" */
|
||||
@ -2484,7 +2482,7 @@ static struct smsc_ircc_subsystem_configuration subsystem_configurations[] __ini
|
||||
.name = "Toshiba laptop with Intel 82801DB/DBL LPC bridge",
|
||||
},
|
||||
{
|
||||
.vendor = PCIID_VENDOR_INTEL, /* Intel 82801CAM ISA bridge */
|
||||
.vendor = PCI_VENDOR_ID_INTEL, /* Intel 82801CAM ISA bridge */
|
||||
.device = 0x248c,
|
||||
.subvendor = 0x1179,
|
||||
.subdevice = 0xffff, /* 0xffff is "any" */
|
||||
@ -2498,7 +2496,7 @@ static struct smsc_ircc_subsystem_configuration subsystem_configurations[] __ini
|
||||
},
|
||||
{
|
||||
/* 82801DBM (ICH4-M) LPC Interface Bridge */
|
||||
.vendor = PCIID_VENDOR_INTEL,
|
||||
.vendor = PCI_VENDOR_ID_INTEL,
|
||||
.device = 0x24cc,
|
||||
.subvendor = 0x1179,
|
||||
.subdevice = 0xffff, /* 0xffff is "any" */
|
||||
@ -2512,7 +2510,7 @@ static struct smsc_ircc_subsystem_configuration subsystem_configurations[] __ini
|
||||
},
|
||||
{
|
||||
/* ALi M1533/M1535 PCI to ISA Bridge [Aladdin IV/V/V+] */
|
||||
.vendor = PCIID_VENDOR_ALI,
|
||||
.vendor = PCI_VENDOR_ID_AL,
|
||||
.device = 0x1533,
|
||||
.subvendor = 0x1179,
|
||||
.subdevice = 0xffff, /* 0xffff is "any" */
|
||||
|
@ -57,6 +57,7 @@ ixgb_raise_clock(struct ixgb_hw *hw,
|
||||
*/
|
||||
*eecd_reg = *eecd_reg | IXGB_EECD_SK;
|
||||
IXGB_WRITE_REG(hw, EECD, *eecd_reg);
|
||||
IXGB_WRITE_FLUSH(hw);
|
||||
udelay(50);
|
||||
}
|
||||
|
||||
@ -75,6 +76,7 @@ ixgb_lower_clock(struct ixgb_hw *hw,
|
||||
*/
|
||||
*eecd_reg = *eecd_reg & ~IXGB_EECD_SK;
|
||||
IXGB_WRITE_REG(hw, EECD, *eecd_reg);
|
||||
IXGB_WRITE_FLUSH(hw);
|
||||
udelay(50);
|
||||
}
|
||||
|
||||
@ -112,6 +114,7 @@ ixgb_shift_out_bits(struct ixgb_hw *hw,
|
||||
eecd_reg |= IXGB_EECD_DI;
|
||||
|
||||
IXGB_WRITE_REG(hw, EECD, eecd_reg);
|
||||
IXGB_WRITE_FLUSH(hw);
|
||||
|
||||
udelay(50);
|
||||
|
||||
@ -206,21 +209,25 @@ ixgb_standby_eeprom(struct ixgb_hw *hw)
|
||||
/* Deselect EEPROM */
|
||||
eecd_reg &= ~(IXGB_EECD_CS | IXGB_EECD_SK);
|
||||
IXGB_WRITE_REG(hw, EECD, eecd_reg);
|
||||
IXGB_WRITE_FLUSH(hw);
|
||||
udelay(50);
|
||||
|
||||
/* Clock high */
|
||||
eecd_reg |= IXGB_EECD_SK;
|
||||
IXGB_WRITE_REG(hw, EECD, eecd_reg);
|
||||
IXGB_WRITE_FLUSH(hw);
|
||||
udelay(50);
|
||||
|
||||
/* Select EEPROM */
|
||||
eecd_reg |= IXGB_EECD_CS;
|
||||
IXGB_WRITE_REG(hw, EECD, eecd_reg);
|
||||
IXGB_WRITE_FLUSH(hw);
|
||||
udelay(50);
|
||||
|
||||
/* Clock low */
|
||||
eecd_reg &= ~IXGB_EECD_SK;
|
||||
IXGB_WRITE_REG(hw, EECD, eecd_reg);
|
||||
IXGB_WRITE_FLUSH(hw);
|
||||
udelay(50);
|
||||
}
|
||||
|
||||
@ -239,11 +246,13 @@ ixgb_clock_eeprom(struct ixgb_hw *hw)
|
||||
/* Rising edge of clock */
|
||||
eecd_reg |= IXGB_EECD_SK;
|
||||
IXGB_WRITE_REG(hw, EECD, eecd_reg);
|
||||
IXGB_WRITE_FLUSH(hw);
|
||||
udelay(50);
|
||||
|
||||
/* Falling edge of clock */
|
||||
eecd_reg &= ~IXGB_EECD_SK;
|
||||
IXGB_WRITE_REG(hw, EECD, eecd_reg);
|
||||
IXGB_WRITE_FLUSH(hw);
|
||||
udelay(50);
|
||||
}
|
||||
|
||||
|
@ -149,6 +149,7 @@ ixgb_adapter_stop(struct ixgb_hw *hw)
|
||||
*/
|
||||
IXGB_WRITE_REG(hw, RCTL, IXGB_READ_REG(hw, RCTL) & ~IXGB_RCTL_RXEN);
|
||||
IXGB_WRITE_REG(hw, TCTL, IXGB_READ_REG(hw, TCTL) & ~IXGB_TCTL_TXEN);
|
||||
IXGB_WRITE_FLUSH(hw);
|
||||
msleep(IXGB_DELAY_BEFORE_RESET);
|
||||
|
||||
/* Issue a global reset to the MAC. This will reset the chip's
|
||||
@ -1220,6 +1221,7 @@ ixgb_optics_reset_bcm(struct ixgb_hw *hw)
|
||||
ctrl &= ~IXGB_CTRL0_SDP2;
|
||||
ctrl |= IXGB_CTRL0_SDP3;
|
||||
IXGB_WRITE_REG(hw, CTRL0, ctrl);
|
||||
IXGB_WRITE_FLUSH(hw);
|
||||
|
||||
/* SerDes needs extra delay */
|
||||
msleep(IXGB_SUN_PHY_RESET_DELAY);
|
||||
|
@ -213,6 +213,7 @@ static s32 ixgbe_init_phy_ops_82599(struct ixgbe_hw *hw)
|
||||
switch (hw->phy.type) {
|
||||
case ixgbe_phy_tn:
|
||||
phy->ops.check_link = &ixgbe_check_phy_link_tnx;
|
||||
phy->ops.setup_link = &ixgbe_setup_phy_link_tnx;
|
||||
phy->ops.get_firmware_version =
|
||||
&ixgbe_get_phy_firmware_version_tnx;
|
||||
break;
|
||||
|
@ -2632,6 +2632,7 @@ s32 ixgbe_blink_led_start_generic(struct ixgbe_hw *hw, u32 index)
|
||||
autoc_reg |= IXGBE_AUTOC_AN_RESTART;
|
||||
autoc_reg |= IXGBE_AUTOC_FLU;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc_reg);
|
||||
IXGBE_WRITE_FLUSH(hw);
|
||||
usleep_range(10000, 20000);
|
||||
}
|
||||
|
||||
|
@ -1378,6 +1378,7 @@ static int ixgbe_intr_test(struct ixgbe_adapter *adapter, u64 *data)
|
||||
|
||||
/* Disable all the interrupts */
|
||||
IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, 0xFFFFFFFF);
|
||||
IXGBE_WRITE_FLUSH(&adapter->hw);
|
||||
usleep_range(10000, 20000);
|
||||
|
||||
/* Test each interrupt */
|
||||
@ -1398,6 +1399,7 @@ static int ixgbe_intr_test(struct ixgbe_adapter *adapter, u64 *data)
|
||||
~mask & 0x00007FFF);
|
||||
IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS,
|
||||
~mask & 0x00007FFF);
|
||||
IXGBE_WRITE_FLUSH(&adapter->hw);
|
||||
usleep_range(10000, 20000);
|
||||
|
||||
if (adapter->test_icr & mask) {
|
||||
@ -1415,6 +1417,7 @@ static int ixgbe_intr_test(struct ixgbe_adapter *adapter, u64 *data)
|
||||
adapter->test_icr = 0;
|
||||
IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, mask);
|
||||
IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS, mask);
|
||||
IXGBE_WRITE_FLUSH(&adapter->hw);
|
||||
usleep_range(10000, 20000);
|
||||
|
||||
if (!(adapter->test_icr &mask)) {
|
||||
@ -1435,6 +1438,7 @@ static int ixgbe_intr_test(struct ixgbe_adapter *adapter, u64 *data)
|
||||
~mask & 0x00007FFF);
|
||||
IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS,
|
||||
~mask & 0x00007FFF);
|
||||
IXGBE_WRITE_FLUSH(&adapter->hw);
|
||||
usleep_range(10000, 20000);
|
||||
|
||||
if (adapter->test_icr) {
|
||||
@ -1446,6 +1450,7 @@ static int ixgbe_intr_test(struct ixgbe_adapter *adapter, u64 *data)
|
||||
|
||||
/* Disable all the interrupts */
|
||||
IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, 0xFFFFFFFF);
|
||||
IXGBE_WRITE_FLUSH(&adapter->hw);
|
||||
usleep_range(10000, 20000);
|
||||
|
||||
/* Unhook test interrupt handler */
|
||||
|
@ -184,6 +184,7 @@ static inline void ixgbe_disable_sriov(struct ixgbe_adapter *adapter)
|
||||
vmdctl = IXGBE_READ_REG(hw, IXGBE_VT_CTL);
|
||||
vmdctl &= ~IXGBE_VT_CTL_POOL_MASK;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_VT_CTL, vmdctl);
|
||||
IXGBE_WRITE_FLUSH(hw);
|
||||
|
||||
/* take a breather then clean up driver data */
|
||||
msleep(100);
|
||||
@ -1005,7 +1006,7 @@ static int __ixgbe_notify_dca(struct device *dev, void *data)
|
||||
struct ixgbe_adapter *adapter = dev_get_drvdata(dev);
|
||||
unsigned long event = *(unsigned long *)data;
|
||||
|
||||
if (!(adapter->flags & IXGBE_FLAG_DCA_ENABLED))
|
||||
if (!(adapter->flags & IXGBE_FLAG_DCA_CAPABLE))
|
||||
return 0;
|
||||
|
||||
switch (event) {
|
||||
|
@ -1585,6 +1585,7 @@ static s32 ixgbe_raise_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl)
|
||||
*i2cctl |= IXGBE_I2C_CLK_OUT;
|
||||
|
||||
IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, *i2cctl);
|
||||
IXGBE_WRITE_FLUSH(hw);
|
||||
|
||||
/* SCL rise time (1000ns) */
|
||||
udelay(IXGBE_I2C_T_RISE);
|
||||
@ -1605,6 +1606,7 @@ static void ixgbe_lower_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl)
|
||||
*i2cctl &= ~IXGBE_I2C_CLK_OUT;
|
||||
|
||||
IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, *i2cctl);
|
||||
IXGBE_WRITE_FLUSH(hw);
|
||||
|
||||
/* SCL fall time (300ns) */
|
||||
udelay(IXGBE_I2C_T_FALL);
|
||||
@ -1628,6 +1630,7 @@ static s32 ixgbe_set_i2c_data(struct ixgbe_hw *hw, u32 *i2cctl, bool data)
|
||||
*i2cctl &= ~IXGBE_I2C_DATA_OUT;
|
||||
|
||||
IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, *i2cctl);
|
||||
IXGBE_WRITE_FLUSH(hw);
|
||||
|
||||
/* Data rise/fall (1000ns/300ns) and set-up time (250ns) */
|
||||
udelay(IXGBE_I2C_T_RISE + IXGBE_I2C_T_FALL + IXGBE_I2C_T_SU_DATA);
|
||||
|
@ -162,6 +162,7 @@ mac_reset_top:
|
||||
ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
|
||||
ctrl_ext |= IXGBE_CTRL_EXT_PFRSTD;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl_ext);
|
||||
IXGBE_WRITE_FLUSH(hw);
|
||||
|
||||
msleep(50);
|
||||
|
||||
|
@ -322,6 +322,9 @@ static void macb_tx(struct macb *bp)
|
||||
for (i = 0; i < TX_RING_SIZE; i++)
|
||||
bp->tx_ring[i].ctrl = MACB_BIT(TX_USED);
|
||||
|
||||
/* Add wrap bit */
|
||||
bp->tx_ring[TX_RING_SIZE - 1].ctrl |= MACB_BIT(TX_WRAP);
|
||||
|
||||
/* free transmit buffer in upper layer*/
|
||||
for (tail = bp->tx_tail; tail != head; tail = NEXT_TX(tail)) {
|
||||
struct ring_info *rp = &bp->tx_skb[tail];
|
||||
|
@ -128,7 +128,7 @@ int mlx4_SET_PORT_qpn_calc(struct mlx4_dev *dev, u8 port, u32 base_qpn,
|
||||
memset(context, 0, sizeof *context);
|
||||
|
||||
context->base_qpn = cpu_to_be32(base_qpn);
|
||||
context->n_mac = 0x7;
|
||||
context->n_mac = 0x2;
|
||||
context->promisc = cpu_to_be32(promisc << SET_PORT_PROMISC_SHIFT |
|
||||
base_qpn);
|
||||
context->mcast = cpu_to_be32(m_promisc << SET_PORT_MC_PROMISC_SHIFT |
|
||||
|
@ -1117,6 +1117,8 @@ static int mlx4_init_port_info(struct mlx4_dev *dev, int port)
|
||||
info->port = port;
|
||||
mlx4_init_mac_table(dev, &info->mac_table);
|
||||
mlx4_init_vlan_table(dev, &info->vlan_table);
|
||||
info->base_qpn = dev->caps.reserved_qps_base[MLX4_QP_REGION_ETH_ADDR] +
|
||||
(port - 1) * (1 << log_num_mac);
|
||||
|
||||
sprintf(info->dev_name, "mlx4_port%d", port);
|
||||
info->port_attr.attr.name = info->dev_name;
|
||||
|
@ -258,9 +258,12 @@ void mlx4_unregister_mac(struct mlx4_dev *dev, u8 port, int qpn)
|
||||
if (validate_index(dev, table, index))
|
||||
goto out;
|
||||
|
||||
table->entries[index] = 0;
|
||||
mlx4_set_port_mac_table(dev, port, table->entries);
|
||||
--table->total;
|
||||
/* Check whether this address has reference count */
|
||||
if (!(--table->refs[index])) {
|
||||
table->entries[index] = 0;
|
||||
mlx4_set_port_mac_table(dev, port, table->entries);
|
||||
--table->total;
|
||||
}
|
||||
out:
|
||||
mutex_unlock(&table->mutex);
|
||||
}
|
||||
|
@ -9201,7 +9201,7 @@ static int __devinit niu_ldg_init(struct niu *np)
|
||||
|
||||
first_chan = 0;
|
||||
for (i = 0; i < port; i++)
|
||||
first_chan += parent->rxchan_per_port[port];
|
||||
first_chan += parent->rxchan_per_port[i];
|
||||
num_chan = parent->rxchan_per_port[port];
|
||||
|
||||
for (i = first_chan; i < (first_chan + num_chan); i++) {
|
||||
@ -9217,7 +9217,7 @@ static int __devinit niu_ldg_init(struct niu *np)
|
||||
|
||||
first_chan = 0;
|
||||
for (i = 0; i < port; i++)
|
||||
first_chan += parent->txchan_per_port[port];
|
||||
first_chan += parent->txchan_per_port[i];
|
||||
num_chan = parent->txchan_per_port[port];
|
||||
for (i = first_chan; i < (first_chan + num_chan); i++) {
|
||||
err = niu_ldg_assign_ldn(np, parent,
|
||||
|
@ -239,6 +239,7 @@ static DEFINE_PCI_DEVICE_TABLE(rtl8169_pci_tbl) = {
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8168), 0, 0, RTL_CFG_1 },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8169), 0, 0, RTL_CFG_0 },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4300), 0, 0, RTL_CFG_0 },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4302), 0, 0, RTL_CFG_0 },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_AT, 0xc107), 0, 0, RTL_CFG_0 },
|
||||
{ PCI_DEVICE(0x16ec, 0x0116), 0, 0, RTL_CFG_0 },
|
||||
{ PCI_VENDOR_ID_LINKSYS, 0x1032,
|
||||
@ -1091,6 +1092,21 @@ rtl_w1w0_eri(void __iomem *ioaddr, int addr, u32 mask, u32 p, u32 m, int type)
|
||||
rtl_eri_write(ioaddr, addr, mask, (val & ~m) | p, type);
|
||||
}
|
||||
|
||||
struct exgmac_reg {
|
||||
u16 addr;
|
||||
u16 mask;
|
||||
u32 val;
|
||||
};
|
||||
|
||||
static void rtl_write_exgmac_batch(void __iomem *ioaddr,
|
||||
const struct exgmac_reg *r, int len)
|
||||
{
|
||||
while (len-- > 0) {
|
||||
rtl_eri_write(ioaddr, r->addr, r->mask, r->val, ERIAR_EXGMAC);
|
||||
r++;
|
||||
}
|
||||
}
|
||||
|
||||
static u8 rtl8168d_efuse_read(void __iomem *ioaddr, int reg_addr)
|
||||
{
|
||||
u8 value = 0xff;
|
||||
@ -3116,6 +3132,18 @@ static void rtl_rar_set(struct rtl8169_private *tp, u8 *addr)
|
||||
RTL_W32(MAC0, low);
|
||||
RTL_R32(MAC0);
|
||||
|
||||
if (tp->mac_version == RTL_GIGA_MAC_VER_34) {
|
||||
const struct exgmac_reg e[] = {
|
||||
{ .addr = 0xe0, ERIAR_MASK_1111, .val = low },
|
||||
{ .addr = 0xe4, ERIAR_MASK_1111, .val = high },
|
||||
{ .addr = 0xf0, ERIAR_MASK_1111, .val = low << 16 },
|
||||
{ .addr = 0xf4, ERIAR_MASK_1111, .val = high << 16 |
|
||||
low >> 16 },
|
||||
};
|
||||
|
||||
rtl_write_exgmac_batch(ioaddr, e, ARRAY_SIZE(e));
|
||||
}
|
||||
|
||||
RTL_W8(Cfg9346, Cfg9346_Lock);
|
||||
|
||||
spin_unlock_irq(&tp->lock);
|
||||
|
@ -1825,6 +1825,16 @@ static int sis190_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
||||
generic_mii_ioctl(&tp->mii_if, if_mii(ifr), cmd, NULL);
|
||||
}
|
||||
|
||||
static int sis190_mac_addr(struct net_device *dev, void *p)
|
||||
{
|
||||
int rc;
|
||||
|
||||
rc = eth_mac_addr(dev, p);
|
||||
if (!rc)
|
||||
sis190_init_rxfilter(dev);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static const struct net_device_ops sis190_netdev_ops = {
|
||||
.ndo_open = sis190_open,
|
||||
.ndo_stop = sis190_close,
|
||||
@ -1833,7 +1843,7 @@ static const struct net_device_ops sis190_netdev_ops = {
|
||||
.ndo_tx_timeout = sis190_tx_timeout,
|
||||
.ndo_set_multicast_list = sis190_set_rx_mode,
|
||||
.ndo_change_mtu = eth_change_mtu,
|
||||
.ndo_set_mac_address = eth_mac_addr,
|
||||
.ndo_set_mac_address = sis190_mac_addr,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
.ndo_poll_controller = sis190_netpoll,
|
||||
|
@ -53,7 +53,7 @@
|
||||
#include <linux/usb/usbnet.h>
|
||||
#include <linux/usb/cdc.h>
|
||||
|
||||
#define DRIVER_VERSION "01-June-2011"
|
||||
#define DRIVER_VERSION "04-Aug-2011"
|
||||
|
||||
/* CDC NCM subclass 3.2.1 */
|
||||
#define USB_CDC_NCM_NDP16_LENGTH_MIN 0x10
|
||||
@ -163,35 +163,8 @@ cdc_ncm_get_drvinfo(struct net_device *net, struct ethtool_drvinfo *info)
|
||||
usb_make_path(dev->udev, info->bus_info, sizeof(info->bus_info));
|
||||
}
|
||||
|
||||
static int
|
||||
cdc_ncm_do_request(struct cdc_ncm_ctx *ctx, struct usb_cdc_notification *req,
|
||||
void *data, u16 flags, u16 *actlen, u16 timeout)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = usb_control_msg(ctx->udev, (req->bmRequestType & USB_DIR_IN) ?
|
||||
usb_rcvctrlpipe(ctx->udev, 0) :
|
||||
usb_sndctrlpipe(ctx->udev, 0),
|
||||
req->bNotificationType, req->bmRequestType,
|
||||
req->wValue,
|
||||
req->wIndex, data,
|
||||
req->wLength, timeout);
|
||||
|
||||
if (err < 0) {
|
||||
if (actlen)
|
||||
*actlen = 0;
|
||||
return err;
|
||||
}
|
||||
|
||||
if (actlen)
|
||||
*actlen = err;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx)
|
||||
{
|
||||
struct usb_cdc_notification req;
|
||||
u32 val;
|
||||
u8 flags;
|
||||
u8 iface_no;
|
||||
@ -200,14 +173,14 @@ static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx)
|
||||
|
||||
iface_no = ctx->control->cur_altsetting->desc.bInterfaceNumber;
|
||||
|
||||
req.bmRequestType = USB_TYPE_CLASS | USB_DIR_IN | USB_RECIP_INTERFACE;
|
||||
req.bNotificationType = USB_CDC_GET_NTB_PARAMETERS;
|
||||
req.wValue = 0;
|
||||
req.wIndex = cpu_to_le16(iface_no);
|
||||
req.wLength = cpu_to_le16(sizeof(ctx->ncm_parm));
|
||||
|
||||
err = cdc_ncm_do_request(ctx, &req, &ctx->ncm_parm, 0, NULL, 1000);
|
||||
if (err) {
|
||||
err = usb_control_msg(ctx->udev,
|
||||
usb_rcvctrlpipe(ctx->udev, 0),
|
||||
USB_CDC_GET_NTB_PARAMETERS,
|
||||
USB_TYPE_CLASS | USB_DIR_IN
|
||||
| USB_RECIP_INTERFACE,
|
||||
0, iface_no, &ctx->ncm_parm,
|
||||
sizeof(ctx->ncm_parm), 10000);
|
||||
if (err < 0) {
|
||||
pr_debug("failed GET_NTB_PARAMETERS\n");
|
||||
return 1;
|
||||
}
|
||||
@ -253,31 +226,26 @@ static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx)
|
||||
|
||||
/* inform device about NTB input size changes */
|
||||
if (ctx->rx_max != le32_to_cpu(ctx->ncm_parm.dwNtbInMaxSize)) {
|
||||
req.bmRequestType = USB_TYPE_CLASS | USB_DIR_OUT |
|
||||
USB_RECIP_INTERFACE;
|
||||
req.bNotificationType = USB_CDC_SET_NTB_INPUT_SIZE;
|
||||
req.wValue = 0;
|
||||
req.wIndex = cpu_to_le16(iface_no);
|
||||
|
||||
if (flags & USB_CDC_NCM_NCAP_NTB_INPUT_SIZE) {
|
||||
struct usb_cdc_ncm_ndp_input_size ndp_in_sz;
|
||||
|
||||
req.wLength = 8;
|
||||
ndp_in_sz.dwNtbInMaxSize = cpu_to_le32(ctx->rx_max);
|
||||
ndp_in_sz.wNtbInMaxDatagrams =
|
||||
cpu_to_le16(CDC_NCM_DPT_DATAGRAMS_MAX);
|
||||
ndp_in_sz.wReserved = 0;
|
||||
err = cdc_ncm_do_request(ctx, &req, &ndp_in_sz, 0, NULL,
|
||||
1000);
|
||||
err = usb_control_msg(ctx->udev,
|
||||
usb_sndctrlpipe(ctx->udev, 0),
|
||||
USB_CDC_SET_NTB_INPUT_SIZE,
|
||||
USB_TYPE_CLASS | USB_DIR_OUT
|
||||
| USB_RECIP_INTERFACE,
|
||||
0, iface_no, &ndp_in_sz, 8, 1000);
|
||||
} else {
|
||||
__le32 dwNtbInMaxSize = cpu_to_le32(ctx->rx_max);
|
||||
|
||||
req.wLength = 4;
|
||||
err = cdc_ncm_do_request(ctx, &req, &dwNtbInMaxSize, 0,
|
||||
NULL, 1000);
|
||||
err = usb_control_msg(ctx->udev,
|
||||
usb_sndctrlpipe(ctx->udev, 0),
|
||||
USB_CDC_SET_NTB_INPUT_SIZE,
|
||||
USB_TYPE_CLASS | USB_DIR_OUT
|
||||
| USB_RECIP_INTERFACE,
|
||||
0, iface_no, &dwNtbInMaxSize, 4, 1000);
|
||||
}
|
||||
|
||||
if (err)
|
||||
if (err < 0)
|
||||
pr_debug("Setting NTB Input Size failed\n");
|
||||
}
|
||||
|
||||
@ -332,29 +300,24 @@ static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx)
|
||||
|
||||
/* set CRC Mode */
|
||||
if (flags & USB_CDC_NCM_NCAP_CRC_MODE) {
|
||||
req.bmRequestType = USB_TYPE_CLASS | USB_DIR_OUT |
|
||||
USB_RECIP_INTERFACE;
|
||||
req.bNotificationType = USB_CDC_SET_CRC_MODE;
|
||||
req.wValue = cpu_to_le16(USB_CDC_NCM_CRC_NOT_APPENDED);
|
||||
req.wIndex = cpu_to_le16(iface_no);
|
||||
req.wLength = 0;
|
||||
|
||||
err = cdc_ncm_do_request(ctx, &req, NULL, 0, NULL, 1000);
|
||||
if (err)
|
||||
err = usb_control_msg(ctx->udev, usb_sndctrlpipe(ctx->udev, 0),
|
||||
USB_CDC_SET_CRC_MODE,
|
||||
USB_TYPE_CLASS | USB_DIR_OUT
|
||||
| USB_RECIP_INTERFACE,
|
||||
USB_CDC_NCM_CRC_NOT_APPENDED,
|
||||
iface_no, NULL, 0, 1000);
|
||||
if (err < 0)
|
||||
pr_debug("Setting CRC mode off failed\n");
|
||||
}
|
||||
|
||||
/* set NTB format, if both formats are supported */
|
||||
if (ntb_fmt_supported & USB_CDC_NCM_NTH32_SIGN) {
|
||||
req.bmRequestType = USB_TYPE_CLASS | USB_DIR_OUT |
|
||||
USB_RECIP_INTERFACE;
|
||||
req.bNotificationType = USB_CDC_SET_NTB_FORMAT;
|
||||
req.wValue = cpu_to_le16(USB_CDC_NCM_NTB16_FORMAT);
|
||||
req.wIndex = cpu_to_le16(iface_no);
|
||||
req.wLength = 0;
|
||||
|
||||
err = cdc_ncm_do_request(ctx, &req, NULL, 0, NULL, 1000);
|
||||
if (err)
|
||||
err = usb_control_msg(ctx->udev, usb_sndctrlpipe(ctx->udev, 0),
|
||||
USB_CDC_SET_NTB_FORMAT, USB_TYPE_CLASS
|
||||
| USB_DIR_OUT | USB_RECIP_INTERFACE,
|
||||
USB_CDC_NCM_NTB16_FORMAT,
|
||||
iface_no, NULL, 0, 1000);
|
||||
if (err < 0)
|
||||
pr_debug("Setting NTB format to 16-bit failed\n");
|
||||
}
|
||||
|
||||
@ -364,17 +327,13 @@ static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx)
|
||||
if (flags & USB_CDC_NCM_NCAP_MAX_DATAGRAM_SIZE) {
|
||||
__le16 max_datagram_size;
|
||||
u16 eth_max_sz = le16_to_cpu(ctx->ether_desc->wMaxSegmentSize);
|
||||
|
||||
req.bmRequestType = USB_TYPE_CLASS | USB_DIR_IN |
|
||||
USB_RECIP_INTERFACE;
|
||||
req.bNotificationType = USB_CDC_GET_MAX_DATAGRAM_SIZE;
|
||||
req.wValue = 0;
|
||||
req.wIndex = cpu_to_le16(iface_no);
|
||||
req.wLength = cpu_to_le16(2);
|
||||
|
||||
err = cdc_ncm_do_request(ctx, &req, &max_datagram_size, 0, NULL,
|
||||
1000);
|
||||
if (err) {
|
||||
err = usb_control_msg(ctx->udev, usb_rcvctrlpipe(ctx->udev, 0),
|
||||
USB_CDC_GET_MAX_DATAGRAM_SIZE,
|
||||
USB_TYPE_CLASS | USB_DIR_IN
|
||||
| USB_RECIP_INTERFACE,
|
||||
0, iface_no, &max_datagram_size,
|
||||
2, 1000);
|
||||
if (err < 0) {
|
||||
pr_debug("GET_MAX_DATAGRAM_SIZE failed, use size=%u\n",
|
||||
CDC_NCM_MIN_DATAGRAM_SIZE);
|
||||
} else {
|
||||
@ -395,17 +354,15 @@ static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx)
|
||||
CDC_NCM_MIN_DATAGRAM_SIZE;
|
||||
|
||||
/* if value changed, update device */
|
||||
req.bmRequestType = USB_TYPE_CLASS | USB_DIR_OUT |
|
||||
USB_RECIP_INTERFACE;
|
||||
req.bNotificationType = USB_CDC_SET_MAX_DATAGRAM_SIZE;
|
||||
req.wValue = 0;
|
||||
req.wIndex = cpu_to_le16(iface_no);
|
||||
req.wLength = 2;
|
||||
max_datagram_size = cpu_to_le16(ctx->max_datagram_size);
|
||||
|
||||
err = cdc_ncm_do_request(ctx, &req, &max_datagram_size,
|
||||
0, NULL, 1000);
|
||||
if (err)
|
||||
err = usb_control_msg(ctx->udev,
|
||||
usb_sndctrlpipe(ctx->udev, 0),
|
||||
USB_CDC_SET_MAX_DATAGRAM_SIZE,
|
||||
USB_TYPE_CLASS | USB_DIR_OUT
|
||||
| USB_RECIP_INTERFACE,
|
||||
0,
|
||||
iface_no, &max_datagram_size,
|
||||
2, 1000);
|
||||
if (err < 0)
|
||||
pr_debug("SET_MAX_DATAGRAM_SIZE failed\n");
|
||||
}
|
||||
|
||||
@ -671,7 +628,7 @@ cdc_ncm_fill_tx_frame(struct cdc_ncm_ctx *ctx, struct sk_buff *skb)
|
||||
u32 rem;
|
||||
u32 offset;
|
||||
u32 last_offset;
|
||||
u16 n = 0;
|
||||
u16 n = 0, index;
|
||||
u8 ready2send = 0;
|
||||
|
||||
/* if there is a remaining skb, it gets priority */
|
||||
@ -859,8 +816,8 @@ cdc_ncm_fill_tx_frame(struct cdc_ncm_ctx *ctx, struct sk_buff *skb)
|
||||
cpu_to_le16(sizeof(ctx->tx_ncm.nth16));
|
||||
ctx->tx_ncm.nth16.wSequence = cpu_to_le16(ctx->tx_seq);
|
||||
ctx->tx_ncm.nth16.wBlockLength = cpu_to_le16(last_offset);
|
||||
ctx->tx_ncm.nth16.wNdpIndex = ALIGN(sizeof(struct usb_cdc_ncm_nth16),
|
||||
ctx->tx_ndp_modulus);
|
||||
index = ALIGN(sizeof(struct usb_cdc_ncm_nth16), ctx->tx_ndp_modulus);
|
||||
ctx->tx_ncm.nth16.wNdpIndex = cpu_to_le16(index);
|
||||
|
||||
memcpy(skb_out->data, &(ctx->tx_ncm.nth16), sizeof(ctx->tx_ncm.nth16));
|
||||
ctx->tx_seq++;
|
||||
@ -873,12 +830,11 @@ cdc_ncm_fill_tx_frame(struct cdc_ncm_ctx *ctx, struct sk_buff *skb)
|
||||
ctx->tx_ncm.ndp16.wLength = cpu_to_le16(rem);
|
||||
ctx->tx_ncm.ndp16.wNextNdpIndex = 0; /* reserved */
|
||||
|
||||
memcpy(((u8 *)skb_out->data) + ctx->tx_ncm.nth16.wNdpIndex,
|
||||
memcpy(((u8 *)skb_out->data) + index,
|
||||
&(ctx->tx_ncm.ndp16),
|
||||
sizeof(ctx->tx_ncm.ndp16));
|
||||
|
||||
memcpy(((u8 *)skb_out->data) + ctx->tx_ncm.nth16.wNdpIndex +
|
||||
sizeof(ctx->tx_ncm.ndp16),
|
||||
memcpy(((u8 *)skb_out->data) + index + sizeof(ctx->tx_ncm.ndp16),
|
||||
&(ctx->tx_ncm.dpe16),
|
||||
(ctx->tx_curr_frame_num + 1) *
|
||||
sizeof(struct usb_cdc_ncm_dpe16));
|
||||
|
@ -309,11 +309,7 @@ static void ar9002_hw_configpcipowersave(struct ath_hw *ah,
|
||||
u8 i;
|
||||
u32 val;
|
||||
|
||||
if (ah->is_pciexpress != true)
|
||||
return;
|
||||
|
||||
/* Do not touch SerDes registers */
|
||||
if (ah->config.pcie_powersave_enable == 2)
|
||||
if (ah->is_pciexpress != true || ah->aspm_enabled != true)
|
||||
return;
|
||||
|
||||
/* Nothing to do on restore for 11N */
|
||||
|
@ -519,11 +519,7 @@ static void ar9003_hw_configpcipowersave(struct ath_hw *ah,
|
||||
int restore,
|
||||
int power_off)
|
||||
{
|
||||
if (ah->is_pciexpress != true)
|
||||
return;
|
||||
|
||||
/* Do not touch SerDes registers */
|
||||
if (ah->config.pcie_powersave_enable == 2)
|
||||
if (ah->is_pciexpress != true || ah->aspm_enabled != true)
|
||||
return;
|
||||
|
||||
/* Nothing to do on restore for 11N */
|
||||
|
@ -318,6 +318,14 @@ static void ath9k_hw_disablepcie(struct ath_hw *ah)
|
||||
REG_WRITE(ah, AR_PCIE_SERDES2, 0x00000000);
|
||||
}
|
||||
|
||||
static void ath9k_hw_aspm_init(struct ath_hw *ah)
|
||||
{
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
|
||||
if (common->bus_ops->aspm_init)
|
||||
common->bus_ops->aspm_init(common);
|
||||
}
|
||||
|
||||
/* This should work for all families including legacy */
|
||||
static bool ath9k_hw_chip_test(struct ath_hw *ah)
|
||||
{
|
||||
@ -378,7 +386,6 @@ static void ath9k_hw_init_config(struct ath_hw *ah)
|
||||
ah->config.additional_swba_backoff = 0;
|
||||
ah->config.ack_6mb = 0x0;
|
||||
ah->config.cwm_ignore_extcca = 0;
|
||||
ah->config.pcie_powersave_enable = 0;
|
||||
ah->config.pcie_clock_req = 0;
|
||||
ah->config.pcie_waen = 0;
|
||||
ah->config.analog_shiftreg = 1;
|
||||
@ -598,7 +605,7 @@ static int __ath9k_hw_init(struct ath_hw *ah)
|
||||
|
||||
|
||||
if (ah->is_pciexpress)
|
||||
ath9k_hw_configpcipowersave(ah, 0, 0);
|
||||
ath9k_hw_aspm_init(ah);
|
||||
else
|
||||
ath9k_hw_disablepcie(ah);
|
||||
|
||||
|
@ -219,7 +219,6 @@ struct ath9k_ops_config {
|
||||
int additional_swba_backoff;
|
||||
int ack_6mb;
|
||||
u32 cwm_ignore_extcca;
|
||||
u8 pcie_powersave_enable;
|
||||
bool pcieSerDesWrite;
|
||||
u8 pcie_clock_req;
|
||||
u32 pcie_waen;
|
||||
@ -673,6 +672,7 @@ struct ath_hw {
|
||||
|
||||
bool sw_mgmt_crypto;
|
||||
bool is_pciexpress;
|
||||
bool aspm_enabled;
|
||||
bool is_monitoring;
|
||||
bool need_an_top2_fixup;
|
||||
u16 tx_trig_level;
|
||||
@ -874,6 +874,7 @@ struct ath_bus_ops {
|
||||
bool (*eeprom_read)(struct ath_common *common, u32 off, u16 *data);
|
||||
void (*bt_coex_prep)(struct ath_common *common);
|
||||
void (*extn_synch_en)(struct ath_common *common);
|
||||
void (*aspm_init)(struct ath_common *common);
|
||||
};
|
||||
|
||||
static inline struct ath_common *ath9k_hw_common(struct ath_hw *ah)
|
||||
|
@ -670,8 +670,10 @@ static void ath9k_init_band_txpower(struct ath_softc *sc, int band)
|
||||
static void ath9k_init_txpower_limits(struct ath_softc *sc)
|
||||
{
|
||||
struct ath_hw *ah = sc->sc_ah;
|
||||
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
||||
struct ath9k_channel *curchan = ah->curchan;
|
||||
|
||||
ah->txchainmask = common->tx_chainmask;
|
||||
if (ah->caps.hw_caps & ATH9K_HW_CAP_2GHZ)
|
||||
ath9k_init_band_txpower(sc, IEEE80211_BAND_2GHZ);
|
||||
if (ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ)
|
||||
|
@ -16,6 +16,7 @@
|
||||
|
||||
#include <linux/nl80211.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/pci-aspm.h>
|
||||
#include <linux/ath9k_platform.h>
|
||||
#include "ath9k.h"
|
||||
|
||||
@ -115,12 +116,38 @@ static void ath_pci_extn_synch_enable(struct ath_common *common)
|
||||
pci_write_config_byte(pdev, sc->sc_ah->caps.pcie_lcr_offset, lnkctl);
|
||||
}
|
||||
|
||||
static void ath_pci_aspm_init(struct ath_common *common)
|
||||
{
|
||||
struct ath_softc *sc = (struct ath_softc *) common->priv;
|
||||
struct ath_hw *ah = sc->sc_ah;
|
||||
struct pci_dev *pdev = to_pci_dev(sc->dev);
|
||||
struct pci_dev *parent;
|
||||
int pos;
|
||||
u8 aspm;
|
||||
|
||||
if (!pci_is_pcie(pdev))
|
||||
return;
|
||||
|
||||
parent = pdev->bus->self;
|
||||
if (WARN_ON(!parent))
|
||||
return;
|
||||
|
||||
pos = pci_pcie_cap(parent);
|
||||
pci_read_config_byte(parent, pos + PCI_EXP_LNKCTL, &aspm);
|
||||
if (aspm & (PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1)) {
|
||||
ah->aspm_enabled = true;
|
||||
/* Initialize PCIe PM and SERDES registers. */
|
||||
ath9k_hw_configpcipowersave(ah, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static const struct ath_bus_ops ath_pci_bus_ops = {
|
||||
.ath_bus_type = ATH_PCI,
|
||||
.read_cachesize = ath_pci_read_cachesize,
|
||||
.eeprom_read = ath_pci_eeprom_read,
|
||||
.bt_coex_prep = ath_pci_bt_coex_prep,
|
||||
.extn_synch_en = ath_pci_extn_synch_enable,
|
||||
.aspm_init = ath_pci_aspm_init,
|
||||
};
|
||||
|
||||
static int ath_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
|
@ -1746,7 +1746,11 @@ int iwl3945_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *ctx)
|
||||
}
|
||||
|
||||
memcpy(active_rxon, staging_rxon, sizeof(*active_rxon));
|
||||
|
||||
/*
|
||||
* We do not commit tx power settings while channel changing,
|
||||
* do it now if tx power changed.
|
||||
*/
|
||||
iwl_legacy_set_tx_power(priv, priv->tx_power_next, false);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1235,7 +1235,12 @@ static int iwl4965_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *c
|
||||
|
||||
memcpy(active_rxon, &ctx->staging, sizeof(*active_rxon));
|
||||
iwl_legacy_print_rx_config_cmd(priv, ctx);
|
||||
goto set_tx_power;
|
||||
/*
|
||||
* We do not commit tx power settings while channel changing,
|
||||
* do it now if tx power changed.
|
||||
*/
|
||||
iwl_legacy_set_tx_power(priv, priv->tx_power_next, false);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* If we are currently associated and the new config requires
|
||||
@ -1315,7 +1320,6 @@ static int iwl4965_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *c
|
||||
|
||||
iwl4965_init_sensitivity(priv);
|
||||
|
||||
set_tx_power:
|
||||
/* If we issue a new RXON command which required a tune then we must
|
||||
* send a new TXPOWER command or we won't be able to Tx any frames */
|
||||
ret = iwl_legacy_set_tx_power(priv, priv->tx_power_next, true);
|
||||
|
@ -365,6 +365,7 @@ static struct iwl_base_params iwl5000_base_params = {
|
||||
.chain_noise_scale = 1000,
|
||||
.wd_timeout = IWL_LONG_WD_TIMEOUT,
|
||||
.max_event_log_size = 512,
|
||||
.no_idle_support = true,
|
||||
};
|
||||
static struct iwl_ht_params iwl5000_ht_params = {
|
||||
.ht_greenfield_support = true,
|
||||
|
@ -135,6 +135,7 @@ struct iwl_mod_params {
|
||||
* @temperature_kelvin: temperature report by uCode in kelvin
|
||||
* @max_event_log_size: size of event log buffer size for ucode event logging
|
||||
* @shadow_reg_enable: HW shadhow register bit
|
||||
* @no_idle_support: do not support idle mode
|
||||
*/
|
||||
struct iwl_base_params {
|
||||
int eeprom_size;
|
||||
@ -156,6 +157,7 @@ struct iwl_base_params {
|
||||
bool temperature_kelvin;
|
||||
u32 max_event_log_size;
|
||||
const bool shadow_reg_enable;
|
||||
const bool no_idle_support;
|
||||
};
|
||||
/*
|
||||
* @advanced_bt_coexist: support advanced bt coexist
|
||||
|
@ -134,6 +134,7 @@ static void iwl_pci_apm_config(struct iwl_bus *bus)
|
||||
static void iwl_pci_set_drv_data(struct iwl_bus *bus, void *drv_data)
|
||||
{
|
||||
bus->drv_data = drv_data;
|
||||
pci_set_drvdata(IWL_BUS_GET_PCI_DEV(bus), drv_data);
|
||||
}
|
||||
|
||||
static void iwl_pci_get_hw_id(struct iwl_bus *bus, char buf[],
|
||||
@ -454,8 +455,6 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
pci_write_config_word(pdev, PCI_COMMAND, pci_cmd);
|
||||
}
|
||||
|
||||
pci_set_drvdata(pdev, bus);
|
||||
|
||||
bus->dev = &pdev->dev;
|
||||
bus->irq = pdev->irq;
|
||||
bus->ops = &pci_ops;
|
||||
@ -494,11 +493,12 @@ static void iwl_pci_down(struct iwl_bus *bus)
|
||||
|
||||
static void __devexit iwl_pci_remove(struct pci_dev *pdev)
|
||||
{
|
||||
struct iwl_bus *bus = pci_get_drvdata(pdev);
|
||||
struct iwl_priv *priv = pci_get_drvdata(pdev);
|
||||
void *bus_specific = priv->bus->bus_specific;
|
||||
|
||||
iwl_remove(bus->drv_data);
|
||||
iwl_remove(priv);
|
||||
|
||||
iwl_pci_down(bus);
|
||||
iwl_pci_down(bus_specific);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
@ -506,20 +506,20 @@ static void __devexit iwl_pci_remove(struct pci_dev *pdev)
|
||||
static int iwl_pci_suspend(struct device *device)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(device);
|
||||
struct iwl_bus *bus = pci_get_drvdata(pdev);
|
||||
struct iwl_priv *priv = pci_get_drvdata(pdev);
|
||||
|
||||
/* Before you put code here, think about WoWLAN. You cannot check here
|
||||
* whether WoWLAN is enabled or not, and your code will run even if
|
||||
* WoWLAN is enabled - don't kill the NIC, someone may need it in Sx.
|
||||
*/
|
||||
|
||||
return iwl_suspend(bus->drv_data);
|
||||
return iwl_suspend(priv);
|
||||
}
|
||||
|
||||
static int iwl_pci_resume(struct device *device)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(device);
|
||||
struct iwl_bus *bus = pci_get_drvdata(pdev);
|
||||
struct iwl_priv *priv = pci_get_drvdata(pdev);
|
||||
|
||||
/* Before you put code here, think about WoWLAN. You cannot check here
|
||||
* whether WoWLAN is enabled or not, and your code will run even if
|
||||
@ -532,7 +532,7 @@ static int iwl_pci_resume(struct device *device)
|
||||
*/
|
||||
pci_write_config_byte(pdev, PCI_CFG_RETRY_TIMEOUT, 0x00);
|
||||
|
||||
return iwl_resume(bus->drv_data);
|
||||
return iwl_resume(priv);
|
||||
}
|
||||
|
||||
static SIMPLE_DEV_PM_OPS(iwl_dev_pm_ops, iwl_pci_suspend, iwl_pci_resume);
|
||||
|
@ -349,7 +349,8 @@ static void iwl_power_build_cmd(struct iwl_priv *priv,
|
||||
|
||||
if (priv->wowlan)
|
||||
iwl_static_sleep_cmd(priv, cmd, IWL_POWER_INDEX_5, dtimper);
|
||||
else if (priv->hw->conf.flags & IEEE80211_CONF_IDLE)
|
||||
else if (!priv->cfg->base_params->no_idle_support &&
|
||||
priv->hw->conf.flags & IEEE80211_CONF_IDLE)
|
||||
iwl_static_sleep_cmd(priv, cmd, IWL_POWER_INDEX_5, 20);
|
||||
else if (iwl_tt_is_low_power_state(priv)) {
|
||||
/* in thermal throttling low power state */
|
||||
|
@ -703,8 +703,7 @@ void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc)
|
||||
/*
|
||||
* Add space for the TXWI in front of the skb.
|
||||
*/
|
||||
skb_push(entry->skb, TXWI_DESC_SIZE);
|
||||
memset(entry->skb, 0, TXWI_DESC_SIZE);
|
||||
memset(skb_push(entry->skb, TXWI_DESC_SIZE), 0, TXWI_DESC_SIZE);
|
||||
|
||||
/*
|
||||
* Register descriptor details in skb frame descriptor.
|
||||
|
@ -355,7 +355,8 @@ static inline enum cipher rt2x00crypto_key_to_cipher(struct ieee80211_key_conf *
|
||||
return CIPHER_NONE;
|
||||
}
|
||||
|
||||
static inline void rt2x00crypto_create_tx_descriptor(struct queue_entry *entry,
|
||||
static inline void rt2x00crypto_create_tx_descriptor(struct rt2x00_dev *rt2x00dev,
|
||||
struct sk_buff *skb,
|
||||
struct txentry_desc *txdesc)
|
||||
{
|
||||
}
|
||||
|
@ -113,7 +113,7 @@ void rt2x00mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
|
||||
* due to possible race conditions in mac80211.
|
||||
*/
|
||||
if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags))
|
||||
goto exit_fail;
|
||||
goto exit_free_skb;
|
||||
|
||||
/*
|
||||
* Use the ATIM queue if appropriate and present.
|
||||
@ -127,7 +127,7 @@ void rt2x00mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
|
||||
ERROR(rt2x00dev,
|
||||
"Attempt to send packet over invalid queue %d.\n"
|
||||
"Please file bug report to %s.\n", qid, DRV_PROJECT);
|
||||
goto exit_fail;
|
||||
goto exit_free_skb;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -159,6 +159,7 @@ void rt2x00mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
|
||||
|
||||
exit_fail:
|
||||
rt2x00queue_pause_queue(queue);
|
||||
exit_free_skb:
|
||||
dev_kfree_skb_any(skb);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2x00mac_tx);
|
||||
|
@ -1696,15 +1696,17 @@ static bool _rtl_pci_find_adapter(struct pci_dev *pdev,
|
||||
pcipriv->ndis_adapter.devnumber = PCI_SLOT(pdev->devfn);
|
||||
pcipriv->ndis_adapter.funcnumber = PCI_FUNC(pdev->devfn);
|
||||
|
||||
/*find bridge info */
|
||||
pcipriv->ndis_adapter.pcibridge_vendorid = bridge_pdev->vendor;
|
||||
for (tmp = 0; tmp < PCI_BRIDGE_VENDOR_MAX; tmp++) {
|
||||
if (bridge_pdev->vendor == pcibridge_vendors[tmp]) {
|
||||
pcipriv->ndis_adapter.pcibridge_vendor = tmp;
|
||||
RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
|
||||
("Pci Bridge Vendor is found index: %d\n",
|
||||
tmp));
|
||||
break;
|
||||
if (bridge_pdev) {
|
||||
/*find bridge info if available */
|
||||
pcipriv->ndis_adapter.pcibridge_vendorid = bridge_pdev->vendor;
|
||||
for (tmp = 0; tmp < PCI_BRIDGE_VENDOR_MAX; tmp++) {
|
||||
if (bridge_pdev->vendor == pcibridge_vendors[tmp]) {
|
||||
pcipriv->ndis_adapter.pcibridge_vendor = tmp;
|
||||
RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
|
||||
("Pci Bridge Vendor is found index:"
|
||||
" %d\n", tmp));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
* have chosen to adopt the protocol and over the years it has become a
|
||||
* de-facto standard for labeled networking.
|
||||
*
|
||||
* Author: Paul Moore <paul.moore@hp.com>
|
||||
* Author: Paul Moore <paul@paul-moore.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -37,7 +37,7 @@ struct dst_entry {
|
||||
unsigned long _metrics;
|
||||
unsigned long expires;
|
||||
struct dst_entry *path;
|
||||
struct neighbour *_neighbour;
|
||||
struct neighbour __rcu *_neighbour;
|
||||
#ifdef CONFIG_XFRM
|
||||
struct xfrm_state *xfrm;
|
||||
#else
|
||||
@ -88,12 +88,17 @@ struct dst_entry {
|
||||
|
||||
static inline struct neighbour *dst_get_neighbour(struct dst_entry *dst)
|
||||
{
|
||||
return dst->_neighbour;
|
||||
return rcu_dereference(dst->_neighbour);
|
||||
}
|
||||
|
||||
static inline struct neighbour *dst_get_neighbour_raw(struct dst_entry *dst)
|
||||
{
|
||||
return rcu_dereference_raw(dst->_neighbour);
|
||||
}
|
||||
|
||||
static inline void dst_set_neighbour(struct dst_entry *dst, struct neighbour *neigh)
|
||||
{
|
||||
dst->_neighbour = neigh;
|
||||
rcu_assign_pointer(dst->_neighbour, neigh);
|
||||
}
|
||||
|
||||
extern u32 *dst_cow_metrics_generic(struct dst_entry *dst, unsigned long old);
|
||||
@ -382,8 +387,12 @@ static inline void dst_rcu_free(struct rcu_head *head)
|
||||
static inline void dst_confirm(struct dst_entry *dst)
|
||||
{
|
||||
if (dst) {
|
||||
struct neighbour *n = dst_get_neighbour(dst);
|
||||
struct neighbour *n;
|
||||
|
||||
rcu_read_lock();
|
||||
n = dst_get_neighbour(dst);
|
||||
neigh_confirm(n);
|
||||
rcu_read_unlock();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
* The NetLabel system manages static and dynamic label mappings for network
|
||||
* protocols such as CIPSO and RIPSO.
|
||||
*
|
||||
* Author: Paul Moore <paul.moore@hp.com>
|
||||
* Author: Paul Moore <paul@paul-moore.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -242,8 +242,6 @@ static int br2684_xmit_vcc(struct sk_buff *skb, struct net_device *dev,
|
||||
if (brdev->payload == p_bridged) {
|
||||
skb_push(skb, 2);
|
||||
memset(skb->data, 0, 2);
|
||||
} else { /* p_routed */
|
||||
skb_pull(skb, ETH_HLEN);
|
||||
}
|
||||
}
|
||||
skb_debug(skb);
|
||||
|
@ -1369,8 +1369,21 @@ pull_pages:
|
||||
}
|
||||
EXPORT_SYMBOL(__pskb_pull_tail);
|
||||
|
||||
/* Copy some data bits from skb to kernel buffer. */
|
||||
|
||||
/**
|
||||
* skb_copy_bits - copy bits from skb to kernel buffer
|
||||
* @skb: source skb
|
||||
* @offset: offset in source
|
||||
* @to: destination buffer
|
||||
* @len: number of bytes to copy
|
||||
*
|
||||
* Copy the specified number of bytes from the source skb to the
|
||||
* destination buffer.
|
||||
*
|
||||
* CAUTION ! :
|
||||
* If its prototype is ever changed,
|
||||
* check arch/{*}/net/{*}.S files,
|
||||
* since it is called from BPF assembly code.
|
||||
*/
|
||||
int skb_copy_bits(const struct sk_buff *skb, int offset, void *to, int len)
|
||||
{
|
||||
int start = skb_headlen(skb);
|
||||
|
@ -1718,7 +1718,7 @@ static int ip_mc_add_src(struct in_device *in_dev, __be32 *pmca, int sfmode,
|
||||
|
||||
pmc->sfcount[sfmode]--;
|
||||
for (j=0; j<i; j++)
|
||||
(void) ip_mc_del1_src(pmc, sfmode, &psfsrc[i]);
|
||||
(void) ip_mc_del1_src(pmc, sfmode, &psfsrc[j]);
|
||||
} else if (isexclude != (pmc->sfcount[MCAST_EXCLUDE] != 0)) {
|
||||
#ifdef CONFIG_IP_MULTICAST
|
||||
struct ip_sf_list *psf;
|
||||
|
@ -204,9 +204,15 @@ static inline int ip_finish_output2(struct sk_buff *skb)
|
||||
skb = skb2;
|
||||
}
|
||||
|
||||
rcu_read_lock();
|
||||
neigh = dst_get_neighbour(dst);
|
||||
if (neigh)
|
||||
return neigh_output(neigh, skb);
|
||||
if (neigh) {
|
||||
int res = neigh_output(neigh, skb);
|
||||
|
||||
rcu_read_unlock();
|
||||
return res;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
if (net_ratelimit())
|
||||
printk(KERN_DEBUG "ip_finish_output2: No header cache and no neighbour!\n");
|
||||
|
@ -1628,16 +1628,18 @@ static int check_peer_redir(struct dst_entry *dst, struct inet_peer *peer)
|
||||
{
|
||||
struct rtable *rt = (struct rtable *) dst;
|
||||
__be32 orig_gw = rt->rt_gateway;
|
||||
struct neighbour *n;
|
||||
struct neighbour *n, *old_n;
|
||||
|
||||
dst_confirm(&rt->dst);
|
||||
|
||||
neigh_release(dst_get_neighbour(&rt->dst));
|
||||
dst_set_neighbour(&rt->dst, NULL);
|
||||
|
||||
rt->rt_gateway = peer->redirect_learned.a4;
|
||||
rt_bind_neighbour(rt);
|
||||
n = dst_get_neighbour(&rt->dst);
|
||||
|
||||
n = ipv4_neigh_lookup(&rt->dst, &rt->rt_gateway);
|
||||
if (IS_ERR(n))
|
||||
return PTR_ERR(n);
|
||||
old_n = xchg(&rt->dst._neighbour, n);
|
||||
if (old_n)
|
||||
neigh_release(old_n);
|
||||
if (!n || !(n->nud_state & NUD_VALID)) {
|
||||
if (n)
|
||||
neigh_event_send(n, NULL);
|
||||
|
@ -656,7 +656,7 @@ ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, int pfxlen,
|
||||
* layer address of our nexhop router
|
||||
*/
|
||||
|
||||
if (dst_get_neighbour(&rt->dst) == NULL)
|
||||
if (dst_get_neighbour_raw(&rt->dst) == NULL)
|
||||
ifa->flags &= ~IFA_F_OPTIMISTIC;
|
||||
|
||||
ifa->idev = idev;
|
||||
|
@ -33,6 +33,11 @@
|
||||
#include <linux/errqueue.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
static inline int ipv6_mapped_addr_any(const struct in6_addr *a)
|
||||
{
|
||||
return (ipv6_addr_v4mapped(a) && (a->s6_addr32[3] == 0));
|
||||
}
|
||||
|
||||
int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
|
||||
{
|
||||
struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr;
|
||||
@ -102,10 +107,12 @@ ipv4_connected:
|
||||
|
||||
ipv6_addr_set_v4mapped(inet->inet_daddr, &np->daddr);
|
||||
|
||||
if (ipv6_addr_any(&np->saddr))
|
||||
if (ipv6_addr_any(&np->saddr) ||
|
||||
ipv6_mapped_addr_any(&np->saddr))
|
||||
ipv6_addr_set_v4mapped(inet->inet_saddr, &np->saddr);
|
||||
|
||||
if (ipv6_addr_any(&np->rcv_saddr)) {
|
||||
if (ipv6_addr_any(&np->rcv_saddr) ||
|
||||
ipv6_mapped_addr_any(&np->rcv_saddr)) {
|
||||
ipv6_addr_set_v4mapped(inet->inet_rcv_saddr,
|
||||
&np->rcv_saddr);
|
||||
if (sk->sk_prot->rehash)
|
||||
|
@ -1455,7 +1455,7 @@ static int fib6_age(struct rt6_info *rt, void *arg)
|
||||
RT6_TRACE("aging clone %p\n", rt);
|
||||
return -1;
|
||||
} else if ((rt->rt6i_flags & RTF_GATEWAY) &&
|
||||
(!(dst_get_neighbour(&rt->dst)->flags & NTF_ROUTER))) {
|
||||
(!(dst_get_neighbour_raw(&rt->dst)->flags & NTF_ROUTER))) {
|
||||
RT6_TRACE("purging route %p via non-router but gateway\n",
|
||||
rt);
|
||||
return -1;
|
||||
|
@ -135,10 +135,15 @@ static int ip6_finish_output2(struct sk_buff *skb)
|
||||
skb->len);
|
||||
}
|
||||
|
||||
rcu_read_lock();
|
||||
neigh = dst_get_neighbour(dst);
|
||||
if (neigh)
|
||||
return neigh_output(neigh, skb);
|
||||
if (neigh) {
|
||||
int res = neigh_output(neigh, skb);
|
||||
|
||||
rcu_read_unlock();
|
||||
return res;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
IP6_INC_STATS_BH(dev_net(dst->dev),
|
||||
ip6_dst_idev(dst), IPSTATS_MIB_OUTNOROUTES);
|
||||
kfree_skb(skb);
|
||||
@ -975,12 +980,14 @@ static int ip6_dst_lookup_tail(struct sock *sk,
|
||||
* dst entry and replace it instead with the
|
||||
* dst entry of the nexthop router
|
||||
*/
|
||||
rcu_read_lock();
|
||||
n = dst_get_neighbour(*dst);
|
||||
if (n && !(n->nud_state & NUD_VALID)) {
|
||||
struct inet6_ifaddr *ifp;
|
||||
struct flowi6 fl_gw6;
|
||||
int redirect;
|
||||
|
||||
rcu_read_unlock();
|
||||
ifp = ipv6_get_ifaddr(net, &fl6->saddr,
|
||||
(*dst)->dev, 1);
|
||||
|
||||
@ -1000,6 +1007,8 @@ static int ip6_dst_lookup_tail(struct sock *sk,
|
||||
if ((err = (*dst)->error))
|
||||
goto out_err_release;
|
||||
}
|
||||
} else {
|
||||
rcu_read_unlock();
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -364,7 +364,7 @@ out:
|
||||
#ifdef CONFIG_IPV6_ROUTER_PREF
|
||||
static void rt6_probe(struct rt6_info *rt)
|
||||
{
|
||||
struct neighbour *neigh = rt ? dst_get_neighbour(&rt->dst) : NULL;
|
||||
struct neighbour *neigh;
|
||||
/*
|
||||
* Okay, this does not seem to be appropriate
|
||||
* for now, however, we need to check if it
|
||||
@ -373,8 +373,10 @@ static void rt6_probe(struct rt6_info *rt)
|
||||
* Router Reachability Probe MUST be rate-limited
|
||||
* to no more than one per minute.
|
||||
*/
|
||||
rcu_read_lock();
|
||||
neigh = rt ? dst_get_neighbour(&rt->dst) : NULL;
|
||||
if (!neigh || (neigh->nud_state & NUD_VALID))
|
||||
return;
|
||||
goto out;
|
||||
read_lock_bh(&neigh->lock);
|
||||
if (!(neigh->nud_state & NUD_VALID) &&
|
||||
time_after(jiffies, neigh->updated + rt->rt6i_idev->cnf.rtr_probe_interval)) {
|
||||
@ -387,8 +389,11 @@ static void rt6_probe(struct rt6_info *rt)
|
||||
target = (struct in6_addr *)&neigh->primary_key;
|
||||
addrconf_addr_solict_mult(target, &mcaddr);
|
||||
ndisc_send_ns(rt->rt6i_dev, NULL, target, &mcaddr, NULL);
|
||||
} else
|
||||
} else {
|
||||
read_unlock_bh(&neigh->lock);
|
||||
}
|
||||
out:
|
||||
rcu_read_unlock();
|
||||
}
|
||||
#else
|
||||
static inline void rt6_probe(struct rt6_info *rt)
|
||||
@ -412,8 +417,11 @@ static inline int rt6_check_dev(struct rt6_info *rt, int oif)
|
||||
|
||||
static inline int rt6_check_neigh(struct rt6_info *rt)
|
||||
{
|
||||
struct neighbour *neigh = dst_get_neighbour(&rt->dst);
|
||||
struct neighbour *neigh;
|
||||
int m;
|
||||
|
||||
rcu_read_lock();
|
||||
neigh = dst_get_neighbour(&rt->dst);
|
||||
if (rt->rt6i_flags & RTF_NONEXTHOP ||
|
||||
!(rt->rt6i_flags & RTF_GATEWAY))
|
||||
m = 1;
|
||||
@ -430,6 +438,7 @@ static inline int rt6_check_neigh(struct rt6_info *rt)
|
||||
read_unlock_bh(&neigh->lock);
|
||||
} else
|
||||
m = 0;
|
||||
rcu_read_unlock();
|
||||
return m;
|
||||
}
|
||||
|
||||
@ -769,7 +778,7 @@ static struct rt6_info *rt6_alloc_clone(struct rt6_info *ort,
|
||||
rt->rt6i_dst.plen = 128;
|
||||
rt->rt6i_flags |= RTF_CACHE;
|
||||
rt->dst.flags |= DST_HOST;
|
||||
dst_set_neighbour(&rt->dst, neigh_clone(dst_get_neighbour(&ort->dst)));
|
||||
dst_set_neighbour(&rt->dst, neigh_clone(dst_get_neighbour_raw(&ort->dst)));
|
||||
}
|
||||
return rt;
|
||||
}
|
||||
@ -803,7 +812,7 @@ restart:
|
||||
dst_hold(&rt->dst);
|
||||
read_unlock_bh(&table->tb6_lock);
|
||||
|
||||
if (!dst_get_neighbour(&rt->dst) && !(rt->rt6i_flags & RTF_NONEXTHOP))
|
||||
if (!dst_get_neighbour_raw(&rt->dst) && !(rt->rt6i_flags & RTF_NONEXTHOP))
|
||||
nrt = rt6_alloc_cow(rt, &fl6->daddr, &fl6->saddr);
|
||||
else if (!(rt->dst.flags & DST_HOST))
|
||||
nrt = rt6_alloc_clone(rt, &fl6->daddr);
|
||||
@ -1587,7 +1596,7 @@ void rt6_redirect(const struct in6_addr *dest, const struct in6_addr *src,
|
||||
dst_confirm(&rt->dst);
|
||||
|
||||
/* Duplicate redirect: silently ignore. */
|
||||
if (neigh == dst_get_neighbour(&rt->dst))
|
||||
if (neigh == dst_get_neighbour_raw(&rt->dst))
|
||||
goto out;
|
||||
|
||||
nrt = ip6_rt_copy(rt, dest);
|
||||
@ -1682,7 +1691,7 @@ again:
|
||||
1. It is connected route. Action: COW
|
||||
2. It is gatewayed route or NONEXTHOP route. Action: clone it.
|
||||
*/
|
||||
if (!dst_get_neighbour(&rt->dst) && !(rt->rt6i_flags & RTF_NONEXTHOP))
|
||||
if (!dst_get_neighbour_raw(&rt->dst) && !(rt->rt6i_flags & RTF_NONEXTHOP))
|
||||
nrt = rt6_alloc_cow(rt, daddr, saddr);
|
||||
else
|
||||
nrt = rt6_alloc_clone(rt, daddr);
|
||||
@ -2326,6 +2335,7 @@ static int rt6_fill_node(struct net *net,
|
||||
struct nlmsghdr *nlh;
|
||||
long expires;
|
||||
u32 table;
|
||||
struct neighbour *n;
|
||||
|
||||
if (prefix) { /* user wants prefix routes only */
|
||||
if (!(rt->rt6i_flags & RTF_PREFIX_RT)) {
|
||||
@ -2414,8 +2424,11 @@ static int rt6_fill_node(struct net *net,
|
||||
if (rtnetlink_put_metrics(skb, dst_metrics_ptr(&rt->dst)) < 0)
|
||||
goto nla_put_failure;
|
||||
|
||||
if (dst_get_neighbour(&rt->dst))
|
||||
NLA_PUT(skb, RTA_GATEWAY, 16, &dst_get_neighbour(&rt->dst)->primary_key);
|
||||
rcu_read_lock();
|
||||
n = dst_get_neighbour(&rt->dst);
|
||||
if (n)
|
||||
NLA_PUT(skb, RTA_GATEWAY, 16, &n->primary_key);
|
||||
rcu_read_unlock();
|
||||
|
||||
if (rt->dst.dev)
|
||||
NLA_PUT_U32(skb, RTA_OIF, rt->rt6i_dev->ifindex);
|
||||
@ -2608,12 +2621,14 @@ static int rt6_info_route(struct rt6_info *rt, void *p_arg)
|
||||
#else
|
||||
seq_puts(m, "00000000000000000000000000000000 00 ");
|
||||
#endif
|
||||
rcu_read_lock();
|
||||
n = dst_get_neighbour(&rt->dst);
|
||||
if (n) {
|
||||
seq_printf(m, "%pi6", n->primary_key);
|
||||
} else {
|
||||
seq_puts(m, "00000000000000000000000000000000");
|
||||
}
|
||||
rcu_read_unlock();
|
||||
seq_printf(m, " %08x %08x %08x %08x %8s\n",
|
||||
rt->rt6i_metric, atomic_read(&rt->dst.__refcnt),
|
||||
rt->dst.__use, rt->rt6i_flags,
|
||||
|
@ -3771,6 +3771,7 @@ err_sock:
|
||||
void ip_vs_control_cleanup(void)
|
||||
{
|
||||
EnterFunction(2);
|
||||
unregister_netdevice_notifier(&ip_vs_dst_notifier);
|
||||
ip_vs_genl_unregister();
|
||||
nf_unregister_sockopt(&ip_vs_sockopts);
|
||||
LeaveFunction(2);
|
||||
|
@ -1,8 +1,6 @@
|
||||
#
|
||||
# Makefile for the NetLabel subsystem.
|
||||
#
|
||||
# Feb 9, 2006, Paul Moore <paul.moore@hp.com>
|
||||
#
|
||||
|
||||
# base objects
|
||||
obj-y := netlabel_user.o netlabel_kapi.o
|
||||
|
@ -6,7 +6,7 @@
|
||||
* system manages static and dynamic label mappings for network protocols such
|
||||
* as CIPSO and RIPSO.
|
||||
*
|
||||
* Author: Paul Moore <paul.moore@hp.com>
|
||||
* Author: Paul Moore <paul@paul-moore.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
* system manages static and dynamic label mappings for network protocols such
|
||||
* as CIPSO and RIPSO.
|
||||
*
|
||||
* Author: Paul Moore <paul.moore@hp.com>
|
||||
* Author: Paul Moore <paul@paul-moore.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
* NetLabel system manages static and dynamic label mappings for network
|
||||
* protocols such as CIPSO and RIPSO.
|
||||
*
|
||||
* Author: Paul Moore <paul.moore@hp.com>
|
||||
* Author: Paul Moore <paul@paul-moore.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
* NetLabel system manages static and dynamic label mappings for network
|
||||
* protocols such as CIPSO and RIPSO.
|
||||
*
|
||||
* Author: Paul Moore <paul.moore@hp.com>
|
||||
* Author: Paul Moore <paul@paul-moore.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
* system manages static and dynamic label mappings for network protocols such
|
||||
* as CIPSO and RIPSO.
|
||||
*
|
||||
* Author: Paul Moore <paul.moore@hp.com>
|
||||
* Author: Paul Moore <paul@paul-moore.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
* system manages static and dynamic label mappings for network protocols such
|
||||
* as CIPSO and RIPSO.
|
||||
*
|
||||
* Author: Paul Moore <paul.moore@hp.com>
|
||||
* Author: Paul Moore <paul@paul-moore.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
* system manages static and dynamic label mappings for network protocols such
|
||||
* as CIPSO and RIPSO.
|
||||
*
|
||||
* Author: Paul Moore <paul.moore@hp.com>
|
||||
* Author: Paul Moore <paul@paul-moore.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
* NetLabel system manages static and dynamic label mappings for network
|
||||
* protocols such as CIPSO and RIPSO.
|
||||
*
|
||||
* Author: Paul Moore <paul.moore@hp.com>
|
||||
* Author: Paul Moore <paul@paul-moore.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
* NetLabel system manages static and dynamic label mappings for network
|
||||
* protocols such as CIPSO and RIPSO.
|
||||
*
|
||||
* Author: Paul Moore <paul.moore@hp.com>
|
||||
* Author: Paul Moore <paul@paul-moore.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
* NetLabel system. The NetLabel system manages static and dynamic label
|
||||
* mappings for network protocols such as CIPSO and RIPSO.
|
||||
*
|
||||
* Author: Paul Moore <paul.moore@hp.com>
|
||||
* Author: Paul Moore <paul@paul-moore.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
* NetLabel system. The NetLabel system manages static and dynamic label
|
||||
* mappings for network protocols such as CIPSO and RIPSO.
|
||||
*
|
||||
* Author: Paul Moore <paul.moore@hp.com>
|
||||
* Author: Paul Moore <paul@paul-moore.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
* NetLabel system manages static and dynamic label mappings for network
|
||||
* protocols such as CIPSO and RIPSO.
|
||||
*
|
||||
* Author: Paul Moore <paul.moore@hp.com>
|
||||
* Author: Paul Moore <paul@paul-moore.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
* NetLabel system manages static and dynamic label mappings for network
|
||||
* protocols such as CIPSO and RIPSO.
|
||||
*
|
||||
* Author: Paul Moore <paul.moore@hp.com>
|
||||
* Author: Paul Moore <paul@paul-moore.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -410,7 +410,12 @@ sfq_enqueue(struct sk_buff *skb, struct Qdisc *sch)
|
||||
/* Return Congestion Notification only if we dropped a packet
|
||||
* from this flow.
|
||||
*/
|
||||
return (qlen != slot->qlen) ? NET_XMIT_CN : NET_XMIT_SUCCESS;
|
||||
if (qlen != slot->qlen)
|
||||
return NET_XMIT_CN;
|
||||
|
||||
/* As we dropped a packet, better let upper stack know this */
|
||||
qdisc_tree_decrease_qlen(sch, 1);
|
||||
return NET_XMIT_SUCCESS;
|
||||
}
|
||||
|
||||
static struct sk_buff *
|
||||
|
73
net/socket.c
73
net/socket.c
@ -1871,8 +1871,14 @@ SYSCALL_DEFINE2(shutdown, int, fd, int, how)
|
||||
#define COMPAT_NAMELEN(msg) COMPAT_MSG(msg, msg_namelen)
|
||||
#define COMPAT_FLAGS(msg) COMPAT_MSG(msg, msg_flags)
|
||||
|
||||
struct used_address {
|
||||
struct sockaddr_storage name;
|
||||
unsigned int name_len;
|
||||
};
|
||||
|
||||
static int __sys_sendmsg(struct socket *sock, struct msghdr __user *msg,
|
||||
struct msghdr *msg_sys, unsigned flags, int nosec)
|
||||
struct msghdr *msg_sys, unsigned flags,
|
||||
struct used_address *used_address)
|
||||
{
|
||||
struct compat_msghdr __user *msg_compat =
|
||||
(struct compat_msghdr __user *)msg;
|
||||
@ -1953,8 +1959,28 @@ static int __sys_sendmsg(struct socket *sock, struct msghdr __user *msg,
|
||||
|
||||
if (sock->file->f_flags & O_NONBLOCK)
|
||||
msg_sys->msg_flags |= MSG_DONTWAIT;
|
||||
err = (nosec ? sock_sendmsg_nosec : sock_sendmsg)(sock, msg_sys,
|
||||
total_len);
|
||||
/*
|
||||
* If this is sendmmsg() and current destination address is same as
|
||||
* previously succeeded address, omit asking LSM's decision.
|
||||
* used_address->name_len is initialized to UINT_MAX so that the first
|
||||
* destination address never matches.
|
||||
*/
|
||||
if (used_address && used_address->name_len == msg_sys->msg_namelen &&
|
||||
!memcmp(&used_address->name, msg->msg_name,
|
||||
used_address->name_len)) {
|
||||
err = sock_sendmsg_nosec(sock, msg_sys, total_len);
|
||||
goto out_freectl;
|
||||
}
|
||||
err = sock_sendmsg(sock, msg_sys, total_len);
|
||||
/*
|
||||
* If this is sendmmsg() and sending to current destination address was
|
||||
* successful, remember it.
|
||||
*/
|
||||
if (used_address && err >= 0) {
|
||||
used_address->name_len = msg_sys->msg_namelen;
|
||||
memcpy(&used_address->name, msg->msg_name,
|
||||
used_address->name_len);
|
||||
}
|
||||
|
||||
out_freectl:
|
||||
if (ctl_buf != ctl)
|
||||
@ -1979,7 +2005,7 @@ SYSCALL_DEFINE3(sendmsg, int, fd, struct msghdr __user *, msg, unsigned, flags)
|
||||
if (!sock)
|
||||
goto out;
|
||||
|
||||
err = __sys_sendmsg(sock, msg, &msg_sys, flags, 0);
|
||||
err = __sys_sendmsg(sock, msg, &msg_sys, flags, NULL);
|
||||
|
||||
fput_light(sock->file, fput_needed);
|
||||
out:
|
||||
@ -1998,6 +2024,10 @@ int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,
|
||||
struct mmsghdr __user *entry;
|
||||
struct compat_mmsghdr __user *compat_entry;
|
||||
struct msghdr msg_sys;
|
||||
struct used_address used_address;
|
||||
|
||||
if (vlen > UIO_MAXIOV)
|
||||
vlen = UIO_MAXIOV;
|
||||
|
||||
datagrams = 0;
|
||||
|
||||
@ -2005,27 +2035,22 @@ int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,
|
||||
if (!sock)
|
||||
return err;
|
||||
|
||||
err = sock_error(sock->sk);
|
||||
if (err)
|
||||
goto out_put;
|
||||
|
||||
used_address.name_len = UINT_MAX;
|
||||
entry = mmsg;
|
||||
compat_entry = (struct compat_mmsghdr __user *)mmsg;
|
||||
err = 0;
|
||||
|
||||
while (datagrams < vlen) {
|
||||
/*
|
||||
* No need to ask LSM for more than the first datagram.
|
||||
*/
|
||||
if (MSG_CMSG_COMPAT & flags) {
|
||||
err = __sys_sendmsg(sock, (struct msghdr __user *)compat_entry,
|
||||
&msg_sys, flags, datagrams);
|
||||
&msg_sys, flags, &used_address);
|
||||
if (err < 0)
|
||||
break;
|
||||
err = __put_user(err, &compat_entry->msg_len);
|
||||
++compat_entry;
|
||||
} else {
|
||||
err = __sys_sendmsg(sock, (struct msghdr __user *)entry,
|
||||
&msg_sys, flags, datagrams);
|
||||
&msg_sys, flags, &used_address);
|
||||
if (err < 0)
|
||||
break;
|
||||
err = put_user(err, &entry->msg_len);
|
||||
@ -2037,30 +2062,12 @@ int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,
|
||||
++datagrams;
|
||||
}
|
||||
|
||||
out_put:
|
||||
fput_light(sock->file, fput_needed);
|
||||
|
||||
if (err == 0)
|
||||
/* We only return an error if no datagrams were able to be sent */
|
||||
if (datagrams != 0)
|
||||
return datagrams;
|
||||
|
||||
if (datagrams != 0) {
|
||||
/*
|
||||
* We may send less entries than requested (vlen) if the
|
||||
* sock is non blocking...
|
||||
*/
|
||||
if (err != -EAGAIN) {
|
||||
/*
|
||||
* ... or if sendmsg returns an error after we
|
||||
* send some datagrams, where we record the
|
||||
* error to return on the next call or if the
|
||||
* app asks about it using getsockopt(SO_ERROR).
|
||||
*/
|
||||
sock->sk->sk_err = -err;
|
||||
}
|
||||
|
||||
return datagrams;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -187,6 +187,7 @@ EXPORT_SYMBOL_GPL(xprt_load_transport);
|
||||
/**
|
||||
* xprt_reserve_xprt - serialize write access to transports
|
||||
* @task: task that is requesting access to the transport
|
||||
* @xprt: pointer to the target transport
|
||||
*
|
||||
* This prevents mixing the payload of separate requests, and prevents
|
||||
* transport connects from colliding with writes. No congestion control
|
||||
|
@ -3464,7 +3464,7 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
|
||||
tmp) {
|
||||
enum ieee80211_band band = nla_type(attr);
|
||||
|
||||
if (band < 0 || band > IEEE80211_NUM_BANDS) {
|
||||
if (band < 0 || band >= IEEE80211_NUM_BANDS) {
|
||||
err = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
|
@ -462,8 +462,8 @@ static struct xfrm_algo_desc ealg_list[] = {
|
||||
.desc = {
|
||||
.sadb_alg_id = SADB_X_EALG_AESCTR,
|
||||
.sadb_alg_ivlen = 8,
|
||||
.sadb_alg_minbits = 128,
|
||||
.sadb_alg_maxbits = 256
|
||||
.sadb_alg_minbits = 160,
|
||||
.sadb_alg_maxbits = 288
|
||||
}
|
||||
},
|
||||
};
|
||||
|
@ -14,7 +14,7 @@
|
||||
* Copyright (C) 2004-2005 Trusted Computer Solutions, Inc.
|
||||
* <dgoeddel@trustedcs.com>
|
||||
* Copyright (C) 2006, 2007, 2009 Hewlett-Packard Development Company, L.P.
|
||||
* Paul Moore <paul.moore@hp.com>
|
||||
* Paul Moore <paul@paul-moore.com>
|
||||
* Copyright (C) 2007 Hitachi Software Engineering Co., Ltd.
|
||||
* Yuichi Nakamura <ynakam@hitachisoft.jp>
|
||||
*
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
* Copyright (C) 2003 Red Hat, Inc., James Morris <jmorris@redhat.com>
|
||||
* Copyright (C) 2007 Hewlett-Packard Development Company, L.P.
|
||||
* Paul Moore, <paul.moore@hp.com>
|
||||
* Paul Moore <paul@paul-moore.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2,
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* SELinux interface to the NetLabel subsystem
|
||||
*
|
||||
* Author : Paul Moore <paul.moore@hp.com>
|
||||
* Author: Paul Moore <paul@paul-moore.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
* needed to reduce the lookup overhead since most of these queries happen on
|
||||
* a per-packet basis.
|
||||
*
|
||||
* Author: Paul Moore <paul.moore@hp.com>
|
||||
* Author: Paul Moore <paul@paul-moore.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
* mapping is maintained as part of the normal policy but a fast cache is
|
||||
* needed to reduce the lookup overhead.
|
||||
*
|
||||
* Author: Paul Moore <paul.moore@hp.com>
|
||||
* Author: Paul Moore <paul@paul-moore.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
* Copyright (C) 2003 Red Hat, Inc., James Morris <jmorris@redhat.com>
|
||||
* Copyright (C) 2007 Hewlett-Packard Development Company, L.P.
|
||||
* Paul Moore <paul.moore@hp.com>
|
||||
* Paul Moore <paul@paul-moore.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2,
|
||||
|
@ -4,7 +4,7 @@
|
||||
* This file provides the necessary glue to tie NetLabel into the SELinux
|
||||
* subsystem.
|
||||
*
|
||||
* Author: Paul Moore <paul.moore@hp.com>
|
||||
* Author: Paul Moore <paul@paul-moore.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
* needed to reduce the lookup overhead since most of these queries happen on
|
||||
* a per-packet basis.
|
||||
*
|
||||
* Author: Paul Moore <paul.moore@hp.com>
|
||||
* Author: Paul Moore <paul@paul-moore.com>
|
||||
*
|
||||
* This code is heavily based on the "netif" concept originally developed by
|
||||
* James Morris <jmorris@redhat.com>
|
||||
|
@ -5,7 +5,7 @@
|
||||
* mapping is maintained as part of the normal policy but a fast cache is
|
||||
* needed to reduce the lookup overhead.
|
||||
*
|
||||
* Author: Paul Moore <paul.moore@hp.com>
|
||||
* Author: Paul Moore <paul@paul-moore.com>
|
||||
*
|
||||
* This code is heavily based on the "netif" concept originally developed by
|
||||
* James Morris <jmorris@redhat.com>
|
||||
|
@ -2,7 +2,7 @@
|
||||
*
|
||||
* Added conditional policy language extensions
|
||||
*
|
||||
* Updated: Hewlett-Packard <paul.moore@hp.com>
|
||||
* Updated: Hewlett-Packard <paul@paul-moore.com>
|
||||
*
|
||||
* Added support for the policy capability bitmap
|
||||
*
|
||||
|
@ -4,7 +4,7 @@
|
||||
* Author : Stephen Smalley, <sds@epoch.ncsc.mil>
|
||||
*/
|
||||
/*
|
||||
* Updated: Hewlett-Packard <paul.moore@hp.com>
|
||||
* Updated: Hewlett-Packard <paul@paul-moore.com>
|
||||
*
|
||||
* Added support to import/export the NetLabel category bitmap
|
||||
*
|
||||
|
@ -11,7 +11,7 @@
|
||||
* Copyright (C) 2004-2006 Trusted Computer Solutions, Inc.
|
||||
*/
|
||||
/*
|
||||
* Updated: Hewlett-Packard <paul.moore@hp.com>
|
||||
* Updated: Hewlett-Packard <paul@paul-moore.com>
|
||||
*
|
||||
* Added support to import/export the MLS label from NetLabel
|
||||
*
|
||||
|
@ -11,7 +11,7 @@
|
||||
* Copyright (C) 2004-2006 Trusted Computer Solutions, Inc.
|
||||
*/
|
||||
/*
|
||||
* Updated: Hewlett-Packard <paul.moore@hp.com>
|
||||
* Updated: Hewlett-Packard <paul@paul-moore.com>
|
||||
*
|
||||
* Added support to import/export the MLS label from NetLabel
|
||||
*
|
||||
|
@ -13,7 +13,7 @@
|
||||
*
|
||||
* Added conditional policy language extensions
|
||||
*
|
||||
* Updated: Hewlett-Packard <paul.moore@hp.com>
|
||||
* Updated: Hewlett-Packard <paul@paul-moore.com>
|
||||
*
|
||||
* Added support for the policy capability bitmap
|
||||
*
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user