mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-25 21:24:08 +08:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (47 commits) GRETH: resolve SMP issues and other problems GRETH: handle frame error interrupts GRETH: avoid writing bad speed/duplex when setting transfer mode GRETH: fixed skb buffer memory leak on frame errors GRETH: GBit transmit descriptor handling optimization GRETH: fix opening/closing GRETH: added raw AMBA vendor/device number to match against. cassini: Fix build bustage on x86. e1000e: consistent use of Rx/Tx vs. RX/TX/rx/tx in comments/logs e1000e: update Copyright for 2011 e1000: Avoid unhandled IRQ r8169: keep firmware in memory. netdev: tilepro: Use is_unicast_ether_addr helper etherdevice.h: Add is_unicast_ether_addr function ks8695net: Use default implementation of ethtool_ops::get_link ks8695net: Disable non-working ethtool operations USB CDC NCM: Don't deref NULL in cdc_ncm_rx_fixup() and don't use uninitialized variable. vxge: Remember to release firmware after upgrading firmware netdev: bfin_mac: Remove is_multicast_ether_addr use in netdev_for_each_mc_addr ipsec: update MAX_AH_AUTH_LEN to support sha512 ...
This commit is contained in:
commit
d018b6f4f1
@ -268,10 +268,6 @@
|
||||
!Finclude/net/mac80211.h ieee80211_ops
|
||||
!Finclude/net/mac80211.h ieee80211_alloc_hw
|
||||
!Finclude/net/mac80211.h ieee80211_register_hw
|
||||
!Finclude/net/mac80211.h ieee80211_get_tx_led_name
|
||||
!Finclude/net/mac80211.h ieee80211_get_rx_led_name
|
||||
!Finclude/net/mac80211.h ieee80211_get_assoc_led_name
|
||||
!Finclude/net/mac80211.h ieee80211_get_radio_led_name
|
||||
!Finclude/net/mac80211.h ieee80211_unregister_hw
|
||||
!Finclude/net/mac80211.h ieee80211_free_hw
|
||||
</chapter>
|
||||
@ -382,6 +378,23 @@
|
||||
</para>
|
||||
</partintro>
|
||||
|
||||
<chapter id="led-support">
|
||||
<title>LED support</title>
|
||||
<para>
|
||||
Mac80211 supports various ways of blinking LEDs. Wherever possible,
|
||||
device LEDs should be exposed as LED class devices and hooked up to
|
||||
the appropriate trigger, which will then be triggered appropriately
|
||||
by mac80211.
|
||||
</para>
|
||||
!Finclude/net/mac80211.h ieee80211_get_tx_led_name
|
||||
!Finclude/net/mac80211.h ieee80211_get_rx_led_name
|
||||
!Finclude/net/mac80211.h ieee80211_get_assoc_led_name
|
||||
!Finclude/net/mac80211.h ieee80211_get_radio_led_name
|
||||
!Finclude/net/mac80211.h ieee80211_tpt_blink
|
||||
!Finclude/net/mac80211.h ieee80211_tpt_led_trigger_flags
|
||||
!Finclude/net/mac80211.h ieee80211_create_tpt_led_trigger
|
||||
</chapter>
|
||||
|
||||
<chapter id="hardware-crypto-offload">
|
||||
<title>Hardware crypto acceleration</title>
|
||||
!Pinclude/net/mac80211.h Hardware crypto acceleration
|
||||
|
@ -854,12 +854,12 @@ ks8695_set_msglevel(struct net_device *ndev, u32 value)
|
||||
}
|
||||
|
||||
/**
|
||||
* ks8695_get_settings - Get device-specific settings.
|
||||
* ks8695_wan_get_settings - Get device-specific settings.
|
||||
* @ndev: The network device to read settings from
|
||||
* @cmd: The ethtool structure to read into
|
||||
*/
|
||||
static int
|
||||
ks8695_get_settings(struct net_device *ndev, struct ethtool_cmd *cmd)
|
||||
ks8695_wan_get_settings(struct net_device *ndev, struct ethtool_cmd *cmd)
|
||||
{
|
||||
struct ks8695_priv *ksp = netdev_priv(ndev);
|
||||
u32 ctrl;
|
||||
@ -870,69 +870,50 @@ ks8695_get_settings(struct net_device *ndev, struct ethtool_cmd *cmd)
|
||||
SUPPORTED_TP | SUPPORTED_MII);
|
||||
cmd->transceiver = XCVR_INTERNAL;
|
||||
|
||||
/* Port specific extras */
|
||||
switch (ksp->dtype) {
|
||||
case KS8695_DTYPE_HPNA:
|
||||
cmd->phy_address = 0;
|
||||
/* not supported for HPNA */
|
||||
cmd->advertising = ADVERTISED_TP | ADVERTISED_MII;
|
||||
cmd->port = PORT_MII;
|
||||
cmd->supported |= (SUPPORTED_Autoneg | SUPPORTED_Pause);
|
||||
cmd->phy_address = 0;
|
||||
|
||||
ctrl = readl(ksp->phyiface_regs + KS8695_WMC);
|
||||
if ((ctrl & WMC_WAND) == 0) {
|
||||
/* auto-negotiation is enabled */
|
||||
cmd->advertising |= ADVERTISED_Autoneg;
|
||||
if (ctrl & WMC_WANA100F)
|
||||
cmd->advertising |= ADVERTISED_100baseT_Full;
|
||||
if (ctrl & WMC_WANA100H)
|
||||
cmd->advertising |= ADVERTISED_100baseT_Half;
|
||||
if (ctrl & WMC_WANA10F)
|
||||
cmd->advertising |= ADVERTISED_10baseT_Full;
|
||||
if (ctrl & WMC_WANA10H)
|
||||
cmd->advertising |= ADVERTISED_10baseT_Half;
|
||||
if (ctrl & WMC_WANAP)
|
||||
cmd->advertising |= ADVERTISED_Pause;
|
||||
cmd->autoneg = AUTONEG_ENABLE;
|
||||
|
||||
cmd->speed = (ctrl & WMC_WSS) ? SPEED_100 : SPEED_10;
|
||||
cmd->duplex = (ctrl & WMC_WDS) ?
|
||||
DUPLEX_FULL : DUPLEX_HALF;
|
||||
} else {
|
||||
/* auto-negotiation is disabled */
|
||||
cmd->autoneg = AUTONEG_DISABLE;
|
||||
|
||||
/* BUG: Erm, dtype hpna implies no phy regs */
|
||||
/*
|
||||
ctrl = readl(KS8695_MISC_VA + KS8695_HMC);
|
||||
cmd->speed = (ctrl & HMC_HSS) ? SPEED_100 : SPEED_10;
|
||||
cmd->duplex = (ctrl & HMC_HDS) ? DUPLEX_FULL : DUPLEX_HALF;
|
||||
*/
|
||||
return -EOPNOTSUPP;
|
||||
case KS8695_DTYPE_WAN:
|
||||
cmd->advertising = ADVERTISED_TP | ADVERTISED_MII;
|
||||
cmd->port = PORT_MII;
|
||||
cmd->supported |= (SUPPORTED_Autoneg | SUPPORTED_Pause);
|
||||
cmd->phy_address = 0;
|
||||
|
||||
ctrl = readl(ksp->phyiface_regs + KS8695_WMC);
|
||||
if ((ctrl & WMC_WAND) == 0) {
|
||||
/* auto-negotiation is enabled */
|
||||
cmd->advertising |= ADVERTISED_Autoneg;
|
||||
if (ctrl & WMC_WANA100F)
|
||||
cmd->advertising |= ADVERTISED_100baseT_Full;
|
||||
if (ctrl & WMC_WANA100H)
|
||||
cmd->advertising |= ADVERTISED_100baseT_Half;
|
||||
if (ctrl & WMC_WANA10F)
|
||||
cmd->advertising |= ADVERTISED_10baseT_Full;
|
||||
if (ctrl & WMC_WANA10H)
|
||||
cmd->advertising |= ADVERTISED_10baseT_Half;
|
||||
if (ctrl & WMC_WANAP)
|
||||
cmd->advertising |= ADVERTISED_Pause;
|
||||
cmd->autoneg = AUTONEG_ENABLE;
|
||||
|
||||
cmd->speed = (ctrl & WMC_WSS) ? SPEED_100 : SPEED_10;
|
||||
cmd->duplex = (ctrl & WMC_WDS) ?
|
||||
DUPLEX_FULL : DUPLEX_HALF;
|
||||
} else {
|
||||
/* auto-negotiation is disabled */
|
||||
cmd->autoneg = AUTONEG_DISABLE;
|
||||
|
||||
cmd->speed = (ctrl & WMC_WANF100) ?
|
||||
SPEED_100 : SPEED_10;
|
||||
cmd->duplex = (ctrl & WMC_WANFF) ?
|
||||
DUPLEX_FULL : DUPLEX_HALF;
|
||||
}
|
||||
break;
|
||||
case KS8695_DTYPE_LAN:
|
||||
return -EOPNOTSUPP;
|
||||
cmd->speed = (ctrl & WMC_WANF100) ?
|
||||
SPEED_100 : SPEED_10;
|
||||
cmd->duplex = (ctrl & WMC_WANFF) ?
|
||||
DUPLEX_FULL : DUPLEX_HALF;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* ks8695_set_settings - Set device-specific settings.
|
||||
* ks8695_wan_set_settings - Set device-specific settings.
|
||||
* @ndev: The network device to configure
|
||||
* @cmd: The settings to configure
|
||||
*/
|
||||
static int
|
||||
ks8695_set_settings(struct net_device *ndev, struct ethtool_cmd *cmd)
|
||||
ks8695_wan_set_settings(struct net_device *ndev, struct ethtool_cmd *cmd)
|
||||
{
|
||||
struct ks8695_priv *ksp = netdev_priv(ndev);
|
||||
u32 ctrl;
|
||||
@ -956,171 +937,85 @@ ks8695_set_settings(struct net_device *ndev, struct ethtool_cmd *cmd)
|
||||
ADVERTISED_100baseT_Full)) == 0)
|
||||
return -EINVAL;
|
||||
|
||||
switch (ksp->dtype) {
|
||||
case KS8695_DTYPE_HPNA:
|
||||
/* HPNA does not support auto-negotiation. */
|
||||
return -EINVAL;
|
||||
case KS8695_DTYPE_WAN:
|
||||
ctrl = readl(ksp->phyiface_regs + KS8695_WMC);
|
||||
ctrl = readl(ksp->phyiface_regs + KS8695_WMC);
|
||||
|
||||
ctrl &= ~(WMC_WAND | WMC_WANA100F | WMC_WANA100H |
|
||||
WMC_WANA10F | WMC_WANA10H);
|
||||
if (cmd->advertising & ADVERTISED_100baseT_Full)
|
||||
ctrl |= WMC_WANA100F;
|
||||
if (cmd->advertising & ADVERTISED_100baseT_Half)
|
||||
ctrl |= WMC_WANA100H;
|
||||
if (cmd->advertising & ADVERTISED_10baseT_Full)
|
||||
ctrl |= WMC_WANA10F;
|
||||
if (cmd->advertising & ADVERTISED_10baseT_Half)
|
||||
ctrl |= WMC_WANA10H;
|
||||
|
||||
/* force a re-negotiation */
|
||||
ctrl |= WMC_WANR;
|
||||
writel(ctrl, ksp->phyiface_regs + KS8695_WMC);
|
||||
break;
|
||||
case KS8695_DTYPE_LAN:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
ctrl &= ~(WMC_WAND | WMC_WANA100F | WMC_WANA100H |
|
||||
WMC_WANA10F | WMC_WANA10H);
|
||||
if (cmd->advertising & ADVERTISED_100baseT_Full)
|
||||
ctrl |= WMC_WANA100F;
|
||||
if (cmd->advertising & ADVERTISED_100baseT_Half)
|
||||
ctrl |= WMC_WANA100H;
|
||||
if (cmd->advertising & ADVERTISED_10baseT_Full)
|
||||
ctrl |= WMC_WANA10F;
|
||||
if (cmd->advertising & ADVERTISED_10baseT_Half)
|
||||
ctrl |= WMC_WANA10H;
|
||||
|
||||
/* force a re-negotiation */
|
||||
ctrl |= WMC_WANR;
|
||||
writel(ctrl, ksp->phyiface_regs + KS8695_WMC);
|
||||
} else {
|
||||
switch (ksp->dtype) {
|
||||
case KS8695_DTYPE_HPNA:
|
||||
/* BUG: dtype_hpna implies no phy registers */
|
||||
/*
|
||||
ctrl = __raw_readl(KS8695_MISC_VA + KS8695_HMC);
|
||||
ctrl = readl(ksp->phyiface_regs + KS8695_WMC);
|
||||
|
||||
ctrl &= ~(HMC_HSS | HMC_HDS);
|
||||
if (cmd->speed == SPEED_100)
|
||||
ctrl |= HMC_HSS;
|
||||
if (cmd->duplex == DUPLEX_FULL)
|
||||
ctrl |= HMC_HDS;
|
||||
/* disable auto-negotiation */
|
||||
ctrl |= WMC_WAND;
|
||||
ctrl &= ~(WMC_WANF100 | WMC_WANFF);
|
||||
|
||||
__raw_writel(ctrl, KS8695_MISC_VA + KS8695_HMC);
|
||||
*/
|
||||
return -EOPNOTSUPP;
|
||||
case KS8695_DTYPE_WAN:
|
||||
ctrl = readl(ksp->phyiface_regs + KS8695_WMC);
|
||||
if (cmd->speed == SPEED_100)
|
||||
ctrl |= WMC_WANF100;
|
||||
if (cmd->duplex == DUPLEX_FULL)
|
||||
ctrl |= WMC_WANFF;
|
||||
|
||||
/* disable auto-negotiation */
|
||||
ctrl |= WMC_WAND;
|
||||
ctrl &= ~(WMC_WANF100 | WMC_WANFF);
|
||||
|
||||
if (cmd->speed == SPEED_100)
|
||||
ctrl |= WMC_WANF100;
|
||||
if (cmd->duplex == DUPLEX_FULL)
|
||||
ctrl |= WMC_WANFF;
|
||||
|
||||
writel(ctrl, ksp->phyiface_regs + KS8695_WMC);
|
||||
break;
|
||||
case KS8695_DTYPE_LAN:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
writel(ctrl, ksp->phyiface_regs + KS8695_WMC);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* ks8695_nwayreset - Restart the autonegotiation on the port.
|
||||
* ks8695_wan_nwayreset - Restart the autonegotiation on the port.
|
||||
* @ndev: The network device to restart autoneotiation on
|
||||
*/
|
||||
static int
|
||||
ks8695_nwayreset(struct net_device *ndev)
|
||||
ks8695_wan_nwayreset(struct net_device *ndev)
|
||||
{
|
||||
struct ks8695_priv *ksp = netdev_priv(ndev);
|
||||
u32 ctrl;
|
||||
|
||||
switch (ksp->dtype) {
|
||||
case KS8695_DTYPE_HPNA:
|
||||
/* No phy means no autonegotiation on hpna */
|
||||
ctrl = readl(ksp->phyiface_regs + KS8695_WMC);
|
||||
|
||||
if ((ctrl & WMC_WAND) == 0)
|
||||
writel(ctrl | WMC_WANR,
|
||||
ksp->phyiface_regs + KS8695_WMC);
|
||||
else
|
||||
/* auto-negotiation not enabled */
|
||||
return -EINVAL;
|
||||
case KS8695_DTYPE_WAN:
|
||||
ctrl = readl(ksp->phyiface_regs + KS8695_WMC);
|
||||
|
||||
if ((ctrl & WMC_WAND) == 0)
|
||||
writel(ctrl | WMC_WANR,
|
||||
ksp->phyiface_regs + KS8695_WMC);
|
||||
else
|
||||
/* auto-negotiation not enabled */
|
||||
return -EINVAL;
|
||||
break;
|
||||
case KS8695_DTYPE_LAN:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* ks8695_get_link - Retrieve link status of network interface
|
||||
* @ndev: The network interface to retrive the link status of.
|
||||
*/
|
||||
static u32
|
||||
ks8695_get_link(struct net_device *ndev)
|
||||
{
|
||||
struct ks8695_priv *ksp = netdev_priv(ndev);
|
||||
u32 ctrl;
|
||||
|
||||
switch (ksp->dtype) {
|
||||
case KS8695_DTYPE_HPNA:
|
||||
/* HPNA always has link */
|
||||
return 1;
|
||||
case KS8695_DTYPE_WAN:
|
||||
/* WAN we can read the PHY for */
|
||||
ctrl = readl(ksp->phyiface_regs + KS8695_WMC);
|
||||
return ctrl & WMC_WLS;
|
||||
case KS8695_DTYPE_LAN:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* ks8695_get_pause - Retrieve network pause/flow-control advertising
|
||||
* ks8695_wan_get_pause - Retrieve network pause/flow-control advertising
|
||||
* @ndev: The device to retrieve settings from
|
||||
* @param: The structure to fill out with the information
|
||||
*/
|
||||
static void
|
||||
ks8695_get_pause(struct net_device *ndev, struct ethtool_pauseparam *param)
|
||||
ks8695_wan_get_pause(struct net_device *ndev, struct ethtool_pauseparam *param)
|
||||
{
|
||||
struct ks8695_priv *ksp = netdev_priv(ndev);
|
||||
u32 ctrl;
|
||||
|
||||
switch (ksp->dtype) {
|
||||
case KS8695_DTYPE_HPNA:
|
||||
/* No phy link on hpna to configure */
|
||||
return;
|
||||
case KS8695_DTYPE_WAN:
|
||||
ctrl = readl(ksp->phyiface_regs + KS8695_WMC);
|
||||
ctrl = readl(ksp->phyiface_regs + KS8695_WMC);
|
||||
|
||||
/* advertise Pause */
|
||||
param->autoneg = (ctrl & WMC_WANAP);
|
||||
/* advertise Pause */
|
||||
param->autoneg = (ctrl & WMC_WANAP);
|
||||
|
||||
/* current Rx Flow-control */
|
||||
ctrl = ks8695_readreg(ksp, KS8695_DRXC);
|
||||
param->rx_pause = (ctrl & DRXC_RFCE);
|
||||
/* current Rx Flow-control */
|
||||
ctrl = ks8695_readreg(ksp, KS8695_DRXC);
|
||||
param->rx_pause = (ctrl & DRXC_RFCE);
|
||||
|
||||
/* current Tx Flow-control */
|
||||
ctrl = ks8695_readreg(ksp, KS8695_DTXC);
|
||||
param->tx_pause = (ctrl & DTXC_TFCE);
|
||||
break;
|
||||
case KS8695_DTYPE_LAN:
|
||||
/* The LAN's "phy" is a direct-attached switch */
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ks8695_set_pause - Configure pause/flow-control
|
||||
* @ndev: The device to configure
|
||||
* @param: The pause parameters to set
|
||||
*
|
||||
* TODO: Implement this
|
||||
*/
|
||||
static int
|
||||
ks8695_set_pause(struct net_device *ndev, struct ethtool_pauseparam *param)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
/* current Tx Flow-control */
|
||||
ctrl = ks8695_readreg(ksp, KS8695_DTXC);
|
||||
param->tx_pause = (ctrl & DTXC_TFCE);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1140,12 +1035,17 @@ ks8695_get_drvinfo(struct net_device *ndev, struct ethtool_drvinfo *info)
|
||||
static const struct ethtool_ops ks8695_ethtool_ops = {
|
||||
.get_msglevel = ks8695_get_msglevel,
|
||||
.set_msglevel = ks8695_set_msglevel,
|
||||
.get_settings = ks8695_get_settings,
|
||||
.set_settings = ks8695_set_settings,
|
||||
.nway_reset = ks8695_nwayreset,
|
||||
.get_link = ks8695_get_link,
|
||||
.get_pauseparam = ks8695_get_pause,
|
||||
.set_pauseparam = ks8695_set_pause,
|
||||
.get_drvinfo = ks8695_get_drvinfo,
|
||||
};
|
||||
|
||||
static const struct ethtool_ops ks8695_wan_ethtool_ops = {
|
||||
.get_msglevel = ks8695_get_msglevel,
|
||||
.set_msglevel = ks8695_set_msglevel,
|
||||
.get_settings = ks8695_wan_get_settings,
|
||||
.set_settings = ks8695_wan_set_settings,
|
||||
.nway_reset = ks8695_wan_nwayreset,
|
||||
.get_link = ethtool_op_get_link,
|
||||
.get_pauseparam = ks8695_wan_get_pause,
|
||||
.get_drvinfo = ks8695_get_drvinfo,
|
||||
};
|
||||
|
||||
@ -1541,7 +1441,6 @@ ks8695_probe(struct platform_device *pdev)
|
||||
|
||||
/* driver system setup */
|
||||
ndev->netdev_ops = &ks8695_netdev_ops;
|
||||
SET_ETHTOOL_OPS(ndev, &ks8695_ethtool_ops);
|
||||
ndev->watchdog_timeo = msecs_to_jiffies(watchdog);
|
||||
|
||||
netif_napi_add(ndev, &ksp->napi, ks8695_poll, NAPI_WEIGHT);
|
||||
@ -1608,12 +1507,15 @@ ks8695_probe(struct platform_device *pdev)
|
||||
if (ksp->phyiface_regs && ksp->link_irq == -1) {
|
||||
ks8695_init_switch(ksp);
|
||||
ksp->dtype = KS8695_DTYPE_LAN;
|
||||
SET_ETHTOOL_OPS(ndev, &ks8695_ethtool_ops);
|
||||
} else if (ksp->phyiface_regs && ksp->link_irq != -1) {
|
||||
ks8695_init_wan_phy(ksp);
|
||||
ksp->dtype = KS8695_DTYPE_WAN;
|
||||
SET_ETHTOOL_OPS(ndev, &ks8695_wan_ethtool_ops);
|
||||
} else {
|
||||
/* No initialisation since HPNA does not have a PHY */
|
||||
ksp->dtype = KS8695_DTYPE_HPNA;
|
||||
SET_ETHTOOL_OPS(ndev, &ks8695_ethtool_ops);
|
||||
}
|
||||
|
||||
/* And bring up the net_device with the net core */
|
||||
|
@ -1284,19 +1284,12 @@ static void bfin_mac_multicast_hash(struct net_device *dev)
|
||||
{
|
||||
u32 emac_hashhi, emac_hashlo;
|
||||
struct netdev_hw_addr *ha;
|
||||
char *addrs;
|
||||
u32 crc;
|
||||
|
||||
emac_hashhi = emac_hashlo = 0;
|
||||
|
||||
netdev_for_each_mc_addr(ha, dev) {
|
||||
addrs = ha->addr;
|
||||
|
||||
/* skip non-multicast addresses */
|
||||
if (!(*addrs & 1))
|
||||
continue;
|
||||
|
||||
crc = ether_crc(ETH_ALEN, addrs);
|
||||
crc = ether_crc(ETH_ALEN, ha->addr);
|
||||
crc >>= 26;
|
||||
|
||||
if (crc & 0x20)
|
||||
|
@ -275,7 +275,6 @@ bnad_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo)
|
||||
|
||||
ioc_attr = kzalloc(sizeof(*ioc_attr), GFP_KERNEL);
|
||||
if (ioc_attr) {
|
||||
memset(ioc_attr, 0, sizeof(*ioc_attr));
|
||||
spin_lock_irqsave(&bnad->bna_lock, flags);
|
||||
bfa_nw_ioc_get_attr(&bnad->bna.device.ioc, ioc_attr);
|
||||
spin_unlock_irqrestore(&bnad->bna_lock, flags);
|
||||
|
@ -3203,7 +3203,7 @@ static int cas_get_vpd_info(struct cas *cp, unsigned char *dev_addr,
|
||||
int phy_type = CAS_PHY_MII_MDIO0; /* default phy type */
|
||||
int mac_off = 0;
|
||||
|
||||
#if defined(CONFIG_OF)
|
||||
#if defined(CONFIG_SPARC)
|
||||
const unsigned char *addr;
|
||||
#endif
|
||||
|
||||
@ -3354,7 +3354,7 @@ use_random_mac_addr:
|
||||
if (found & VPD_FOUND_MAC)
|
||||
goto done;
|
||||
|
||||
#if defined(CONFIG_OF)
|
||||
#if defined(CONFIG_SPARC)
|
||||
addr = of_get_property(cp->of_node, "local-mac-address", NULL);
|
||||
if (addr != NULL) {
|
||||
memcpy(dev_addr, addr, 6);
|
||||
@ -5031,7 +5031,7 @@ static int __devinit cas_init_one(struct pci_dev *pdev,
|
||||
cp->msg_enable = (cassini_debug < 0) ? CAS_DEF_MSG_ENABLE :
|
||||
cassini_debug;
|
||||
|
||||
#if defined(CONFIG_OF)
|
||||
#if defined(CONFIG_SPARC)
|
||||
cp->of_node = pci_device_to_OF_node(pdev);
|
||||
#endif
|
||||
|
||||
|
@ -3478,9 +3478,17 @@ static irqreturn_t e1000_intr(int irq, void *data)
|
||||
struct e1000_hw *hw = &adapter->hw;
|
||||
u32 icr = er32(ICR);
|
||||
|
||||
if (unlikely((!icr) || test_bit(__E1000_DOWN, &adapter->flags)))
|
||||
if (unlikely((!icr)))
|
||||
return IRQ_NONE; /* Not our interrupt */
|
||||
|
||||
/*
|
||||
* we might have caused the interrupt, but the above
|
||||
* read cleared it, and just in case the driver is
|
||||
* down there is nothing to do so return handled
|
||||
*/
|
||||
if (unlikely(test_bit(__E1000_DOWN, &adapter->flags)))
|
||||
return IRQ_HANDLED;
|
||||
|
||||
if (unlikely(icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC))) {
|
||||
hw->get_link_status = 1;
|
||||
/* guard against interrupt when we're going down */
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*******************************************************************************
|
||||
|
||||
Intel PRO/1000 Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
@ -1310,7 +1310,7 @@ static void e1000_initialize_hw_bits_82571(struct e1000_hw *hw)
|
||||
* apply workaround for hardware errata documented in errata
|
||||
* docs Fixes issue where some error prone or unreliable PCIe
|
||||
* completions are occurring, particularly with ASPM enabled.
|
||||
* Without fix, issue can cause tx timeouts.
|
||||
* Without fix, issue can cause Tx timeouts.
|
||||
*/
|
||||
reg = er32(GCR2);
|
||||
reg |= 1;
|
||||
|
@ -1,7 +1,7 @@
|
||||
################################################################################
|
||||
#
|
||||
# Intel PRO/1000 Linux driver
|
||||
# Copyright(c) 1999 - 2008 Intel Corporation.
|
||||
# Copyright(c) 1999 - 2011 Intel Corporation.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it
|
||||
# under the terms and conditions of the GNU General Public License,
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*******************************************************************************
|
||||
|
||||
Intel PRO/1000 Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*******************************************************************************
|
||||
|
||||
Intel PRO/1000 Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*******************************************************************************
|
||||
|
||||
Intel PRO/1000 Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*******************************************************************************
|
||||
|
||||
Intel PRO/1000 Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*******************************************************************************
|
||||
|
||||
Intel PRO/1000 Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
@ -102,7 +102,7 @@ enum e1e_registers {
|
||||
E1000_RDTR = 0x02820, /* Rx Delay Timer - RW */
|
||||
E1000_RXDCTL_BASE = 0x02828, /* Rx Descriptor Control - RW */
|
||||
#define E1000_RXDCTL(_n) (E1000_RXDCTL_BASE + (_n << 8))
|
||||
E1000_RADV = 0x0282C, /* RX Interrupt Absolute Delay Timer - RW */
|
||||
E1000_RADV = 0x0282C, /* Rx Interrupt Absolute Delay Timer - RW */
|
||||
|
||||
/* Convenience macros
|
||||
*
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*******************************************************************************
|
||||
|
||||
Intel PRO/1000 Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*******************************************************************************
|
||||
|
||||
Intel PRO/1000 Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
@ -533,7 +533,7 @@ s32 e1000e_check_for_fiber_link(struct e1000_hw *hw)
|
||||
mac->autoneg_failed = 1;
|
||||
return 0;
|
||||
}
|
||||
e_dbg("NOT RXing /C/, disable AutoNeg and force link.\n");
|
||||
e_dbg("NOT Rx'ing /C/, disable AutoNeg and force link.\n");
|
||||
|
||||
/* Disable auto-negotiation in the TXCW register */
|
||||
ew32(TXCW, (mac->txcw & ~E1000_TXCW_ANE));
|
||||
@ -556,7 +556,7 @@ s32 e1000e_check_for_fiber_link(struct e1000_hw *hw)
|
||||
* and disable forced link in the Device Control register
|
||||
* in an attempt to auto-negotiate with our link partner.
|
||||
*/
|
||||
e_dbg("RXing /C/, enable AutoNeg and stop forcing link.\n");
|
||||
e_dbg("Rx'ing /C/, enable AutoNeg and stop forcing link.\n");
|
||||
ew32(TXCW, mac->txcw);
|
||||
ew32(CTRL, (ctrl & ~E1000_CTRL_SLU));
|
||||
|
||||
@ -598,7 +598,7 @@ s32 e1000e_check_for_serdes_link(struct e1000_hw *hw)
|
||||
mac->autoneg_failed = 1;
|
||||
return 0;
|
||||
}
|
||||
e_dbg("NOT RXing /C/, disable AutoNeg and force link.\n");
|
||||
e_dbg("NOT Rx'ing /C/, disable AutoNeg and force link.\n");
|
||||
|
||||
/* Disable auto-negotiation in the TXCW register */
|
||||
ew32(TXCW, (mac->txcw & ~E1000_TXCW_ANE));
|
||||
@ -621,7 +621,7 @@ s32 e1000e_check_for_serdes_link(struct e1000_hw *hw)
|
||||
* and disable forced link in the Device Control register
|
||||
* in an attempt to auto-negotiate with our link partner.
|
||||
*/
|
||||
e_dbg("RXing /C/, enable AutoNeg and stop forcing link.\n");
|
||||
e_dbg("Rx'ing /C/, enable AutoNeg and stop forcing link.\n");
|
||||
ew32(TXCW, mac->txcw);
|
||||
ew32(CTRL, (ctrl & ~E1000_CTRL_SLU));
|
||||
|
||||
@ -800,9 +800,9 @@ static s32 e1000_commit_fc_settings_generic(struct e1000_hw *hw)
|
||||
* The possible values of the "fc" parameter are:
|
||||
* 0: Flow control is completely disabled
|
||||
* 1: Rx flow control is enabled (we can receive pause frames,
|
||||
* but not send pause frames).
|
||||
* but not send pause frames).
|
||||
* 2: Tx flow control is enabled (we can send pause frames but we
|
||||
* do not support receiving pause frames).
|
||||
* do not support receiving pause frames).
|
||||
* 3: Both Rx and Tx flow control (symmetric) are enabled.
|
||||
*/
|
||||
switch (hw->fc.current_mode) {
|
||||
@ -1031,9 +1031,9 @@ s32 e1000e_force_mac_fc(struct e1000_hw *hw)
|
||||
* The possible values of the "fc" parameter are:
|
||||
* 0: Flow control is completely disabled
|
||||
* 1: Rx flow control is enabled (we can receive pause
|
||||
* frames but not send pause frames).
|
||||
* frames but not send pause frames).
|
||||
* 2: Tx flow control is enabled (we can send pause frames
|
||||
* frames but we do not receive pause frames).
|
||||
* frames but we do not receive pause frames).
|
||||
* 3: Both Rx and Tx flow control (symmetric) is enabled.
|
||||
* other: No other values should be possible at this point.
|
||||
*/
|
||||
@ -1189,7 +1189,7 @@ s32 e1000e_config_fc_after_link_up(struct e1000_hw *hw)
|
||||
} else {
|
||||
hw->fc.current_mode = e1000_fc_rx_pause;
|
||||
e_dbg("Flow Control = "
|
||||
"RX PAUSE frames only.\r\n");
|
||||
"Rx PAUSE frames only.\r\n");
|
||||
}
|
||||
}
|
||||
/*
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*******************************************************************************
|
||||
|
||||
Intel PRO/1000 Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
@ -77,17 +77,17 @@ struct e1000_reg_info {
|
||||
char *name;
|
||||
};
|
||||
|
||||
#define E1000_RDFH 0x02410 /* Rx Data FIFO Head - RW */
|
||||
#define E1000_RDFT 0x02418 /* Rx Data FIFO Tail - RW */
|
||||
#define E1000_RDFHS 0x02420 /* Rx Data FIFO Head Saved - RW */
|
||||
#define E1000_RDFTS 0x02428 /* Rx Data FIFO Tail Saved - RW */
|
||||
#define E1000_RDFPC 0x02430 /* Rx Data FIFO Packet Count - RW */
|
||||
#define E1000_RDFH 0x02410 /* Rx Data FIFO Head - RW */
|
||||
#define E1000_RDFT 0x02418 /* Rx Data FIFO Tail - RW */
|
||||
#define E1000_RDFHS 0x02420 /* Rx Data FIFO Head Saved - RW */
|
||||
#define E1000_RDFTS 0x02428 /* Rx Data FIFO Tail Saved - RW */
|
||||
#define E1000_RDFPC 0x02430 /* Rx Data FIFO Packet Count - RW */
|
||||
|
||||
#define E1000_TDFH 0x03410 /* Tx Data FIFO Head - RW */
|
||||
#define E1000_TDFT 0x03418 /* Tx Data FIFO Tail - RW */
|
||||
#define E1000_TDFHS 0x03420 /* Tx Data FIFO Head Saved - RW */
|
||||
#define E1000_TDFTS 0x03428 /* Tx Data FIFO Tail Saved - RW */
|
||||
#define E1000_TDFPC 0x03430 /* Tx Data FIFO Packet Count - RW */
|
||||
#define E1000_TDFH 0x03410 /* Tx Data FIFO Head - RW */
|
||||
#define E1000_TDFT 0x03418 /* Tx Data FIFO Tail - RW */
|
||||
#define E1000_TDFHS 0x03420 /* Tx Data FIFO Head Saved - RW */
|
||||
#define E1000_TDFTS 0x03428 /* Tx Data FIFO Tail Saved - RW */
|
||||
#define E1000_TDFPC 0x03430 /* Tx Data FIFO Packet Count - RW */
|
||||
|
||||
static const struct e1000_reg_info e1000_reg_info_tbl[] = {
|
||||
|
||||
@ -99,7 +99,7 @@ static const struct e1000_reg_info e1000_reg_info_tbl[] = {
|
||||
/* Interrupt Registers */
|
||||
{E1000_ICR, "ICR"},
|
||||
|
||||
/* RX Registers */
|
||||
/* Rx Registers */
|
||||
{E1000_RCTL, "RCTL"},
|
||||
{E1000_RDLEN, "RDLEN"},
|
||||
{E1000_RDH, "RDH"},
|
||||
@ -115,7 +115,7 @@ static const struct e1000_reg_info e1000_reg_info_tbl[] = {
|
||||
{E1000_RDFTS, "RDFTS"},
|
||||
{E1000_RDFPC, "RDFPC"},
|
||||
|
||||
/* TX Registers */
|
||||
/* Tx Registers */
|
||||
{E1000_TCTL, "TCTL"},
|
||||
{E1000_TDBAL, "TDBAL"},
|
||||
{E1000_TDBAH, "TDBAH"},
|
||||
@ -160,7 +160,7 @@ static void e1000_regdump(struct e1000_hw *hw, struct e1000_reg_info *reginfo)
|
||||
break;
|
||||
default:
|
||||
printk(KERN_INFO "%-15s %08x\n",
|
||||
reginfo->name, __er32(hw, reginfo->ofs));
|
||||
reginfo->name, __er32(hw, reginfo->ofs));
|
||||
return;
|
||||
}
|
||||
|
||||
@ -171,9 +171,8 @@ static void e1000_regdump(struct e1000_hw *hw, struct e1000_reg_info *reginfo)
|
||||
printk(KERN_CONT "\n");
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* e1000e_dump - Print registers, tx-ring and rx-ring
|
||||
* e1000e_dump - Print registers, Tx-ring and Rx-ring
|
||||
*/
|
||||
static void e1000e_dump(struct e1000_adapter *adapter)
|
||||
{
|
||||
@ -182,12 +181,20 @@ static void e1000e_dump(struct e1000_adapter *adapter)
|
||||
struct e1000_reg_info *reginfo;
|
||||
struct e1000_ring *tx_ring = adapter->tx_ring;
|
||||
struct e1000_tx_desc *tx_desc;
|
||||
struct my_u0 { u64 a; u64 b; } *u0;
|
||||
struct my_u0 {
|
||||
u64 a;
|
||||
u64 b;
|
||||
} *u0;
|
||||
struct e1000_buffer *buffer_info;
|
||||
struct e1000_ring *rx_ring = adapter->rx_ring;
|
||||
union e1000_rx_desc_packet_split *rx_desc_ps;
|
||||
struct e1000_rx_desc *rx_desc;
|
||||
struct my_u1 { u64 a; u64 b; u64 c; u64 d; } *u1;
|
||||
struct my_u1 {
|
||||
u64 a;
|
||||
u64 b;
|
||||
u64 c;
|
||||
u64 d;
|
||||
} *u1;
|
||||
u32 staterr;
|
||||
int i = 0;
|
||||
|
||||
@ -198,12 +205,10 @@ static void e1000e_dump(struct e1000_adapter *adapter)
|
||||
if (netdev) {
|
||||
dev_info(&adapter->pdev->dev, "Net device Info\n");
|
||||
printk(KERN_INFO "Device Name state "
|
||||
"trans_start last_rx\n");
|
||||
"trans_start last_rx\n");
|
||||
printk(KERN_INFO "%-15s %016lX %016lX %016lX\n",
|
||||
netdev->name,
|
||||
netdev->state,
|
||||
netdev->trans_start,
|
||||
netdev->last_rx);
|
||||
netdev->name, netdev->state, netdev->trans_start,
|
||||
netdev->last_rx);
|
||||
}
|
||||
|
||||
/* Print Registers */
|
||||
@ -214,26 +219,26 @@ static void e1000e_dump(struct e1000_adapter *adapter)
|
||||
e1000_regdump(hw, reginfo);
|
||||
}
|
||||
|
||||
/* Print TX Ring Summary */
|
||||
/* Print Tx Ring Summary */
|
||||
if (!netdev || !netif_running(netdev))
|
||||
goto exit;
|
||||
|
||||
dev_info(&adapter->pdev->dev, "TX Rings Summary\n");
|
||||
dev_info(&adapter->pdev->dev, "Tx Ring Summary\n");
|
||||
printk(KERN_INFO "Queue [NTU] [NTC] [bi(ntc)->dma ]"
|
||||
" leng ntw timestamp\n");
|
||||
" leng ntw timestamp\n");
|
||||
buffer_info = &tx_ring->buffer_info[tx_ring->next_to_clean];
|
||||
printk(KERN_INFO " %5d %5X %5X %016llX %04X %3X %016llX\n",
|
||||
0, tx_ring->next_to_use, tx_ring->next_to_clean,
|
||||
(unsigned long long)buffer_info->dma,
|
||||
buffer_info->length,
|
||||
buffer_info->next_to_watch,
|
||||
(unsigned long long)buffer_info->time_stamp);
|
||||
0, tx_ring->next_to_use, tx_ring->next_to_clean,
|
||||
(unsigned long long)buffer_info->dma,
|
||||
buffer_info->length,
|
||||
buffer_info->next_to_watch,
|
||||
(unsigned long long)buffer_info->time_stamp);
|
||||
|
||||
/* Print TX Rings */
|
||||
/* Print Tx Ring */
|
||||
if (!netif_msg_tx_done(adapter))
|
||||
goto rx_ring_summary;
|
||||
|
||||
dev_info(&adapter->pdev->dev, "TX Rings Dump\n");
|
||||
dev_info(&adapter->pdev->dev, "Tx Ring Dump\n");
|
||||
|
||||
/* Transmit Descriptor Formats - DEXT[29] is 0 (Legacy) or 1 (Extended)
|
||||
*
|
||||
@ -263,22 +268,22 @@ static void e1000e_dump(struct e1000_adapter *adapter)
|
||||
* 63 48 47 40 39 36 35 32 31 24 23 20 19 0
|
||||
*/
|
||||
printk(KERN_INFO "Tl[desc] [address 63:0 ] [SpeCssSCmCsLen]"
|
||||
" [bi->dma ] leng ntw timestamp bi->skb "
|
||||
"<-- Legacy format\n");
|
||||
" [bi->dma ] leng ntw timestamp bi->skb "
|
||||
"<-- Legacy format\n");
|
||||
printk(KERN_INFO "Tc[desc] [Ce CoCsIpceCoS] [MssHlRSCm0Plen]"
|
||||
" [bi->dma ] leng ntw timestamp bi->skb "
|
||||
"<-- Ext Context format\n");
|
||||
" [bi->dma ] leng ntw timestamp bi->skb "
|
||||
"<-- Ext Context format\n");
|
||||
printk(KERN_INFO "Td[desc] [address 63:0 ] [VlaPoRSCm1Dlen]"
|
||||
" [bi->dma ] leng ntw timestamp bi->skb "
|
||||
"<-- Ext Data format\n");
|
||||
" [bi->dma ] leng ntw timestamp bi->skb "
|
||||
"<-- Ext Data format\n");
|
||||
for (i = 0; tx_ring->desc && (i < tx_ring->count); i++) {
|
||||
tx_desc = E1000_TX_DESC(*tx_ring, i);
|
||||
buffer_info = &tx_ring->buffer_info[i];
|
||||
u0 = (struct my_u0 *)tx_desc;
|
||||
printk(KERN_INFO "T%c[0x%03X] %016llX %016llX %016llX "
|
||||
"%04X %3X %016llX %p",
|
||||
(!(le64_to_cpu(u0->b) & (1<<29)) ? 'l' :
|
||||
((le64_to_cpu(u0->b) & (1<<20)) ? 'd' : 'c')), i,
|
||||
"%04X %3X %016llX %p",
|
||||
(!(le64_to_cpu(u0->b) & (1 << 29)) ? 'l' :
|
||||
((le64_to_cpu(u0->b) & (1 << 20)) ? 'd' : 'c')), i,
|
||||
(unsigned long long)le64_to_cpu(u0->a),
|
||||
(unsigned long long)le64_to_cpu(u0->b),
|
||||
(unsigned long long)buffer_info->dma,
|
||||
@ -296,22 +301,22 @@ static void e1000e_dump(struct e1000_adapter *adapter)
|
||||
|
||||
if (netif_msg_pktdata(adapter) && buffer_info->dma != 0)
|
||||
print_hex_dump(KERN_INFO, "", DUMP_PREFIX_ADDRESS,
|
||||
16, 1, phys_to_virt(buffer_info->dma),
|
||||
buffer_info->length, true);
|
||||
16, 1, phys_to_virt(buffer_info->dma),
|
||||
buffer_info->length, true);
|
||||
}
|
||||
|
||||
/* Print RX Rings Summary */
|
||||
/* Print Rx Ring Summary */
|
||||
rx_ring_summary:
|
||||
dev_info(&adapter->pdev->dev, "RX Rings Summary\n");
|
||||
dev_info(&adapter->pdev->dev, "Rx Ring Summary\n");
|
||||
printk(KERN_INFO "Queue [NTU] [NTC]\n");
|
||||
printk(KERN_INFO " %5d %5X %5X\n", 0,
|
||||
rx_ring->next_to_use, rx_ring->next_to_clean);
|
||||
rx_ring->next_to_use, rx_ring->next_to_clean);
|
||||
|
||||
/* Print RX Rings */
|
||||
/* Print Rx Ring */
|
||||
if (!netif_msg_rx_status(adapter))
|
||||
goto exit;
|
||||
|
||||
dev_info(&adapter->pdev->dev, "RX Rings Dump\n");
|
||||
dev_info(&adapter->pdev->dev, "Rx Ring Dump\n");
|
||||
switch (adapter->rx_ps_pages) {
|
||||
case 1:
|
||||
case 2:
|
||||
@ -329,7 +334,7 @@ rx_ring_summary:
|
||||
* +-----------------------------------------------------+
|
||||
*/
|
||||
printk(KERN_INFO "R [desc] [buffer 0 63:0 ] "
|
||||
"[buffer 1 63:0 ] "
|
||||
"[buffer 1 63:0 ] "
|
||||
"[buffer 2 63:0 ] [buffer 3 63:0 ] [bi->dma ] "
|
||||
"[bi->skb] <-- Ext Pkt Split format\n");
|
||||
/* [Extended] Receive Descriptor (Write-Back) Format
|
||||
@ -344,7 +349,7 @@ rx_ring_summary:
|
||||
* 63 48 47 32 31 20 19 0
|
||||
*/
|
||||
printk(KERN_INFO "RWB[desc] [ck ipid mrqhsh] "
|
||||
"[vl l0 ee es] "
|
||||
"[vl l0 ee es] "
|
||||
"[ l3 l2 l1 hs] [reserved ] ---------------- "
|
||||
"[bi->skb] <-- Ext Rx Write-Back format\n");
|
||||
for (i = 0; i < rx_ring->count; i++) {
|
||||
@ -352,26 +357,26 @@ rx_ring_summary:
|
||||
rx_desc_ps = E1000_RX_DESC_PS(*rx_ring, i);
|
||||
u1 = (struct my_u1 *)rx_desc_ps;
|
||||
staterr =
|
||||
le32_to_cpu(rx_desc_ps->wb.middle.status_error);
|
||||
le32_to_cpu(rx_desc_ps->wb.middle.status_error);
|
||||
if (staterr & E1000_RXD_STAT_DD) {
|
||||
/* Descriptor Done */
|
||||
printk(KERN_INFO "RWB[0x%03X] %016llX "
|
||||
"%016llX %016llX %016llX "
|
||||
"---------------- %p", i,
|
||||
(unsigned long long)le64_to_cpu(u1->a),
|
||||
(unsigned long long)le64_to_cpu(u1->b),
|
||||
(unsigned long long)le64_to_cpu(u1->c),
|
||||
(unsigned long long)le64_to_cpu(u1->d),
|
||||
buffer_info->skb);
|
||||
"%016llX %016llX %016llX "
|
||||
"---------------- %p", i,
|
||||
(unsigned long long)le64_to_cpu(u1->a),
|
||||
(unsigned long long)le64_to_cpu(u1->b),
|
||||
(unsigned long long)le64_to_cpu(u1->c),
|
||||
(unsigned long long)le64_to_cpu(u1->d),
|
||||
buffer_info->skb);
|
||||
} else {
|
||||
printk(KERN_INFO "R [0x%03X] %016llX "
|
||||
"%016llX %016llX %016llX %016llX %p", i,
|
||||
(unsigned long long)le64_to_cpu(u1->a),
|
||||
(unsigned long long)le64_to_cpu(u1->b),
|
||||
(unsigned long long)le64_to_cpu(u1->c),
|
||||
(unsigned long long)le64_to_cpu(u1->d),
|
||||
(unsigned long long)buffer_info->dma,
|
||||
buffer_info->skb);
|
||||
"%016llX %016llX %016llX %016llX %p", i,
|
||||
(unsigned long long)le64_to_cpu(u1->a),
|
||||
(unsigned long long)le64_to_cpu(u1->b),
|
||||
(unsigned long long)le64_to_cpu(u1->c),
|
||||
(unsigned long long)le64_to_cpu(u1->d),
|
||||
(unsigned long long)buffer_info->dma,
|
||||
buffer_info->skb);
|
||||
|
||||
if (netif_msg_pktdata(adapter))
|
||||
print_hex_dump(KERN_INFO, "",
|
||||
@ -400,18 +405,18 @@ rx_ring_summary:
|
||||
* 63 48 47 40 39 32 31 16 15 0
|
||||
*/
|
||||
printk(KERN_INFO "Rl[desc] [address 63:0 ] "
|
||||
"[vl er S cks ln] [bi->dma ] [bi->skb] "
|
||||
"<-- Legacy format\n");
|
||||
"[vl er S cks ln] [bi->dma ] [bi->skb] "
|
||||
"<-- Legacy format\n");
|
||||
for (i = 0; rx_ring->desc && (i < rx_ring->count); i++) {
|
||||
rx_desc = E1000_RX_DESC(*rx_ring, i);
|
||||
buffer_info = &rx_ring->buffer_info[i];
|
||||
u0 = (struct my_u0 *)rx_desc;
|
||||
printk(KERN_INFO "Rl[0x%03X] %016llX %016llX "
|
||||
"%016llX %p", i,
|
||||
(unsigned long long)le64_to_cpu(u0->a),
|
||||
(unsigned long long)le64_to_cpu(u0->b),
|
||||
(unsigned long long)buffer_info->dma,
|
||||
buffer_info->skb);
|
||||
"%016llX %p", i,
|
||||
(unsigned long long)le64_to_cpu(u0->a),
|
||||
(unsigned long long)le64_to_cpu(u0->b),
|
||||
(unsigned long long)buffer_info->dma,
|
||||
buffer_info->skb);
|
||||
if (i == rx_ring->next_to_use)
|
||||
printk(KERN_CONT " NTU\n");
|
||||
else if (i == rx_ring->next_to_clean)
|
||||
@ -421,9 +426,10 @@ rx_ring_summary:
|
||||
|
||||
if (netif_msg_pktdata(adapter))
|
||||
print_hex_dump(KERN_INFO, "",
|
||||
DUMP_PREFIX_ADDRESS,
|
||||
16, 1, phys_to_virt(buffer_info->dma),
|
||||
adapter->rx_buffer_len, true);
|
||||
DUMP_PREFIX_ADDRESS,
|
||||
16, 1,
|
||||
phys_to_virt(buffer_info->dma),
|
||||
adapter->rx_buffer_len, true);
|
||||
}
|
||||
}
|
||||
|
||||
@ -450,8 +456,7 @@ static int e1000_desc_unused(struct e1000_ring *ring)
|
||||
* @skb: pointer to sk_buff to be indicated to stack
|
||||
**/
|
||||
static void e1000_receive_skb(struct e1000_adapter *adapter,
|
||||
struct net_device *netdev,
|
||||
struct sk_buff *skb,
|
||||
struct net_device *netdev, struct sk_buff *skb,
|
||||
u8 status, __le16 vlan)
|
||||
{
|
||||
skb->protocol = eth_type_trans(skb, netdev);
|
||||
@ -464,7 +469,7 @@ static void e1000_receive_skb(struct e1000_adapter *adapter,
|
||||
}
|
||||
|
||||
/**
|
||||
* e1000_rx_checksum - Receive Checksum Offload for 82543
|
||||
* e1000_rx_checksum - Receive Checksum Offload
|
||||
* @adapter: board private structure
|
||||
* @status_err: receive descriptor status and error fields
|
||||
* @csum: receive descriptor csum field
|
||||
@ -548,7 +553,7 @@ map_skb:
|
||||
adapter->rx_buffer_len,
|
||||
DMA_FROM_DEVICE);
|
||||
if (dma_mapping_error(&pdev->dev, buffer_info->dma)) {
|
||||
dev_err(&pdev->dev, "RX DMA map failed\n");
|
||||
dev_err(&pdev->dev, "Rx DMA map failed\n");
|
||||
adapter->rx_dma_failed++;
|
||||
break;
|
||||
}
|
||||
@ -601,7 +606,8 @@ static void e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter,
|
||||
ps_page = &buffer_info->ps_pages[j];
|
||||
if (j >= adapter->rx_ps_pages) {
|
||||
/* all unused desc entries get hw null ptr */
|
||||
rx_desc->read.buffer_addr[j+1] = ~cpu_to_le64(0);
|
||||
rx_desc->read.buffer_addr[j + 1] =
|
||||
~cpu_to_le64(0);
|
||||
continue;
|
||||
}
|
||||
if (!ps_page->page) {
|
||||
@ -617,7 +623,7 @@ static void e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter,
|
||||
if (dma_mapping_error(&pdev->dev,
|
||||
ps_page->dma)) {
|
||||
dev_err(&adapter->pdev->dev,
|
||||
"RX DMA page map failed\n");
|
||||
"Rx DMA page map failed\n");
|
||||
adapter->rx_dma_failed++;
|
||||
goto no_buffers;
|
||||
}
|
||||
@ -627,8 +633,8 @@ static void e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter,
|
||||
* didn't change because each write-back
|
||||
* erases this info.
|
||||
*/
|
||||
rx_desc->read.buffer_addr[j+1] =
|
||||
cpu_to_le64(ps_page->dma);
|
||||
rx_desc->read.buffer_addr[j + 1] =
|
||||
cpu_to_le64(ps_page->dma);
|
||||
}
|
||||
|
||||
skb = netdev_alloc_skb_ip_align(netdev,
|
||||
@ -644,7 +650,7 @@ static void e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter,
|
||||
adapter->rx_ps_bsize0,
|
||||
DMA_FROM_DEVICE);
|
||||
if (dma_mapping_error(&pdev->dev, buffer_info->dma)) {
|
||||
dev_err(&pdev->dev, "RX DMA map failed\n");
|
||||
dev_err(&pdev->dev, "Rx DMA map failed\n");
|
||||
adapter->rx_dma_failed++;
|
||||
/* cleanup skb */
|
||||
dev_kfree_skb_any(skb);
|
||||
@ -662,7 +668,7 @@ static void e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter,
|
||||
* such as IA-64).
|
||||
*/
|
||||
wmb();
|
||||
writel(i<<1, adapter->hw.hw_addr + rx_ring->tail);
|
||||
writel(i << 1, adapter->hw.hw_addr + rx_ring->tail);
|
||||
}
|
||||
|
||||
i++;
|
||||
@ -1106,11 +1112,10 @@ static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
|
||||
cleaned = 1;
|
||||
cleaned_count++;
|
||||
dma_unmap_single(&pdev->dev, buffer_info->dma,
|
||||
adapter->rx_ps_bsize0,
|
||||
DMA_FROM_DEVICE);
|
||||
adapter->rx_ps_bsize0, DMA_FROM_DEVICE);
|
||||
buffer_info->dma = 0;
|
||||
|
||||
/* see !EOP comment in other rx routine */
|
||||
/* see !EOP comment in other Rx routine */
|
||||
if (!(staterr & E1000_RXD_STAT_EOP))
|
||||
adapter->flags2 |= FLAG2_IS_DISCARDING;
|
||||
|
||||
@ -2610,7 +2615,7 @@ static void e1000_init_manageability_pt(struct e1000_adapter *adapter)
|
||||
}
|
||||
|
||||
/**
|
||||
* e1000_configure_tx - Configure 8254x Transmit Unit after Reset
|
||||
* e1000_configure_tx - Configure Transmit Unit after Reset
|
||||
* @adapter: board private structure
|
||||
*
|
||||
* Configure the Tx unit of the MAC after a reset.
|
||||
@ -2663,7 +2668,7 @@ static void e1000_configure_tx(struct e1000_adapter *adapter)
|
||||
* hthresh = 1 ==> prefetch when one or more available
|
||||
* pthresh = 0x1f ==> prefetch if internal cache 31 or less
|
||||
* BEWARE: this seems to work but should be considered first if
|
||||
* there are tx hangs or other tx related bugs
|
||||
* there are Tx hangs or other Tx related bugs
|
||||
*/
|
||||
txdctl |= E1000_TXDCTL_DMA_BURST_ENABLE;
|
||||
ew32(TXDCTL(0), txdctl);
|
||||
@ -2877,7 +2882,7 @@ static void e1000_configure_rx(struct e1000_adapter *adapter)
|
||||
if (adapter->rx_ps_pages) {
|
||||
/* this is a 32 byte descriptor */
|
||||
rdlen = rx_ring->count *
|
||||
sizeof(union e1000_rx_desc_packet_split);
|
||||
sizeof(union e1000_rx_desc_packet_split);
|
||||
adapter->clean_rx = e1000_clean_rx_irq_ps;
|
||||
adapter->alloc_rx_buf = e1000_alloc_rx_buffers_ps;
|
||||
} else if (adapter->netdev->mtu > ETH_FRAME_LEN + ETH_FCS_LEN) {
|
||||
@ -2900,7 +2905,7 @@ static void e1000_configure_rx(struct e1000_adapter *adapter)
|
||||
/*
|
||||
* set the writeback threshold (only takes effect if the RDTR
|
||||
* is set). set GRAN=1 and write back up to 0x4 worth, and
|
||||
* enable prefetching of 0x20 rx descriptors
|
||||
* enable prefetching of 0x20 Rx descriptors
|
||||
* granularity = 01
|
||||
* wthresh = 04,
|
||||
* hthresh = 04,
|
||||
@ -2981,12 +2986,10 @@ static void e1000_configure_rx(struct e1000_adapter *adapter)
|
||||
* excessive C-state transition latencies result in
|
||||
* dropped transactions.
|
||||
*/
|
||||
pm_qos_update_request(
|
||||
&adapter->netdev->pm_qos_req, 55);
|
||||
pm_qos_update_request(&adapter->netdev->pm_qos_req, 55);
|
||||
} else {
|
||||
pm_qos_update_request(
|
||||
&adapter->netdev->pm_qos_req,
|
||||
PM_QOS_DEFAULT_VALUE);
|
||||
pm_qos_update_request(&adapter->netdev->pm_qos_req,
|
||||
PM_QOS_DEFAULT_VALUE);
|
||||
}
|
||||
}
|
||||
|
||||
@ -3152,7 +3155,7 @@ void e1000e_reset(struct e1000_adapter *adapter)
|
||||
/* lower 16 bits has Rx packet buffer allocation size in KB */
|
||||
pba &= 0xffff;
|
||||
/*
|
||||
* the Tx fifo also stores 16 bytes of information about the tx
|
||||
* the Tx fifo also stores 16 bytes of information about the Tx
|
||||
* but don't include ethernet FCS because hardware appends it
|
||||
*/
|
||||
min_tx_space = (adapter->max_frame_size +
|
||||
@ -3175,7 +3178,7 @@ void e1000e_reset(struct e1000_adapter *adapter)
|
||||
pba -= min_tx_space - tx_space;
|
||||
|
||||
/*
|
||||
* if short on Rx space, Rx wins and must trump tx
|
||||
* if short on Rx space, Rx wins and must trump Tx
|
||||
* adjustment or use Early Receive if available
|
||||
*/
|
||||
if ((pba < min_rx_space) &&
|
||||
@ -4039,11 +4042,11 @@ static void e1000_print_link_info(struct e1000_adapter *adapter)
|
||||
adapter->netdev->name,
|
||||
adapter->link_speed,
|
||||
(adapter->link_duplex == FULL_DUPLEX) ?
|
||||
"Full Duplex" : "Half Duplex",
|
||||
"Full Duplex" : "Half Duplex",
|
||||
((ctrl & E1000_CTRL_TFCE) && (ctrl & E1000_CTRL_RFCE)) ?
|
||||
"RX/TX" :
|
||||
((ctrl & E1000_CTRL_RFCE) ? "RX" :
|
||||
((ctrl & E1000_CTRL_TFCE) ? "TX" : "None" )));
|
||||
"Rx/Tx" :
|
||||
((ctrl & E1000_CTRL_RFCE) ? "Rx" :
|
||||
((ctrl & E1000_CTRL_TFCE) ? "Tx" : "None")));
|
||||
}
|
||||
|
||||
static bool e1000e_has_link(struct e1000_adapter *adapter)
|
||||
@ -4338,7 +4341,7 @@ link_up:
|
||||
/* Force detection of hung controller every watchdog period */
|
||||
adapter->detect_tx_hung = 1;
|
||||
|
||||
/* flush partial descriptors to memory before detecting tx hang */
|
||||
/* flush partial descriptors to memory before detecting Tx hang */
|
||||
if (adapter->flags2 & FLAG2_DMA_BURST) {
|
||||
ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD);
|
||||
ew32(RDTR, adapter->rx_int_delay | E1000_RDTR_FPD);
|
||||
@ -4529,7 +4532,7 @@ static int e1000_tx_map(struct e1000_adapter *adapter,
|
||||
buffer_info->next_to_watch = i;
|
||||
buffer_info->dma = dma_map_single(&pdev->dev,
|
||||
skb->data + offset,
|
||||
size, DMA_TO_DEVICE);
|
||||
size, DMA_TO_DEVICE);
|
||||
buffer_info->mapped_as_page = false;
|
||||
if (dma_mapping_error(&pdev->dev, buffer_info->dma))
|
||||
goto dma_error;
|
||||
@ -4576,7 +4579,7 @@ static int e1000_tx_map(struct e1000_adapter *adapter,
|
||||
}
|
||||
}
|
||||
|
||||
segs = skb_shinfo(skb)->gso_segs ?: 1;
|
||||
segs = skb_shinfo(skb)->gso_segs ? : 1;
|
||||
/* multiply data chunks by size of headers */
|
||||
bytecount = ((segs - 1) * skb_headlen(skb)) + skb->len;
|
||||
|
||||
@ -4588,13 +4591,13 @@ static int e1000_tx_map(struct e1000_adapter *adapter,
|
||||
return count;
|
||||
|
||||
dma_error:
|
||||
dev_err(&pdev->dev, "TX DMA map failed\n");
|
||||
dev_err(&pdev->dev, "Tx DMA map failed\n");
|
||||
buffer_info->dma = 0;
|
||||
if (count)
|
||||
count--;
|
||||
|
||||
while (count--) {
|
||||
if (i==0)
|
||||
if (i == 0)
|
||||
i += tx_ring->count;
|
||||
i--;
|
||||
buffer_info = &tx_ring->buffer_info[i];
|
||||
@ -6193,7 +6196,7 @@ static int __init e1000_init_module(void)
|
||||
int ret;
|
||||
pr_info("Intel(R) PRO/1000 Network Driver - %s\n",
|
||||
e1000e_driver_version);
|
||||
pr_info("Copyright (c) 1999 - 2010 Intel Corporation.\n");
|
||||
pr_info("Copyright(c) 1999 - 2011 Intel Corporation.\n");
|
||||
ret = pci_register_driver(&e1000_driver);
|
||||
|
||||
return ret;
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*******************************************************************************
|
||||
|
||||
Intel PRO/1000 Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
@ -62,10 +62,9 @@ MODULE_PARM_DESC(copybreak,
|
||||
module_param_array_named(X, X, int, &num_##X, 0); \
|
||||
MODULE_PARM_DESC(X, desc);
|
||||
|
||||
|
||||
/*
|
||||
* Transmit Interrupt Delay in units of 1.024 microseconds
|
||||
* Tx interrupt delay needs to typically be set to something non zero
|
||||
* Tx interrupt delay needs to typically be set to something non-zero
|
||||
*
|
||||
* Valid Range: 0-65535
|
||||
*/
|
||||
@ -112,6 +111,7 @@ E1000_PARAM(InterruptThrottleRate, "Interrupt Throttling Rate");
|
||||
#define DEFAULT_ITR 3
|
||||
#define MAX_ITR 100000
|
||||
#define MIN_ITR 100
|
||||
|
||||
/* IntMode (Interrupt Mode)
|
||||
*
|
||||
* Valid Range: 0 - 2
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*******************************************************************************
|
||||
|
||||
Intel PRO/1000 Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
@ -640,7 +640,7 @@ s32 e1000_copper_link_setup_82577(struct e1000_hw *hw)
|
||||
s32 ret_val;
|
||||
u16 phy_data;
|
||||
|
||||
/* Enable CRS on TX. This must be set for half-duplex operation. */
|
||||
/* Enable CRS on Tx. This must be set for half-duplex operation. */
|
||||
ret_val = e1e_rphy(hw, I82577_CFG_REG, &phy_data);
|
||||
if (ret_val)
|
||||
goto out;
|
||||
|
@ -434,7 +434,6 @@ static void gfar_init_mac(struct net_device *ndev)
|
||||
static struct net_device_stats *gfar_get_stats(struct net_device *dev)
|
||||
{
|
||||
struct gfar_private *priv = netdev_priv(dev);
|
||||
struct netdev_queue *txq;
|
||||
unsigned long rx_packets = 0, rx_bytes = 0, rx_dropped = 0;
|
||||
unsigned long tx_packets = 0, tx_bytes = 0;
|
||||
int i = 0;
|
||||
@ -450,9 +449,8 @@ static struct net_device_stats *gfar_get_stats(struct net_device *dev)
|
||||
dev->stats.rx_dropped = rx_dropped;
|
||||
|
||||
for (i = 0; i < priv->num_tx_queues; i++) {
|
||||
txq = netdev_get_tx_queue(dev, i);
|
||||
tx_bytes += txq->tx_bytes;
|
||||
tx_packets += txq->tx_packets;
|
||||
tx_bytes += priv->tx_queue[i]->stats.tx_bytes;
|
||||
tx_packets += priv->tx_queue[i]->stats.tx_packets;
|
||||
}
|
||||
|
||||
dev->stats.tx_bytes = tx_bytes;
|
||||
@ -2109,8 +2107,8 @@ static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
}
|
||||
|
||||
/* Update transmit stats */
|
||||
txq->tx_bytes += skb->len;
|
||||
txq->tx_packets ++;
|
||||
tx_queue->stats.tx_bytes += skb->len;
|
||||
tx_queue->stats.tx_packets++;
|
||||
|
||||
txbdp = txbdp_start = tx_queue->cur_tx;
|
||||
lstatus = txbdp->lstatus;
|
||||
|
@ -907,12 +907,21 @@ enum {
|
||||
MQ_MG_MODE
|
||||
};
|
||||
|
||||
/*
|
||||
* Per TX queue stats
|
||||
*/
|
||||
struct tx_q_stats {
|
||||
unsigned long tx_packets;
|
||||
unsigned long tx_bytes;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct gfar_priv_tx_q - per tx queue structure
|
||||
* @txlock: per queue tx spin lock
|
||||
* @tx_skbuff:skb pointers
|
||||
* @skb_curtx: to be used skb pointer
|
||||
* @skb_dirtytx:the last used skb pointer
|
||||
* @stats: bytes/packets stats
|
||||
* @qindex: index of this queue
|
||||
* @dev: back pointer to the dev structure
|
||||
* @grp: back pointer to the group to which this queue belongs
|
||||
@ -934,6 +943,7 @@ struct gfar_priv_tx_q {
|
||||
struct txbd8 *tx_bd_base;
|
||||
struct txbd8 *cur_tx;
|
||||
struct txbd8 *dirty_tx;
|
||||
struct tx_q_stats stats;
|
||||
struct net_device *dev;
|
||||
struct gfar_priv_grp *grp;
|
||||
u16 skb_curtx;
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Aeroflex Gaisler GRETH 10/100/1G Ethernet MAC.
|
||||
*
|
||||
* 2005-2009 (c) Aeroflex Gaisler AB
|
||||
* 2005-2010 (c) Aeroflex Gaisler AB
|
||||
*
|
||||
* This driver supports GRETH 10/100 and GRETH 10/100/1G Ethernet MACs
|
||||
* available in the GRLIB VHDL IP core library.
|
||||
@ -356,6 +356,8 @@ static int greth_open(struct net_device *dev)
|
||||
dev_dbg(&dev->dev, " starting queue\n");
|
||||
netif_start_queue(dev);
|
||||
|
||||
GRETH_REGSAVE(greth->regs->status, 0xFF);
|
||||
|
||||
napi_enable(&greth->napi);
|
||||
|
||||
greth_enable_irqs(greth);
|
||||
@ -371,7 +373,9 @@ static int greth_close(struct net_device *dev)
|
||||
|
||||
napi_disable(&greth->napi);
|
||||
|
||||
greth_disable_irqs(greth);
|
||||
greth_disable_tx(greth);
|
||||
greth_disable_rx(greth);
|
||||
|
||||
netif_stop_queue(dev);
|
||||
|
||||
@ -388,12 +392,20 @@ greth_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
struct greth_private *greth = netdev_priv(dev);
|
||||
struct greth_bd *bdp;
|
||||
int err = NETDEV_TX_OK;
|
||||
u32 status, dma_addr;
|
||||
u32 status, dma_addr, ctrl;
|
||||
unsigned long flags;
|
||||
|
||||
bdp = greth->tx_bd_base + greth->tx_next;
|
||||
/* Clean TX Ring */
|
||||
greth_clean_tx(greth->netdev);
|
||||
|
||||
if (unlikely(greth->tx_free <= 0)) {
|
||||
spin_lock_irqsave(&greth->devlock, flags);/*save from poll/irq*/
|
||||
ctrl = GRETH_REGLOAD(greth->regs->control);
|
||||
/* Enable TX IRQ only if not already in poll() routine */
|
||||
if (ctrl & GRETH_RXI)
|
||||
GRETH_REGSAVE(greth->regs->control, ctrl | GRETH_TXI);
|
||||
netif_stop_queue(dev);
|
||||
spin_unlock_irqrestore(&greth->devlock, flags);
|
||||
return NETDEV_TX_BUSY;
|
||||
}
|
||||
|
||||
@ -406,13 +418,14 @@ greth_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
goto out;
|
||||
}
|
||||
|
||||
bdp = greth->tx_bd_base + greth->tx_next;
|
||||
dma_addr = greth_read_bd(&bdp->addr);
|
||||
|
||||
memcpy((unsigned char *) phys_to_virt(dma_addr), skb->data, skb->len);
|
||||
|
||||
dma_sync_single_for_device(greth->dev, dma_addr, skb->len, DMA_TO_DEVICE);
|
||||
|
||||
status = GRETH_BD_EN | (skb->len & GRETH_BD_LEN);
|
||||
status = GRETH_BD_EN | GRETH_BD_IE | (skb->len & GRETH_BD_LEN);
|
||||
|
||||
/* Wrap around descriptor ring */
|
||||
if (greth->tx_next == GRETH_TXBD_NUM_MASK) {
|
||||
@ -422,22 +435,11 @@ greth_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
greth->tx_next = NEXT_TX(greth->tx_next);
|
||||
greth->tx_free--;
|
||||
|
||||
/* No more descriptors */
|
||||
if (unlikely(greth->tx_free == 0)) {
|
||||
|
||||
/* Free transmitted descriptors */
|
||||
greth_clean_tx(dev);
|
||||
|
||||
/* If nothing was cleaned, stop queue & wait for irq */
|
||||
if (unlikely(greth->tx_free == 0)) {
|
||||
status |= GRETH_BD_IE;
|
||||
netif_stop_queue(dev);
|
||||
}
|
||||
}
|
||||
|
||||
/* Write descriptor control word and enable transmission */
|
||||
greth_write_bd(&bdp->stat, status);
|
||||
spin_lock_irqsave(&greth->devlock, flags); /*save from poll/irq*/
|
||||
greth_enable_tx(greth);
|
||||
spin_unlock_irqrestore(&greth->devlock, flags);
|
||||
|
||||
out:
|
||||
dev_kfree_skb(skb);
|
||||
@ -450,13 +452,23 @@ greth_start_xmit_gbit(struct sk_buff *skb, struct net_device *dev)
|
||||
{
|
||||
struct greth_private *greth = netdev_priv(dev);
|
||||
struct greth_bd *bdp;
|
||||
u32 status = 0, dma_addr;
|
||||
u32 status = 0, dma_addr, ctrl;
|
||||
int curr_tx, nr_frags, i, err = NETDEV_TX_OK;
|
||||
unsigned long flags;
|
||||
|
||||
nr_frags = skb_shinfo(skb)->nr_frags;
|
||||
|
||||
/* Clean TX Ring */
|
||||
greth_clean_tx_gbit(dev);
|
||||
|
||||
if (greth->tx_free < nr_frags + 1) {
|
||||
spin_lock_irqsave(&greth->devlock, flags);/*save from poll/irq*/
|
||||
ctrl = GRETH_REGLOAD(greth->regs->control);
|
||||
/* Enable TX IRQ only if not already in poll() routine */
|
||||
if (ctrl & GRETH_RXI)
|
||||
GRETH_REGSAVE(greth->regs->control, ctrl | GRETH_TXI);
|
||||
netif_stop_queue(dev);
|
||||
spin_unlock_irqrestore(&greth->devlock, flags);
|
||||
err = NETDEV_TX_BUSY;
|
||||
goto out;
|
||||
}
|
||||
@ -499,7 +511,7 @@ greth_start_xmit_gbit(struct sk_buff *skb, struct net_device *dev)
|
||||
greth->tx_skbuff[curr_tx] = NULL;
|
||||
bdp = greth->tx_bd_base + curr_tx;
|
||||
|
||||
status = GRETH_TXBD_CSALL;
|
||||
status = GRETH_TXBD_CSALL | GRETH_BD_EN;
|
||||
status |= frag->size & GRETH_BD_LEN;
|
||||
|
||||
/* Wrap around descriptor ring */
|
||||
@ -509,14 +521,8 @@ greth_start_xmit_gbit(struct sk_buff *skb, struct net_device *dev)
|
||||
/* More fragments left */
|
||||
if (i < nr_frags - 1)
|
||||
status |= GRETH_TXBD_MORE;
|
||||
|
||||
/* ... last fragment, check if out of descriptors */
|
||||
else if (greth->tx_free - nr_frags - 1 < (MAX_SKB_FRAGS + 1)) {
|
||||
|
||||
/* Enable interrupts and stop queue */
|
||||
status |= GRETH_BD_IE;
|
||||
netif_stop_queue(dev);
|
||||
}
|
||||
else
|
||||
status |= GRETH_BD_IE; /* enable IRQ on last fragment */
|
||||
|
||||
greth_write_bd(&bdp->stat, status);
|
||||
|
||||
@ -536,26 +542,29 @@ greth_start_xmit_gbit(struct sk_buff *skb, struct net_device *dev)
|
||||
|
||||
wmb();
|
||||
|
||||
/* Enable the descriptors that we configured ... */
|
||||
for (i = 0; i < nr_frags + 1; i++) {
|
||||
bdp = greth->tx_bd_base + greth->tx_next;
|
||||
greth_write_bd(&bdp->stat, greth_read_bd(&bdp->stat) | GRETH_BD_EN);
|
||||
greth->tx_next = NEXT_TX(greth->tx_next);
|
||||
greth->tx_free--;
|
||||
}
|
||||
/* Enable the descriptor chain by enabling the first descriptor */
|
||||
bdp = greth->tx_bd_base + greth->tx_next;
|
||||
greth_write_bd(&bdp->stat, greth_read_bd(&bdp->stat) | GRETH_BD_EN);
|
||||
greth->tx_next = curr_tx;
|
||||
greth->tx_free -= nr_frags + 1;
|
||||
|
||||
wmb();
|
||||
|
||||
spin_lock_irqsave(&greth->devlock, flags); /*save from poll/irq*/
|
||||
greth_enable_tx(greth);
|
||||
spin_unlock_irqrestore(&greth->devlock, flags);
|
||||
|
||||
return NETDEV_TX_OK;
|
||||
|
||||
frag_map_error:
|
||||
/* Unmap SKB mappings that succeeded */
|
||||
/* Unmap SKB mappings that succeeded and disable descriptor */
|
||||
for (i = 0; greth->tx_next + i != curr_tx; i++) {
|
||||
bdp = greth->tx_bd_base + greth->tx_next + i;
|
||||
dma_unmap_single(greth->dev,
|
||||
greth_read_bd(&bdp->addr),
|
||||
greth_read_bd(&bdp->stat) & GRETH_BD_LEN,
|
||||
DMA_TO_DEVICE);
|
||||
greth_write_bd(&bdp->stat, 0);
|
||||
}
|
||||
map_error:
|
||||
if (net_ratelimit())
|
||||
@ -565,12 +574,11 @@ out:
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
static irqreturn_t greth_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
struct net_device *dev = dev_id;
|
||||
struct greth_private *greth;
|
||||
u32 status;
|
||||
u32 status, ctrl;
|
||||
irqreturn_t retval = IRQ_NONE;
|
||||
|
||||
greth = netdev_priv(dev);
|
||||
@ -580,13 +588,15 @@ static irqreturn_t greth_interrupt(int irq, void *dev_id)
|
||||
/* Get the interrupt events that caused us to be here. */
|
||||
status = GRETH_REGLOAD(greth->regs->status);
|
||||
|
||||
/* Must see if interrupts are enabled also, INT_TX|INT_RX flags may be
|
||||
* set regardless of whether IRQ is enabled or not. Especially
|
||||
* important when shared IRQ.
|
||||
*/
|
||||
ctrl = GRETH_REGLOAD(greth->regs->control);
|
||||
|
||||
/* Handle rx and tx interrupts through poll */
|
||||
if (status & (GRETH_INT_RX | GRETH_INT_TX)) {
|
||||
|
||||
/* Clear interrupt status */
|
||||
GRETH_REGORIN(greth->regs->status,
|
||||
status & (GRETH_INT_RX | GRETH_INT_TX));
|
||||
|
||||
if (((status & (GRETH_INT_RE | GRETH_INT_RX)) && (ctrl & GRETH_RXI)) ||
|
||||
((status & (GRETH_INT_TE | GRETH_INT_TX)) && (ctrl & GRETH_TXI))) {
|
||||
retval = IRQ_HANDLED;
|
||||
|
||||
/* Disable interrupts and schedule poll() */
|
||||
@ -610,6 +620,8 @@ static void greth_clean_tx(struct net_device *dev)
|
||||
|
||||
while (1) {
|
||||
bdp = greth->tx_bd_base + greth->tx_last;
|
||||
GRETH_REGSAVE(greth->regs->status, GRETH_INT_TE | GRETH_INT_TX);
|
||||
mb();
|
||||
stat = greth_read_bd(&bdp->stat);
|
||||
|
||||
if (unlikely(stat & GRETH_BD_EN))
|
||||
@ -670,7 +682,10 @@ static void greth_clean_tx_gbit(struct net_device *dev)
|
||||
|
||||
/* We only clean fully completed SKBs */
|
||||
bdp_last_frag = greth->tx_bd_base + SKIP_TX(greth->tx_last, nr_frags);
|
||||
stat = bdp_last_frag->stat;
|
||||
|
||||
GRETH_REGSAVE(greth->regs->status, GRETH_INT_TE | GRETH_INT_TX);
|
||||
mb();
|
||||
stat = greth_read_bd(&bdp_last_frag->stat);
|
||||
|
||||
if (stat & GRETH_BD_EN)
|
||||
break;
|
||||
@ -702,21 +717,9 @@ static void greth_clean_tx_gbit(struct net_device *dev)
|
||||
greth->tx_free += nr_frags+1;
|
||||
dev_kfree_skb(skb);
|
||||
}
|
||||
if (greth->tx_free > (MAX_SKB_FRAGS + 1)) {
|
||||
netif_wake_queue(dev);
|
||||
}
|
||||
}
|
||||
|
||||
static int greth_pending_packets(struct greth_private *greth)
|
||||
{
|
||||
struct greth_bd *bdp;
|
||||
u32 status;
|
||||
bdp = greth->rx_bd_base + greth->rx_cur;
|
||||
status = greth_read_bd(&bdp->stat);
|
||||
if (status & GRETH_BD_EN)
|
||||
return 0;
|
||||
else
|
||||
return 1;
|
||||
if (netif_queue_stopped(dev) && (greth->tx_free > (MAX_SKB_FRAGS+1)))
|
||||
netif_wake_queue(dev);
|
||||
}
|
||||
|
||||
static int greth_rx(struct net_device *dev, int limit)
|
||||
@ -727,20 +730,24 @@ static int greth_rx(struct net_device *dev, int limit)
|
||||
int pkt_len;
|
||||
int bad, count;
|
||||
u32 status, dma_addr;
|
||||
unsigned long flags;
|
||||
|
||||
greth = netdev_priv(dev);
|
||||
|
||||
for (count = 0; count < limit; ++count) {
|
||||
|
||||
bdp = greth->rx_bd_base + greth->rx_cur;
|
||||
GRETH_REGSAVE(greth->regs->status, GRETH_INT_RE | GRETH_INT_RX);
|
||||
mb();
|
||||
status = greth_read_bd(&bdp->stat);
|
||||
dma_addr = greth_read_bd(&bdp->addr);
|
||||
bad = 0;
|
||||
|
||||
if (unlikely(status & GRETH_BD_EN)) {
|
||||
break;
|
||||
}
|
||||
|
||||
dma_addr = greth_read_bd(&bdp->addr);
|
||||
bad = 0;
|
||||
|
||||
/* Check status for errors. */
|
||||
if (unlikely(status & GRETH_RXBD_STATUS)) {
|
||||
if (status & GRETH_RXBD_ERR_FT) {
|
||||
@ -802,7 +809,9 @@ static int greth_rx(struct net_device *dev, int limit)
|
||||
|
||||
dma_sync_single_for_device(greth->dev, dma_addr, MAX_FRAME_SIZE, DMA_FROM_DEVICE);
|
||||
|
||||
spin_lock_irqsave(&greth->devlock, flags); /* save from XMIT */
|
||||
greth_enable_rx(greth);
|
||||
spin_unlock_irqrestore(&greth->devlock, flags);
|
||||
|
||||
greth->rx_cur = NEXT_RX(greth->rx_cur);
|
||||
}
|
||||
@ -836,6 +845,7 @@ static int greth_rx_gbit(struct net_device *dev, int limit)
|
||||
int pkt_len;
|
||||
int bad, count = 0;
|
||||
u32 status, dma_addr;
|
||||
unsigned long flags;
|
||||
|
||||
greth = netdev_priv(dev);
|
||||
|
||||
@ -843,6 +853,8 @@ static int greth_rx_gbit(struct net_device *dev, int limit)
|
||||
|
||||
bdp = greth->rx_bd_base + greth->rx_cur;
|
||||
skb = greth->rx_skbuff[greth->rx_cur];
|
||||
GRETH_REGSAVE(greth->regs->status, GRETH_INT_RE | GRETH_INT_RX);
|
||||
mb();
|
||||
status = greth_read_bd(&bdp->stat);
|
||||
bad = 0;
|
||||
|
||||
@ -865,10 +877,9 @@ static int greth_rx_gbit(struct net_device *dev, int limit)
|
||||
}
|
||||
}
|
||||
|
||||
/* Allocate new skb to replace current */
|
||||
newskb = netdev_alloc_skb(dev, MAX_FRAME_SIZE + NET_IP_ALIGN);
|
||||
|
||||
if (!bad && newskb) {
|
||||
/* Allocate new skb to replace current, not needed if the
|
||||
* current skb can be reused */
|
||||
if (!bad && (newskb=netdev_alloc_skb(dev, MAX_FRAME_SIZE + NET_IP_ALIGN))) {
|
||||
skb_reserve(newskb, NET_IP_ALIGN);
|
||||
|
||||
dma_addr = dma_map_single(greth->dev,
|
||||
@ -905,11 +916,22 @@ static int greth_rx_gbit(struct net_device *dev, int limit)
|
||||
if (net_ratelimit())
|
||||
dev_warn(greth->dev, "Could not create DMA mapping, dropping packet\n");
|
||||
dev_kfree_skb(newskb);
|
||||
/* reusing current skb, so it is a drop */
|
||||
dev->stats.rx_dropped++;
|
||||
}
|
||||
} else if (bad) {
|
||||
/* Bad Frame transfer, the skb is reused */
|
||||
dev->stats.rx_dropped++;
|
||||
} else {
|
||||
/* Failed Allocating a new skb. This is rather stupid
|
||||
* but the current "filled" skb is reused, as if
|
||||
* transfer failure. One could argue that RX descriptor
|
||||
* table handling should be divided into cleaning and
|
||||
* filling as the TX part of the driver
|
||||
*/
|
||||
if (net_ratelimit())
|
||||
dev_warn(greth->dev, "Could not allocate SKB, dropping packet\n");
|
||||
/* reusing current skb, so it is a drop */
|
||||
dev->stats.rx_dropped++;
|
||||
}
|
||||
|
||||
@ -920,7 +942,9 @@ static int greth_rx_gbit(struct net_device *dev, int limit)
|
||||
|
||||
wmb();
|
||||
greth_write_bd(&bdp->stat, status);
|
||||
spin_lock_irqsave(&greth->devlock, flags);
|
||||
greth_enable_rx(greth);
|
||||
spin_unlock_irqrestore(&greth->devlock, flags);
|
||||
greth->rx_cur = NEXT_RX(greth->rx_cur);
|
||||
}
|
||||
|
||||
@ -932,15 +956,18 @@ static int greth_poll(struct napi_struct *napi, int budget)
|
||||
{
|
||||
struct greth_private *greth;
|
||||
int work_done = 0;
|
||||
unsigned long flags;
|
||||
u32 mask, ctrl;
|
||||
greth = container_of(napi, struct greth_private, napi);
|
||||
|
||||
if (greth->gbit_mac) {
|
||||
greth_clean_tx_gbit(greth->netdev);
|
||||
} else {
|
||||
greth_clean_tx(greth->netdev);
|
||||
restart_txrx_poll:
|
||||
if (netif_queue_stopped(greth->netdev)) {
|
||||
if (greth->gbit_mac)
|
||||
greth_clean_tx_gbit(greth->netdev);
|
||||
else
|
||||
greth_clean_tx(greth->netdev);
|
||||
}
|
||||
|
||||
restart_poll:
|
||||
if (greth->gbit_mac) {
|
||||
work_done += greth_rx_gbit(greth->netdev, budget - work_done);
|
||||
} else {
|
||||
@ -949,15 +976,29 @@ restart_poll:
|
||||
|
||||
if (work_done < budget) {
|
||||
|
||||
napi_complete(napi);
|
||||
spin_lock_irqsave(&greth->devlock, flags);
|
||||
|
||||
if (greth_pending_packets(greth)) {
|
||||
napi_reschedule(napi);
|
||||
goto restart_poll;
|
||||
ctrl = GRETH_REGLOAD(greth->regs->control);
|
||||
if (netif_queue_stopped(greth->netdev)) {
|
||||
GRETH_REGSAVE(greth->regs->control,
|
||||
ctrl | GRETH_TXI | GRETH_RXI);
|
||||
mask = GRETH_INT_RX | GRETH_INT_RE |
|
||||
GRETH_INT_TX | GRETH_INT_TE;
|
||||
} else {
|
||||
GRETH_REGSAVE(greth->regs->control, ctrl | GRETH_RXI);
|
||||
mask = GRETH_INT_RX | GRETH_INT_RE;
|
||||
}
|
||||
|
||||
if (GRETH_REGLOAD(greth->regs->status) & mask) {
|
||||
GRETH_REGSAVE(greth->regs->control, ctrl);
|
||||
spin_unlock_irqrestore(&greth->devlock, flags);
|
||||
goto restart_txrx_poll;
|
||||
} else {
|
||||
__napi_complete(napi);
|
||||
spin_unlock_irqrestore(&greth->devlock, flags);
|
||||
}
|
||||
}
|
||||
|
||||
greth_enable_irqs(greth);
|
||||
return work_done;
|
||||
}
|
||||
|
||||
@ -1152,11 +1193,11 @@ static const struct ethtool_ops greth_ethtool_ops = {
|
||||
};
|
||||
|
||||
static struct net_device_ops greth_netdev_ops = {
|
||||
.ndo_open = greth_open,
|
||||
.ndo_stop = greth_close,
|
||||
.ndo_start_xmit = greth_start_xmit,
|
||||
.ndo_set_mac_address = greth_set_mac_add,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
.ndo_open = greth_open,
|
||||
.ndo_stop = greth_close,
|
||||
.ndo_start_xmit = greth_start_xmit,
|
||||
.ndo_set_mac_address = greth_set_mac_add,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
};
|
||||
|
||||
static inline int wait_for_mdio(struct greth_private *greth)
|
||||
@ -1217,29 +1258,26 @@ static void greth_link_change(struct net_device *dev)
|
||||
struct greth_private *greth = netdev_priv(dev);
|
||||
struct phy_device *phydev = greth->phy;
|
||||
unsigned long flags;
|
||||
|
||||
int status_change = 0;
|
||||
u32 ctrl;
|
||||
|
||||
spin_lock_irqsave(&greth->devlock, flags);
|
||||
|
||||
if (phydev->link) {
|
||||
|
||||
if ((greth->speed != phydev->speed) || (greth->duplex != phydev->duplex)) {
|
||||
|
||||
GRETH_REGANDIN(greth->regs->control,
|
||||
~(GRETH_CTRL_FD | GRETH_CTRL_SP | GRETH_CTRL_GB));
|
||||
ctrl = GRETH_REGLOAD(greth->regs->control) &
|
||||
~(GRETH_CTRL_FD | GRETH_CTRL_SP | GRETH_CTRL_GB);
|
||||
|
||||
if (phydev->duplex)
|
||||
GRETH_REGORIN(greth->regs->control, GRETH_CTRL_FD);
|
||||
|
||||
if (phydev->speed == SPEED_100) {
|
||||
|
||||
GRETH_REGORIN(greth->regs->control, GRETH_CTRL_SP);
|
||||
}
|
||||
ctrl |= GRETH_CTRL_FD;
|
||||
|
||||
if (phydev->speed == SPEED_100)
|
||||
ctrl |= GRETH_CTRL_SP;
|
||||
else if (phydev->speed == SPEED_1000)
|
||||
GRETH_REGORIN(greth->regs->control, GRETH_CTRL_GB);
|
||||
ctrl |= GRETH_CTRL_GB;
|
||||
|
||||
GRETH_REGSAVE(greth->regs->control, ctrl);
|
||||
greth->speed = phydev->speed;
|
||||
greth->duplex = phydev->duplex;
|
||||
status_change = 1;
|
||||
@ -1600,6 +1638,9 @@ static struct of_device_id greth_of_match[] = {
|
||||
{
|
||||
.name = "GAISLER_ETHMAC",
|
||||
},
|
||||
{
|
||||
.name = "01_01d",
|
||||
},
|
||||
{},
|
||||
};
|
||||
|
||||
|
@ -23,6 +23,7 @@
|
||||
#define GRETH_BD_LEN 0x7FF
|
||||
|
||||
#define GRETH_TXEN 0x1
|
||||
#define GRETH_INT_TE 0x2
|
||||
#define GRETH_INT_TX 0x8
|
||||
#define GRETH_TXI 0x4
|
||||
#define GRETH_TXBD_STATUS 0x0001C000
|
||||
@ -35,6 +36,7 @@
|
||||
#define GRETH_TXBD_ERR_UE 0x4000
|
||||
#define GRETH_TXBD_ERR_AL 0x8000
|
||||
|
||||
#define GRETH_INT_RE 0x1
|
||||
#define GRETH_INT_RX 0x4
|
||||
#define GRETH_RXEN 0x2
|
||||
#define GRETH_RXI 0x8
|
||||
|
@ -6667,8 +6667,6 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb,
|
||||
struct ixgbe_adapter *adapter,
|
||||
struct ixgbe_ring *tx_ring)
|
||||
{
|
||||
struct net_device *netdev = tx_ring->netdev;
|
||||
struct netdev_queue *txq;
|
||||
unsigned int first;
|
||||
unsigned int tx_flags = 0;
|
||||
u8 hdr_len = 0;
|
||||
@ -6765,9 +6763,6 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb,
|
||||
/* add the ATR filter if ATR is on */
|
||||
if (test_bit(__IXGBE_TX_FDIR_INIT_DONE, &tx_ring->state))
|
||||
ixgbe_atr(tx_ring, skb, tx_flags, protocol);
|
||||
txq = netdev_get_tx_queue(netdev, tx_ring->queue_index);
|
||||
txq->tx_bytes += skb->len;
|
||||
txq->tx_packets++;
|
||||
ixgbe_tx_queue(tx_ring, tx_flags, count, skb->len, hdr_len);
|
||||
ixgbe_maybe_stop_tx(tx_ring, DESC_NEEDED);
|
||||
|
||||
@ -6925,8 +6920,6 @@ static struct rtnl_link_stats64 *ixgbe_get_stats64(struct net_device *netdev,
|
||||
struct ixgbe_adapter *adapter = netdev_priv(netdev);
|
||||
int i;
|
||||
|
||||
/* accurate rx/tx bytes/packets stats */
|
||||
dev_txq_stats_fold(netdev, stats);
|
||||
rcu_read_lock();
|
||||
for (i = 0; i < adapter->num_rx_queues; i++) {
|
||||
struct ixgbe_ring *ring = ACCESS_ONCE(adapter->rx_ring[i]);
|
||||
@ -6943,6 +6936,22 @@ static struct rtnl_link_stats64 *ixgbe_get_stats64(struct net_device *netdev,
|
||||
stats->rx_bytes += bytes;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < adapter->num_tx_queues; i++) {
|
||||
struct ixgbe_ring *ring = ACCESS_ONCE(adapter->tx_ring[i]);
|
||||
u64 bytes, packets;
|
||||
unsigned int start;
|
||||
|
||||
if (ring) {
|
||||
do {
|
||||
start = u64_stats_fetch_begin_bh(&ring->syncp);
|
||||
packets = ring->stats.packets;
|
||||
bytes = ring->stats.bytes;
|
||||
} while (u64_stats_fetch_retry_bh(&ring->syncp, start));
|
||||
stats->tx_packets += packets;
|
||||
stats->tx_bytes += bytes;
|
||||
}
|
||||
}
|
||||
rcu_read_unlock();
|
||||
/* following stats updated by ixgbe_watchdog_task() */
|
||||
stats->multicast = netdev->stats.multicast;
|
||||
|
@ -585,7 +585,7 @@ err:
|
||||
rcu_read_lock_bh();
|
||||
vlan = rcu_dereference(q->vlan);
|
||||
if (vlan)
|
||||
netdev_get_tx_queue(vlan->dev, 0)->tx_dropped++;
|
||||
vlan->dev->stats.tx_dropped++;
|
||||
rcu_read_unlock_bh();
|
||||
|
||||
return err;
|
||||
|
@ -554,6 +554,8 @@ struct rtl8169_private {
|
||||
struct mii_if_info mii;
|
||||
struct rtl8169_counters counters;
|
||||
u32 saved_wolopts;
|
||||
|
||||
const struct firmware *fw;
|
||||
};
|
||||
|
||||
MODULE_AUTHOR("Realtek and the Linux r8169 crew <netdev@vger.kernel.org>");
|
||||
@ -1766,6 +1768,29 @@ rtl_phy_write_fw(struct rtl8169_private *tp, const struct firmware *fw)
|
||||
}
|
||||
}
|
||||
|
||||
static void rtl_release_firmware(struct rtl8169_private *tp)
|
||||
{
|
||||
release_firmware(tp->fw);
|
||||
tp->fw = NULL;
|
||||
}
|
||||
|
||||
static int rtl_apply_firmware(struct rtl8169_private *tp, const char *fw_name)
|
||||
{
|
||||
const struct firmware **fw = &tp->fw;
|
||||
int rc = !*fw;
|
||||
|
||||
if (rc) {
|
||||
rc = request_firmware(fw, fw_name, &tp->pci_dev->dev);
|
||||
if (rc < 0)
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* TODO: release firmware once rtl_phy_write_fw signals failures. */
|
||||
rtl_phy_write_fw(tp, *fw);
|
||||
out:
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void rtl8169s_hw_phy_config(struct rtl8169_private *tp)
|
||||
{
|
||||
static const struct phy_reg phy_reg_init[] = {
|
||||
@ -2139,7 +2164,6 @@ static void rtl8168d_1_hw_phy_config(struct rtl8169_private *tp)
|
||||
{ 0x0d, 0xf880 }
|
||||
};
|
||||
void __iomem *ioaddr = tp->mmio_addr;
|
||||
const struct firmware *fw;
|
||||
|
||||
rtl_writephy_batch(tp, phy_reg_init_0, ARRAY_SIZE(phy_reg_init_0));
|
||||
|
||||
@ -2203,11 +2227,8 @@ static void rtl8168d_1_hw_phy_config(struct rtl8169_private *tp)
|
||||
|
||||
rtl_writephy(tp, 0x1f, 0x0005);
|
||||
rtl_writephy(tp, 0x05, 0x001b);
|
||||
if (rtl_readphy(tp, 0x06) == 0xbf00 &&
|
||||
request_firmware(&fw, FIRMWARE_8168D_1, &tp->pci_dev->dev) == 0) {
|
||||
rtl_phy_write_fw(tp, fw);
|
||||
release_firmware(fw);
|
||||
} else {
|
||||
if ((rtl_readphy(tp, 0x06) != 0xbf00) ||
|
||||
(rtl_apply_firmware(tp, FIRMWARE_8168D_1) < 0)) {
|
||||
netif_warn(tp, probe, tp->dev, "unable to apply firmware patch\n");
|
||||
}
|
||||
|
||||
@ -2257,7 +2278,6 @@ static void rtl8168d_2_hw_phy_config(struct rtl8169_private *tp)
|
||||
{ 0x0d, 0xf880 }
|
||||
};
|
||||
void __iomem *ioaddr = tp->mmio_addr;
|
||||
const struct firmware *fw;
|
||||
|
||||
rtl_writephy_batch(tp, phy_reg_init_0, ARRAY_SIZE(phy_reg_init_0));
|
||||
|
||||
@ -2312,11 +2332,8 @@ static void rtl8168d_2_hw_phy_config(struct rtl8169_private *tp)
|
||||
|
||||
rtl_writephy(tp, 0x1f, 0x0005);
|
||||
rtl_writephy(tp, 0x05, 0x001b);
|
||||
if (rtl_readphy(tp, 0x06) == 0xb300 &&
|
||||
request_firmware(&fw, FIRMWARE_8168D_2, &tp->pci_dev->dev) == 0) {
|
||||
rtl_phy_write_fw(tp, fw);
|
||||
release_firmware(fw);
|
||||
} else {
|
||||
if ((rtl_readphy(tp, 0x06) != 0xb300) ||
|
||||
(rtl_apply_firmware(tp, FIRMWARE_8168D_2) < 0)) {
|
||||
netif_warn(tp, probe, tp->dev, "unable to apply firmware patch\n");
|
||||
}
|
||||
|
||||
@ -3200,6 +3217,8 @@ static void __devexit rtl8169_remove_one(struct pci_dev *pdev)
|
||||
|
||||
cancel_delayed_work_sync(&tp->task);
|
||||
|
||||
rtl_release_firmware(tp);
|
||||
|
||||
unregister_netdev(dev);
|
||||
|
||||
if (pci_dev_run_wake(pdev))
|
||||
|
@ -1153,6 +1153,9 @@ static int efx_wanted_channels(void)
|
||||
int count;
|
||||
int cpu;
|
||||
|
||||
if (rss_cpus)
|
||||
return rss_cpus;
|
||||
|
||||
if (unlikely(!zalloc_cpumask_var(&core_mask, GFP_KERNEL))) {
|
||||
printk(KERN_WARNING
|
||||
"sfc: RSS disabled due to allocation failure\n");
|
||||
@ -1266,27 +1269,18 @@ static void efx_remove_interrupts(struct efx_nic *efx)
|
||||
efx->legacy_irq = 0;
|
||||
}
|
||||
|
||||
struct efx_tx_queue *
|
||||
efx_get_tx_queue(struct efx_nic *efx, unsigned index, unsigned type)
|
||||
{
|
||||
unsigned tx_channel_offset =
|
||||
separate_tx_channels ? efx->n_channels - efx->n_tx_channels : 0;
|
||||
EFX_BUG_ON_PARANOID(index >= efx->n_tx_channels ||
|
||||
type >= EFX_TXQ_TYPES);
|
||||
return &efx->channel[tx_channel_offset + index]->tx_queue[type];
|
||||
}
|
||||
|
||||
static void efx_set_channels(struct efx_nic *efx)
|
||||
{
|
||||
struct efx_channel *channel;
|
||||
struct efx_tx_queue *tx_queue;
|
||||
unsigned tx_channel_offset =
|
||||
|
||||
efx->tx_channel_offset =
|
||||
separate_tx_channels ? efx->n_channels - efx->n_tx_channels : 0;
|
||||
|
||||
/* Channel pointers were set in efx_init_struct() but we now
|
||||
* need to clear them for TX queues in any RX-only channels. */
|
||||
efx_for_each_channel(channel, efx) {
|
||||
if (channel->channel - tx_channel_offset >=
|
||||
if (channel->channel - efx->tx_channel_offset >=
|
||||
efx->n_tx_channels) {
|
||||
efx_for_each_channel_tx_queue(tx_queue, channel)
|
||||
tx_queue->channel = NULL;
|
||||
|
@ -735,6 +735,7 @@ struct efx_nic {
|
||||
unsigned next_buffer_table;
|
||||
unsigned n_channels;
|
||||
unsigned n_rx_channels;
|
||||
unsigned tx_channel_offset;
|
||||
unsigned n_tx_channels;
|
||||
unsigned int rx_buffer_len;
|
||||
unsigned int rx_buffer_order;
|
||||
@ -929,8 +930,13 @@ efx_get_channel(struct efx_nic *efx, unsigned index)
|
||||
_channel = (_channel->channel + 1 < (_efx)->n_channels) ? \
|
||||
(_efx)->channel[_channel->channel + 1] : NULL)
|
||||
|
||||
extern struct efx_tx_queue *
|
||||
efx_get_tx_queue(struct efx_nic *efx, unsigned index, unsigned type);
|
||||
static inline struct efx_tx_queue *
|
||||
efx_get_tx_queue(struct efx_nic *efx, unsigned index, unsigned type)
|
||||
{
|
||||
EFX_BUG_ON_PARANOID(index >= efx->n_tx_channels ||
|
||||
type >= EFX_TXQ_TYPES);
|
||||
return &efx->channel[efx->tx_channel_offset + index]->tx_queue[type];
|
||||
}
|
||||
|
||||
static inline struct efx_tx_queue *
|
||||
efx_channel_get_tx_queue(struct efx_channel *channel, unsigned type)
|
||||
|
@ -142,14 +142,6 @@
|
||||
MODULE_AUTHOR("Tilera");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
|
||||
#define IS_MULTICAST(mac_addr) \
|
||||
(((u8 *)(mac_addr))[0] & 0x01)
|
||||
|
||||
#define IS_BROADCAST(mac_addr) \
|
||||
(((u16 *)(mac_addr))[0] == 0xffff)
|
||||
|
||||
|
||||
/*
|
||||
* Queue of incoming packets for a specific cpu and device.
|
||||
*
|
||||
@ -795,7 +787,7 @@ static bool tile_net_poll_aux(struct tile_net_cpu *info, int index)
|
||||
/*
|
||||
* FIXME: Implement HW multicast filter.
|
||||
*/
|
||||
if (!IS_MULTICAST(buf) && !IS_BROADCAST(buf)) {
|
||||
if (is_unicast_ether_addr(buf)) {
|
||||
/* Filter packets not for our address. */
|
||||
const u8 *mine = dev->dev_addr;
|
||||
filter = compare_ether_addr(mine, buf);
|
||||
|
@ -2032,7 +2032,7 @@ static void ucc_geth_set_multi(struct net_device *dev)
|
||||
netdev_for_each_mc_addr(ha, dev) {
|
||||
/* Only support group multicast for now.
|
||||
*/
|
||||
if (!(ha->addr[0] & 1))
|
||||
if (!is_multicast_ether_addr(ha->addr))
|
||||
continue;
|
||||
|
||||
/* Ask CPM to run CRC and set bit in
|
||||
|
@ -1021,13 +1021,15 @@ static int cdc_ncm_rx_fixup(struct usbnet *dev, struct sk_buff *skb_in)
|
||||
(temp > CDC_NCM_MAX_DATAGRAM_SIZE) || (temp < ETH_HLEN)) {
|
||||
pr_debug("invalid frame detected (ignored)"
|
||||
"offset[%u]=%u, length=%u, skb=%p\n",
|
||||
x, offset, temp, skb);
|
||||
x, offset, temp, skb_in);
|
||||
if (!x)
|
||||
goto error;
|
||||
break;
|
||||
|
||||
} else {
|
||||
skb = skb_clone(skb_in, GFP_ATOMIC);
|
||||
if (!skb)
|
||||
goto error;
|
||||
skb->len = temp;
|
||||
skb->data = ((u8 *)skb_in->data) + offset;
|
||||
skb_set_tail_pointer(skb, temp);
|
||||
|
@ -4120,6 +4120,7 @@ int vxge_fw_upgrade(struct vxgedev *vdev, char *fw_name, int override)
|
||||
"hotplug event.\n");
|
||||
|
||||
out:
|
||||
release_firmware(fw);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -954,6 +954,9 @@ static void ar9002_hw_init_cal_settings(struct ath_hw *ah)
|
||||
&adc_dc_cal_multi_sample;
|
||||
}
|
||||
ah->supp_cals = ADC_GAIN_CAL | ADC_DC_CAL | IQ_MISMATCH_CAL;
|
||||
|
||||
if (AR_SREV_9287(ah))
|
||||
ah->supp_cals &= ~ADC_GAIN_CAL;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -226,6 +226,10 @@ static int ath9k_hw_def_check_eeprom(struct ath_hw *ah)
|
||||
eep->baseEepHeader.pwdclkind == 0)
|
||||
ah->need_an_top2_fixup = 1;
|
||||
|
||||
if ((common->bus_ops->ath_bus_type == ATH_USB) &&
|
||||
(AR_SREV_9280(ah)))
|
||||
eep->modalHeader[0].xpaBiasLvl = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -433,6 +433,7 @@ void ath9k_htc_txep(void *priv, struct sk_buff *skb, enum htc_endpoint_id ep_id,
|
||||
void ath9k_htc_beaconep(void *drv_priv, struct sk_buff *skb,
|
||||
enum htc_endpoint_id ep_id, bool txok);
|
||||
|
||||
int ath9k_htc_update_cap_target(struct ath9k_htc_priv *priv);
|
||||
void ath9k_htc_station_work(struct work_struct *work);
|
||||
void ath9k_htc_aggr_work(struct work_struct *work);
|
||||
void ath9k_ani_work(struct work_struct *work);;
|
||||
|
@ -301,6 +301,16 @@ static int ath9k_htc_add_monitor_interface(struct ath9k_htc_priv *priv)
|
||||
|
||||
priv->nstations++;
|
||||
|
||||
/*
|
||||
* Set chainmask etc. on the target.
|
||||
*/
|
||||
ret = ath9k_htc_update_cap_target(priv);
|
||||
if (ret)
|
||||
ath_dbg(common, ATH_DBG_CONFIG,
|
||||
"Failed to update capability in target\n");
|
||||
|
||||
priv->ah->is_monitoring = true;
|
||||
|
||||
return 0;
|
||||
|
||||
err_vif:
|
||||
@ -328,6 +338,7 @@ static int ath9k_htc_remove_monitor_interface(struct ath9k_htc_priv *priv)
|
||||
}
|
||||
|
||||
priv->nstations--;
|
||||
priv->ah->is_monitoring = false;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -419,7 +430,7 @@ static int ath9k_htc_remove_station(struct ath9k_htc_priv *priv,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ath9k_htc_update_cap_target(struct ath9k_htc_priv *priv)
|
||||
int ath9k_htc_update_cap_target(struct ath9k_htc_priv *priv)
|
||||
{
|
||||
struct ath9k_htc_cap_target tcap;
|
||||
int ret;
|
||||
@ -1186,6 +1197,20 @@ static int ath9k_htc_config(struct ieee80211_hw *hw, u32 changed)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Monitor interface should be added before
|
||||
* IEEE80211_CONF_CHANGE_CHANNEL is handled.
|
||||
*/
|
||||
if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
|
||||
if (conf->flags & IEEE80211_CONF_MONITOR) {
|
||||
if (ath9k_htc_add_monitor_interface(priv))
|
||||
ath_err(common, "Failed to set monitor mode\n");
|
||||
else
|
||||
ath_dbg(common, ATH_DBG_CONFIG,
|
||||
"HW opmode set to Monitor mode\n");
|
||||
}
|
||||
}
|
||||
|
||||
if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
|
||||
struct ieee80211_channel *curchan = hw->conf.channel;
|
||||
int pos = curchan->hw_value;
|
||||
@ -1221,16 +1246,6 @@ static int ath9k_htc_config(struct ieee80211_hw *hw, u32 changed)
|
||||
ath_update_txpow(priv);
|
||||
}
|
||||
|
||||
if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
|
||||
if (conf->flags & IEEE80211_CONF_MONITOR) {
|
||||
if (ath9k_htc_add_monitor_interface(priv))
|
||||
ath_err(common, "Failed to set monitor mode\n");
|
||||
else
|
||||
ath_dbg(common, ATH_DBG_CONFIG,
|
||||
"HW opmode set to Monitor mode\n");
|
||||
}
|
||||
}
|
||||
|
||||
if (changed & IEEE80211_CONF_CHANGE_IDLE) {
|
||||
mutex_lock(&priv->htc_pm_lock);
|
||||
if (!priv->ps_idle) {
|
||||
|
@ -436,9 +436,10 @@ static int ath9k_hw_init_macaddr(struct ath_hw *ah)
|
||||
|
||||
static int ath9k_hw_post_init(struct ath_hw *ah)
|
||||
{
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
int ecode;
|
||||
|
||||
if (!AR_SREV_9271(ah)) {
|
||||
if (common->bus_ops->ath_bus_type != ATH_USB) {
|
||||
if (!ath9k_hw_chip_test(ah))
|
||||
return -ENODEV;
|
||||
}
|
||||
@ -1213,7 +1214,7 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
|
||||
ah->txchainmask = common->tx_chainmask;
|
||||
ah->rxchainmask = common->rx_chainmask;
|
||||
|
||||
if (!ah->chip_fullsleep) {
|
||||
if ((common->bus_ops->ath_bus_type != ATH_USB) && !ah->chip_fullsleep) {
|
||||
ath9k_hw_abortpcurecv(ah);
|
||||
if (!ath9k_hw_stopdmarecv(ah)) {
|
||||
ath_dbg(common, ATH_DBG_XMIT,
|
||||
|
@ -518,22 +518,21 @@ static int prism2_config(struct pcmcia_device *link)
|
||||
hw_priv->link = link;
|
||||
|
||||
/*
|
||||
* Make sure the IRQ handler cannot proceed until at least
|
||||
* dev->base_addr is initialized.
|
||||
* We enable IRQ here, but IRQ handler will not proceed
|
||||
* until dev->base_addr is set below. This protect us from
|
||||
* receive interrupts when driver is not initialized.
|
||||
*/
|
||||
spin_lock_irqsave(&local->irq_init_lock, flags);
|
||||
|
||||
ret = pcmcia_request_irq(link, prism2_interrupt);
|
||||
if (ret)
|
||||
goto failed_unlock;
|
||||
goto failed;
|
||||
|
||||
ret = pcmcia_enable_device(link);
|
||||
if (ret)
|
||||
goto failed_unlock;
|
||||
goto failed;
|
||||
|
||||
spin_lock_irqsave(&local->irq_init_lock, flags);
|
||||
dev->irq = link->irq;
|
||||
dev->base_addr = link->resource[0]->start;
|
||||
|
||||
spin_unlock_irqrestore(&local->irq_init_lock, flags);
|
||||
|
||||
local->shutdown = 0;
|
||||
@ -546,8 +545,6 @@ static int prism2_config(struct pcmcia_device *link)
|
||||
|
||||
return ret;
|
||||
|
||||
failed_unlock:
|
||||
spin_unlock_irqrestore(&local->irq_init_lock, flags);
|
||||
failed:
|
||||
kfree(hw_priv);
|
||||
prism2_release((u_long)link);
|
||||
|
@ -1973,6 +1973,13 @@ static void ipw_irq_tasklet(struct ipw_priv *priv)
|
||||
|
||||
inta = ipw_read32(priv, IPW_INTA_RW);
|
||||
inta_mask = ipw_read32(priv, IPW_INTA_MASK_R);
|
||||
|
||||
if (inta == 0xFFFFFFFF) {
|
||||
/* Hardware disappeared */
|
||||
IPW_WARNING("TASKLET INTA == 0xFFFFFFFF\n");
|
||||
/* Only handle the cached INTA values */
|
||||
inta = 0;
|
||||
}
|
||||
inta &= (IPW_INTA_MASK_ALL & inta_mask);
|
||||
|
||||
/* Add any cached INTA values that need to be handled */
|
||||
|
@ -618,7 +618,7 @@ static void p54_tx_80211_header(struct p54_common *priv, struct sk_buff *skb,
|
||||
else
|
||||
*burst_possible = false;
|
||||
|
||||
if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ)
|
||||
if (!(info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ))
|
||||
*flags |= P54_HDR_FLAG_DATA_OUT_SEQNR;
|
||||
|
||||
if (info->flags & IEEE80211_TX_CTL_PSPOLL_RESPONSE)
|
||||
|
@ -420,6 +420,16 @@ int ssb_bus_scan(struct ssb_bus *bus,
|
||||
bus->pcicore.dev = dev;
|
||||
#endif /* CONFIG_SSB_DRIVER_PCICORE */
|
||||
break;
|
||||
case SSB_DEV_ETHERNET:
|
||||
if (bus->bustype == SSB_BUSTYPE_PCI) {
|
||||
if (bus->host_pci->vendor == PCI_VENDOR_ID_BROADCOM &&
|
||||
(bus->host_pci->device & 0xFF00) == 0x4300) {
|
||||
/* This is a dangling ethernet core on a
|
||||
* wireless device. Ignore it. */
|
||||
continue;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -97,22 +97,26 @@ void vhost_poll_stop(struct vhost_poll *poll)
|
||||
remove_wait_queue(poll->wqh, &poll->wait);
|
||||
}
|
||||
|
||||
static bool vhost_work_seq_done(struct vhost_dev *dev, struct vhost_work *work,
|
||||
unsigned seq)
|
||||
{
|
||||
int left;
|
||||
spin_lock_irq(&dev->work_lock);
|
||||
left = seq - work->done_seq;
|
||||
spin_unlock_irq(&dev->work_lock);
|
||||
return left <= 0;
|
||||
}
|
||||
|
||||
static void vhost_work_flush(struct vhost_dev *dev, struct vhost_work *work)
|
||||
{
|
||||
unsigned seq;
|
||||
int left;
|
||||
int flushing;
|
||||
|
||||
spin_lock_irq(&dev->work_lock);
|
||||
seq = work->queue_seq;
|
||||
work->flushing++;
|
||||
spin_unlock_irq(&dev->work_lock);
|
||||
wait_event(work->done, ({
|
||||
spin_lock_irq(&dev->work_lock);
|
||||
left = seq - work->done_seq <= 0;
|
||||
spin_unlock_irq(&dev->work_lock);
|
||||
left;
|
||||
}));
|
||||
wait_event(work->done, vhost_work_seq_done(dev, work, seq));
|
||||
spin_lock_irq(&dev->work_lock);
|
||||
flushing = --work->flushing;
|
||||
spin_unlock_irq(&dev->work_lock);
|
||||
|
@ -98,6 +98,17 @@ static inline int is_broadcast_ether_addr(const u8 *addr)
|
||||
return (addr[0] & addr[1] & addr[2] & addr[3] & addr[4] & addr[5]) == 0xff;
|
||||
}
|
||||
|
||||
/**
|
||||
* is_unicast_ether_addr - Determine if the Ethernet address is unicast
|
||||
* @addr: Pointer to a six-byte array containing the Ethernet address
|
||||
*
|
||||
* Return true if the address is a unicast address.
|
||||
*/
|
||||
static inline int is_unicast_ether_addr(const u8 *addr)
|
||||
{
|
||||
return !is_multicast_ether_addr(addr);
|
||||
}
|
||||
|
||||
/**
|
||||
* is_valid_ether_addr - Determine if the given Ethernet address is valid
|
||||
* @addr: Pointer to a six-byte array containing the Ethernet address
|
||||
|
@ -520,9 +520,6 @@ struct netdev_queue {
|
||||
* please use this field instead of dev->trans_start
|
||||
*/
|
||||
unsigned long trans_start;
|
||||
u64 tx_bytes;
|
||||
u64 tx_packets;
|
||||
u64 tx_dropped;
|
||||
} ____cacheline_aligned_in_smp;
|
||||
|
||||
static inline int netdev_queue_numa_node_read(const struct netdev_queue *q)
|
||||
@ -2265,8 +2262,6 @@ extern void dev_load(struct net *net, const char *name);
|
||||
extern void dev_mcast_init(void);
|
||||
extern struct rtnl_link_stats64 *dev_get_stats(struct net_device *dev,
|
||||
struct rtnl_link_stats64 *storage);
|
||||
extern void dev_txq_stats_fold(const struct net_device *dev,
|
||||
struct rtnl_link_stats64 *stats);
|
||||
|
||||
extern int netdev_max_backlog;
|
||||
extern int netdev_tstamp_prequeue;
|
||||
|
@ -148,6 +148,10 @@
|
||||
* @NL80211_CMD_SET_MPATH: Set mesh path attributes for mesh path to
|
||||
* destination %NL80211_ATTR_MAC on the interface identified by
|
||||
* %NL80211_ATTR_IFINDEX.
|
||||
* @NL80211_CMD_NEW_MPATH: Create a new mesh path for the destination given by
|
||||
* %NL80211_ATTR_MAC via %NL80211_ATTR_MPATH_NEXT_HOP.
|
||||
* @NL80211_CMD_DEL_MPATH: Delete a mesh path to the destination given by
|
||||
* %NL80211_ATTR_MAC.
|
||||
* @NL80211_CMD_NEW_PATH: Add a mesh path with given attributes to the
|
||||
* the interface identified by %NL80211_ATTR_IFINDEX.
|
||||
* @NL80211_CMD_DEL_PATH: Remove a mesh path identified by %NL80211_ATTR_MAC
|
||||
@ -612,7 +616,7 @@ enum nl80211_commands {
|
||||
* consisting of a nested array.
|
||||
*
|
||||
* @NL80211_ATTR_MESH_ID: mesh id (1-32 bytes).
|
||||
* @NL80211_ATTR_PLINK_ACTION: action to perform on the mesh peer link.
|
||||
* @NL80211_ATTR_STA_PLINK_ACTION: action to perform on the mesh peer link.
|
||||
* @NL80211_ATTR_MPATH_NEXT_HOP: MAC address of the next hop for a mesh path.
|
||||
* @NL80211_ATTR_MPATH_INFO: information about a mesh_path, part of mesh path
|
||||
* info given for %NL80211_CMD_GET_MPATH, nested attribute described at
|
||||
@ -879,7 +883,9 @@ enum nl80211_commands {
|
||||
* See &enum nl80211_key_default_types.
|
||||
*
|
||||
* @NL80211_ATTR_MESH_SETUP: Optional mesh setup parameters. These cannot be
|
||||
* changed once the mesh is active.
|
||||
* changed once the mesh is active.
|
||||
* @NL80211_ATTR_MESH_CONFIG: Mesh configuration parameters, a nested attribute
|
||||
* containing attributes from &enum nl80211_meshconf_params.
|
||||
*
|
||||
* @NL80211_ATTR_MAX: highest attribute number currently defined
|
||||
* @__NL80211_ATTR_AFTER_LAST: internal use
|
||||
@ -1225,8 +1231,6 @@ enum nl80211_rate_info {
|
||||
* @NL80211_STA_INFO_INACTIVE_TIME: time since last activity (u32, msecs)
|
||||
* @NL80211_STA_INFO_RX_BYTES: total received bytes (u32, from this station)
|
||||
* @NL80211_STA_INFO_TX_BYTES: total transmitted bytes (u32, to this station)
|
||||
* @__NL80211_STA_INFO_AFTER_LAST: internal
|
||||
* @NL80211_STA_INFO_MAX: highest possible station info attribute
|
||||
* @NL80211_STA_INFO_SIGNAL: signal strength of last received PPDU (u8, dBm)
|
||||
* @NL80211_STA_INFO_TX_BITRATE: current unicast tx rate, nested attribute
|
||||
* containing info as possible, see &enum nl80211_sta_info_txrate.
|
||||
@ -1236,6 +1240,11 @@ enum nl80211_rate_info {
|
||||
* @NL80211_STA_INFO_TX_RETRIES: total retries (u32, to this station)
|
||||
* @NL80211_STA_INFO_TX_FAILED: total failed packets (u32, to this station)
|
||||
* @NL80211_STA_INFO_SIGNAL_AVG: signal strength average (u8, dBm)
|
||||
* @NL80211_STA_INFO_LLID: the station's mesh LLID
|
||||
* @NL80211_STA_INFO_PLID: the station's mesh PLID
|
||||
* @NL80211_STA_INFO_PLINK_STATE: peer link state for the station
|
||||
* @__NL80211_STA_INFO_AFTER_LAST: internal
|
||||
* @NL80211_STA_INFO_MAX: highest possible station info attribute
|
||||
*/
|
||||
enum nl80211_sta_info {
|
||||
__NL80211_STA_INFO_INVALID,
|
||||
@ -1626,7 +1635,7 @@ enum nl80211_mntr_flags {
|
||||
* @NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME: The interval of time (in TUs)
|
||||
* that it takes for an HWMP information element to propagate across the mesh
|
||||
*
|
||||
* @NL80211_MESHCONF_ROOTMODE: whether root mode is enabled or not
|
||||
* @NL80211_MESHCONF_HWMP_ROOTMODE: whether root mode is enabled or not
|
||||
*
|
||||
* @NL80211_MESHCONF_ELEMENT_TTL: specifies the value of TTL field set at a
|
||||
* source mesh point for path selection elements.
|
||||
@ -1678,6 +1687,7 @@ enum nl80211_meshconf_params {
|
||||
* element that vendors will use to identify the path selection methods and
|
||||
* metrics in use.
|
||||
*
|
||||
* @NL80211_MESH_SETUP_ATTR_MAX: highest possible mesh setup attribute number
|
||||
* @__NL80211_MESH_SETUP_ATTR_AFTER_LAST: Internal use
|
||||
*/
|
||||
enum nl80211_mesh_setup_params {
|
||||
|
@ -255,6 +255,11 @@ typedef unsigned int sk_buff_data_t;
|
||||
typedef unsigned char *sk_buff_data_t;
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_NF_DEFRAG_IPV4) || defined(CONFIG_NF_DEFRAG_IPV4_MODULE) || \
|
||||
defined(CONFIG_NF_DEFRAG_IPV6) || defined(CONFIG_NF_DEFRAG_IPV6_MODULE)
|
||||
#define NET_SKBUFF_NF_DEFRAG_NEEDED 1
|
||||
#endif
|
||||
|
||||
/**
|
||||
* struct sk_buff - socket buffer
|
||||
* @next: Next buffer in list
|
||||
@ -362,6 +367,8 @@ struct sk_buff {
|
||||
void (*destructor)(struct sk_buff *skb);
|
||||
#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
|
||||
struct nf_conntrack *nfct;
|
||||
#endif
|
||||
#ifdef NET_SKBUFF_NF_DEFRAG_NEEDED
|
||||
struct sk_buff *nfct_reasm;
|
||||
#endif
|
||||
#ifdef CONFIG_BRIDGE_NETFILTER
|
||||
@ -2057,6 +2064,8 @@ static inline void nf_conntrack_get(struct nf_conntrack *nfct)
|
||||
if (nfct)
|
||||
atomic_inc(&nfct->use);
|
||||
}
|
||||
#endif
|
||||
#ifdef NET_SKBUFF_NF_DEFRAG_NEEDED
|
||||
static inline void nf_conntrack_get_reasm(struct sk_buff *skb)
|
||||
{
|
||||
if (skb)
|
||||
@ -2085,6 +2094,8 @@ static inline void nf_reset(struct sk_buff *skb)
|
||||
#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
|
||||
nf_conntrack_put(skb->nfct);
|
||||
skb->nfct = NULL;
|
||||
#endif
|
||||
#ifdef NET_SKBUFF_NF_DEFRAG_NEEDED
|
||||
nf_conntrack_put_reasm(skb->nfct_reasm);
|
||||
skb->nfct_reasm = NULL;
|
||||
#endif
|
||||
@ -2101,6 +2112,8 @@ static inline void __nf_copy(struct sk_buff *dst, const struct sk_buff *src)
|
||||
dst->nfct = src->nfct;
|
||||
nf_conntrack_get(src->nfct);
|
||||
dst->nfctinfo = src->nfctinfo;
|
||||
#endif
|
||||
#ifdef NET_SKBUFF_NF_DEFRAG_NEEDED
|
||||
dst->nfct_reasm = src->nfct_reasm;
|
||||
nf_conntrack_get_reasm(src->nfct_reasm);
|
||||
#endif
|
||||
@ -2114,6 +2127,8 @@ static inline void nf_copy(struct sk_buff *dst, const struct sk_buff *src)
|
||||
{
|
||||
#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
|
||||
nf_conntrack_put(dst->nfct);
|
||||
#endif
|
||||
#ifdef NET_SKBUFF_NF_DEFRAG_NEEDED
|
||||
nf_conntrack_put_reasm(dst->nfct_reasm);
|
||||
#endif
|
||||
#ifdef CONFIG_BRIDGE_NETFILTER
|
||||
|
@ -4,7 +4,7 @@
|
||||
#include <linux/skbuff.h>
|
||||
|
||||
/* This is the maximum truncated ICV length that we know of. */
|
||||
#define MAX_AH_AUTH_LEN 16
|
||||
#define MAX_AH_AUTH_LEN 64
|
||||
|
||||
struct crypto_ahash;
|
||||
|
||||
|
@ -1103,6 +1103,8 @@ struct cfg80211_pmksa {
|
||||
* @change_mpath: change a given mesh path
|
||||
* @get_mpath: get a mesh path for the given parameters
|
||||
* @dump_mpath: dump mesh path callback -- resume dump at index @idx
|
||||
* @join_mesh: join the mesh network with the specified parameters
|
||||
* @leave_mesh: leave the current mesh network
|
||||
*
|
||||
* @get_mesh_config: Get the current mesh configuration
|
||||
*
|
||||
|
@ -337,6 +337,10 @@ struct ieee80211_bss_conf {
|
||||
* @IEEE80211_TX_CTL_LDPC: tells the driver to use LDPC for this frame
|
||||
* @IEEE80211_TX_CTL_STBC: Enables Space-Time Block Coding (STBC) for this
|
||||
* frame and selects the maximum number of streams that it can use.
|
||||
* @IEEE80211_TX_CTL_TX_OFFCHAN: Marks this packet to be transmitted on
|
||||
* the off-channel channel when a remain-on-channel offload is done
|
||||
* in hardware -- normal packets still flow and are expected to be
|
||||
* handled properly by the device.
|
||||
*
|
||||
* Note: If you have to add new flags to the enumeration, then don't
|
||||
* forget to update %IEEE80211_TX_TEMPORARY_FLAGS when necessary.
|
||||
@ -1753,6 +1757,16 @@ enum ieee80211_ampdu_mlme_action {
|
||||
* (also see nl80211.h @NL80211_ATTR_WIPHY_ANTENNA_TX).
|
||||
*
|
||||
* @get_antenna: Get current antenna configuration from device (tx_ant, rx_ant).
|
||||
*
|
||||
* @remain_on_channel: Starts an off-channel period on the given channel, must
|
||||
* call back to ieee80211_ready_on_channel() when on that channel. Note
|
||||
* that normal channel traffic is not stopped as this is intended for hw
|
||||
* offload. Frames to transmit on the off-channel channel are transmitted
|
||||
* normally except for the %IEEE80211_TX_CTL_TX_OFFCHAN flag. When the
|
||||
* duration (which will always be non-zero) expires, the driver must call
|
||||
* ieee80211_remain_on_channel_expired(). This callback may sleep.
|
||||
* @cancel_remain_on_channel: Requests that an ongoing off-channel period is
|
||||
* aborted before it expires. This callback may sleep.
|
||||
*/
|
||||
struct ieee80211_ops {
|
||||
int (*tx)(struct ieee80211_hw *hw, struct sk_buff *skb);
|
||||
|
@ -7,16 +7,6 @@ extern struct nf_conntrack_l4proto nf_conntrack_l4proto_tcp6;
|
||||
extern struct nf_conntrack_l4proto nf_conntrack_l4proto_udp6;
|
||||
extern struct nf_conntrack_l4proto nf_conntrack_l4proto_icmpv6;
|
||||
|
||||
extern int nf_ct_frag6_init(void);
|
||||
extern void nf_ct_frag6_cleanup(void);
|
||||
extern struct sk_buff *nf_ct_frag6_gather(struct sk_buff *skb, u32 user);
|
||||
extern void nf_ct_frag6_output(unsigned int hooknum, struct sk_buff *skb,
|
||||
struct net_device *in,
|
||||
struct net_device *out,
|
||||
int (*okfn)(struct sk_buff *));
|
||||
|
||||
struct inet_frags_ctl;
|
||||
|
||||
#include <linux/sysctl.h>
|
||||
extern struct ctl_table nf_ct_ipv6_sysctl_table[];
|
||||
|
||||
|
@ -3,4 +3,14 @@
|
||||
|
||||
extern void nf_defrag_ipv6_enable(void);
|
||||
|
||||
extern int nf_ct_frag6_init(void);
|
||||
extern void nf_ct_frag6_cleanup(void);
|
||||
extern struct sk_buff *nf_ct_frag6_gather(struct sk_buff *skb, u32 user);
|
||||
extern void nf_ct_frag6_output(unsigned int hooknum, struct sk_buff *skb,
|
||||
struct net_device *in,
|
||||
struct net_device *out,
|
||||
int (*okfn)(struct sk_buff *));
|
||||
|
||||
struct inet_frags_ctl;
|
||||
|
||||
#endif /* _NF_DEFRAG_IPV6_H */
|
||||
|
@ -97,7 +97,6 @@ struct red_stats {
|
||||
u32 forced_mark; /* Forced marks, qavg > max_thresh */
|
||||
u32 pdrop; /* Drops due to queue limits */
|
||||
u32 other; /* Drops due to drop() calls */
|
||||
u32 backlog;
|
||||
};
|
||||
|
||||
struct red_parms {
|
||||
|
@ -1392,7 +1392,7 @@ static int ax25_getname(struct socket *sock, struct sockaddr *uaddr,
|
||||
ax25_cb *ax25;
|
||||
int err = 0;
|
||||
|
||||
memset(fsa, 0, sizeof(fsa));
|
||||
memset(fsa, 0, sizeof(*fsa));
|
||||
lock_sock(sk);
|
||||
ax25 = ax25_sk(sk);
|
||||
|
||||
|
@ -5523,34 +5523,6 @@ void netdev_run_todo(void)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* dev_txq_stats_fold - fold tx_queues stats
|
||||
* @dev: device to get statistics from
|
||||
* @stats: struct rtnl_link_stats64 to hold results
|
||||
*/
|
||||
void dev_txq_stats_fold(const struct net_device *dev,
|
||||
struct rtnl_link_stats64 *stats)
|
||||
{
|
||||
u64 tx_bytes = 0, tx_packets = 0, tx_dropped = 0;
|
||||
unsigned int i;
|
||||
struct netdev_queue *txq;
|
||||
|
||||
for (i = 0; i < dev->num_tx_queues; i++) {
|
||||
txq = netdev_get_tx_queue(dev, i);
|
||||
spin_lock_bh(&txq->_xmit_lock);
|
||||
tx_bytes += txq->tx_bytes;
|
||||
tx_packets += txq->tx_packets;
|
||||
tx_dropped += txq->tx_dropped;
|
||||
spin_unlock_bh(&txq->_xmit_lock);
|
||||
}
|
||||
if (tx_bytes || tx_packets || tx_dropped) {
|
||||
stats->tx_bytes = tx_bytes;
|
||||
stats->tx_packets = tx_packets;
|
||||
stats->tx_dropped = tx_dropped;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(dev_txq_stats_fold);
|
||||
|
||||
/* Convert net_device_stats to rtnl_link_stats64. They have the same
|
||||
* fields in the same order, with only the type differing.
|
||||
*/
|
||||
@ -5594,7 +5566,6 @@ struct rtnl_link_stats64 *dev_get_stats(struct net_device *dev,
|
||||
netdev_stats_to_stats64(storage, ops->ndo_get_stats(dev));
|
||||
} else {
|
||||
netdev_stats_to_stats64(storage, &dev->stats);
|
||||
dev_txq_stats_fold(dev, storage);
|
||||
}
|
||||
storage->rx_dropped += atomic_long_read(&dev->rx_dropped);
|
||||
return storage;
|
||||
|
@ -380,6 +380,8 @@ static void skb_release_head_state(struct sk_buff *skb)
|
||||
}
|
||||
#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
|
||||
nf_conntrack_put(skb->nfct);
|
||||
#endif
|
||||
#ifdef NET_SKBUFF_NF_DEFRAG_NEEDED
|
||||
nf_conntrack_put_reasm(skb->nfct_reasm);
|
||||
#endif
|
||||
#ifdef CONFIG_BRIDGE_NETFILTER
|
||||
|
@ -351,7 +351,7 @@ EXPORT_SYMBOL(ether_setup);
|
||||
* @sizeof_priv: Size of additional driver-private structure to be allocated
|
||||
* for this Ethernet device
|
||||
* @txqs: The number of TX queues this device has.
|
||||
* @txqs: The number of RX queues this device has.
|
||||
* @rxqs: The number of RX queues this device has.
|
||||
*
|
||||
* Fill in the fields of the device structure with Ethernet-generic
|
||||
* values. Basically does everything except registering the device.
|
||||
|
@ -401,6 +401,9 @@ int ip6_forward(struct sk_buff *skb)
|
||||
goto drop;
|
||||
}
|
||||
|
||||
if (skb->pkt_type != PACKET_HOST)
|
||||
goto drop;
|
||||
|
||||
skb_forward_csum(skb);
|
||||
|
||||
/*
|
||||
|
@ -19,13 +19,15 @@
|
||||
|
||||
#include <linux/netfilter_ipv6.h>
|
||||
#include <linux/netfilter_bridge.h>
|
||||
#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
|
||||
#include <net/netfilter/nf_conntrack.h>
|
||||
#include <net/netfilter/nf_conntrack_helper.h>
|
||||
#include <net/netfilter/nf_conntrack_l4proto.h>
|
||||
#include <net/netfilter/nf_conntrack_l3proto.h>
|
||||
#include <net/netfilter/nf_conntrack_core.h>
|
||||
#include <net/netfilter/nf_conntrack_zones.h>
|
||||
#include <net/netfilter/ipv6/nf_conntrack_ipv6.h>
|
||||
#endif
|
||||
#include <net/netfilter/nf_conntrack_zones.h>
|
||||
#include <net/netfilter/ipv6/nf_defrag_ipv6.h>
|
||||
|
||||
static enum ip6_defrag_users nf_ct6_defrag_user(unsigned int hooknum,
|
||||
@ -33,8 +35,10 @@ static enum ip6_defrag_users nf_ct6_defrag_user(unsigned int hooknum,
|
||||
{
|
||||
u16 zone = NF_CT_DEFAULT_ZONE;
|
||||
|
||||
#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
|
||||
if (skb->nfct)
|
||||
zone = nf_ct_zone((struct nf_conn *)skb->nfct);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_BRIDGE_NETFILTER
|
||||
if (skb->nf_bridge &&
|
||||
@ -56,9 +60,11 @@ static unsigned int ipv6_defrag(unsigned int hooknum,
|
||||
{
|
||||
struct sk_buff *reasm;
|
||||
|
||||
#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
|
||||
/* Previously seen (loopback)? */
|
||||
if (skb->nfct && !nf_ct_is_template((struct nf_conn *)skb->nfct))
|
||||
return NF_ACCEPT;
|
||||
#endif
|
||||
|
||||
reasm = nf_ct_frag6_gather(skb, nf_ct6_defrag_user(hooknum, skb));
|
||||
/* queued */
|
||||
|
@ -972,7 +972,8 @@ ctnetlink_get_conntrack(struct sock *ctnl, struct sk_buff *skb,
|
||||
free:
|
||||
kfree_skb(skb2);
|
||||
out:
|
||||
return err;
|
||||
/* this avoids a loop in nfnetlink. */
|
||||
return err == -EAGAIN ? -ENOBUFS : err;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NF_NAT_NEEDED
|
||||
|
@ -59,6 +59,10 @@ struct teql_master
|
||||
struct net_device *dev;
|
||||
struct Qdisc *slaves;
|
||||
struct list_head master_list;
|
||||
unsigned long tx_bytes;
|
||||
unsigned long tx_packets;
|
||||
unsigned long tx_errors;
|
||||
unsigned long tx_dropped;
|
||||
};
|
||||
|
||||
struct teql_sched_data
|
||||
@ -274,7 +278,6 @@ static inline int teql_resolve(struct sk_buff *skb,
|
||||
static netdev_tx_t teql_master_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
{
|
||||
struct teql_master *master = netdev_priv(dev);
|
||||
struct netdev_queue *txq = netdev_get_tx_queue(dev, 0);
|
||||
struct Qdisc *start, *q;
|
||||
int busy;
|
||||
int nores;
|
||||
@ -314,8 +317,8 @@ restart:
|
||||
__netif_tx_unlock(slave_txq);
|
||||
master->slaves = NEXT_SLAVE(q);
|
||||
netif_wake_queue(dev);
|
||||
txq->tx_packets++;
|
||||
txq->tx_bytes += length;
|
||||
master->tx_packets++;
|
||||
master->tx_bytes += length;
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
__netif_tx_unlock(slave_txq);
|
||||
@ -342,10 +345,10 @@ restart:
|
||||
netif_stop_queue(dev);
|
||||
return NETDEV_TX_BUSY;
|
||||
}
|
||||
dev->stats.tx_errors++;
|
||||
master->tx_errors++;
|
||||
|
||||
drop:
|
||||
txq->tx_dropped++;
|
||||
master->tx_dropped++;
|
||||
dev_kfree_skb(skb);
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
@ -398,6 +401,18 @@ static int teql_master_close(struct net_device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct rtnl_link_stats64 *teql_master_stats64(struct net_device *dev,
|
||||
struct rtnl_link_stats64 *stats)
|
||||
{
|
||||
struct teql_master *m = netdev_priv(dev);
|
||||
|
||||
stats->tx_packets = m->tx_packets;
|
||||
stats->tx_bytes = m->tx_bytes;
|
||||
stats->tx_errors = m->tx_errors;
|
||||
stats->tx_dropped = m->tx_dropped;
|
||||
return stats;
|
||||
}
|
||||
|
||||
static int teql_master_mtu(struct net_device *dev, int new_mtu)
|
||||
{
|
||||
struct teql_master *m = netdev_priv(dev);
|
||||
@ -422,6 +437,7 @@ static const struct net_device_ops teql_netdev_ops = {
|
||||
.ndo_open = teql_master_open,
|
||||
.ndo_stop = teql_master_close,
|
||||
.ndo_start_xmit = teql_master_xmit,
|
||||
.ndo_get_stats64 = teql_master_stats64,
|
||||
.ndo_change_mtu = teql_master_mtu,
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user