mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04: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: (68 commits) net: can: janz-ican3: world-writable sysfs termination file net: can: at91_can: world-writable sysfs files MAINTAINERS: update email ids of the be2net driver maintainers. bridge: Don't put partly initialized fdb into hash r8169: prevent RxFIFO induced loops in the irq handler. r8169: RxFIFO overflow oddities with 8168 chipsets. r8169: use RxFIFO overflow workaround for 8168c chipset. include/net/genetlink.h: Allow genlmsg_cancel to accept a NULL argument net: Provide compat support for SIOCGETMIFCNT_IN6 and SIOCGETSGCNT_IN6. net: Support compat SIOCGETVIFCNT ioctl in ipv4. net: Fix bug in compat SIOCGETSGCNT handling. niu: Fix races between up/down and get_stats. tcp_ecn is an integer not a boolean atl1c: Add missing PCI device ID s390: Fix possibly wrong size in strncmp (smsgiucv) s390: Fix wrong size in memcmp (netiucv) qeth: allow OSA CHPARM change in suspend state qeth: allow HiperSockets framesize change in suspend qeth: add more strict MTU checking qeth: show new mac-address if its setting fails ...
This commit is contained in:
commit
44f2c5c841
60 changed files with 637 additions and 289 deletions
|
|
@ -48,6 +48,7 @@ static DEFINE_PCI_DEVICE_TABLE(atl1c_pci_tbl) = {
|
|||
{PCI_DEVICE(PCI_VENDOR_ID_ATTANSIC, PCI_DEVICE_ID_ATHEROS_L2C_B)},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_ATTANSIC, PCI_DEVICE_ID_ATHEROS_L2C_B2)},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_ATTANSIC, PCI_DEVICE_ID_ATHEROS_L1D)},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_ATTANSIC, PCI_DEVICE_ID_ATHEROS_L1D_2_0)},
|
||||
/* required last entry */
|
||||
{ 0 }
|
||||
};
|
||||
|
|
|
|||
|
|
@ -312,11 +312,9 @@ void be_link_status_update(struct be_adapter *adapter, bool link_up)
|
|||
if (adapter->link_up != link_up) {
|
||||
adapter->link_speed = -1;
|
||||
if (link_up) {
|
||||
netif_start_queue(netdev);
|
||||
netif_carrier_on(netdev);
|
||||
printk(KERN_INFO "%s: Link up\n", netdev->name);
|
||||
} else {
|
||||
netif_stop_queue(netdev);
|
||||
netif_carrier_off(netdev);
|
||||
printk(KERN_INFO "%s: Link down\n", netdev->name);
|
||||
}
|
||||
|
|
@ -2628,8 +2626,6 @@ static void be_netdev_init(struct net_device *netdev)
|
|||
|
||||
netif_napi_add(netdev, &adapter->tx_eq.napi, be_poll_tx_mcc,
|
||||
BE_NAPI_WEIGHT);
|
||||
|
||||
netif_stop_queue(netdev);
|
||||
}
|
||||
|
||||
static void be_unmap_pci_bars(struct be_adapter *adapter)
|
||||
|
|
|
|||
|
|
@ -22,8 +22,8 @@
|
|||
* (you will need to reboot afterwards) */
|
||||
/* #define BNX2X_STOP_ON_ERROR */
|
||||
|
||||
#define DRV_MODULE_VERSION "1.62.00-4"
|
||||
#define DRV_MODULE_RELDATE "2011/01/18"
|
||||
#define DRV_MODULE_VERSION "1.62.00-5"
|
||||
#define DRV_MODULE_RELDATE "2011/01/30"
|
||||
#define BNX2X_BC_VER 0x040200
|
||||
|
||||
#define BNX2X_MULTI_QUEUE
|
||||
|
|
|
|||
|
|
@ -3948,48 +3948,6 @@ static u8 bnx2x_8073_8727_external_rom_boot(struct bnx2x *bp,
|
|||
return rc;
|
||||
}
|
||||
|
||||
static void bnx2x_8073_set_xaui_low_power_mode(struct bnx2x *bp,
|
||||
struct bnx2x_phy *phy)
|
||||
{
|
||||
u16 val;
|
||||
bnx2x_cl45_read(bp, phy,
|
||||
MDIO_PMA_DEVAD, MDIO_PMA_REG_8073_CHIP_REV, &val);
|
||||
|
||||
if (val == 0) {
|
||||
/* Mustn't set low power mode in 8073 A0 */
|
||||
return;
|
||||
}
|
||||
|
||||
/* Disable PLL sequencer (use read-modify-write to clear bit 13) */
|
||||
bnx2x_cl45_read(bp, phy,
|
||||
MDIO_XS_DEVAD, MDIO_XS_PLL_SEQUENCER, &val);
|
||||
val &= ~(1<<13);
|
||||
bnx2x_cl45_write(bp, phy,
|
||||
MDIO_XS_DEVAD, MDIO_XS_PLL_SEQUENCER, val);
|
||||
|
||||
/* PLL controls */
|
||||
bnx2x_cl45_write(bp, phy, MDIO_XS_DEVAD, 0x805E, 0x1077);
|
||||
bnx2x_cl45_write(bp, phy, MDIO_XS_DEVAD, 0x805D, 0x0000);
|
||||
bnx2x_cl45_write(bp, phy, MDIO_XS_DEVAD, 0x805C, 0x030B);
|
||||
bnx2x_cl45_write(bp, phy, MDIO_XS_DEVAD, 0x805B, 0x1240);
|
||||
bnx2x_cl45_write(bp, phy, MDIO_XS_DEVAD, 0x805A, 0x2490);
|
||||
|
||||
/* Tx Controls */
|
||||
bnx2x_cl45_write(bp, phy, MDIO_XS_DEVAD, 0x80A7, 0x0C74);
|
||||
bnx2x_cl45_write(bp, phy, MDIO_XS_DEVAD, 0x80A6, 0x9041);
|
||||
bnx2x_cl45_write(bp, phy, MDIO_XS_DEVAD, 0x80A5, 0x4640);
|
||||
|
||||
/* Rx Controls */
|
||||
bnx2x_cl45_write(bp, phy, MDIO_XS_DEVAD, 0x80FE, 0x01C4);
|
||||
bnx2x_cl45_write(bp, phy, MDIO_XS_DEVAD, 0x80FD, 0x9249);
|
||||
bnx2x_cl45_write(bp, phy, MDIO_XS_DEVAD, 0x80FC, 0x2015);
|
||||
|
||||
/* Enable PLL sequencer (use read-modify-write to set bit 13) */
|
||||
bnx2x_cl45_read(bp, phy, MDIO_XS_DEVAD, MDIO_XS_PLL_SEQUENCER, &val);
|
||||
val |= (1<<13);
|
||||
bnx2x_cl45_write(bp, phy, MDIO_XS_DEVAD, MDIO_XS_PLL_SEQUENCER, val);
|
||||
}
|
||||
|
||||
/******************************************************************/
|
||||
/* BCM8073 PHY SECTION */
|
||||
/******************************************************************/
|
||||
|
|
@ -4148,8 +4106,6 @@ static u8 bnx2x_8073_config_init(struct bnx2x_phy *phy,
|
|||
|
||||
bnx2x_8073_set_pause_cl37(params, phy, vars);
|
||||
|
||||
bnx2x_8073_set_xaui_low_power_mode(bp, phy);
|
||||
|
||||
bnx2x_cl45_read(bp, phy,
|
||||
MDIO_PMA_DEVAD, MDIO_PMA_REG_M8051_MSGOUT_REG, &tmp1);
|
||||
|
||||
|
|
@ -6519,6 +6475,18 @@ static void bnx2x_848xx_set_link_led(struct bnx2x_phy *phy,
|
|||
MDIO_PMA_DEVAD,
|
||||
MDIO_PMA_REG_8481_LED1_MASK,
|
||||
0x80);
|
||||
|
||||
/* Tell LED3 to blink on source */
|
||||
bnx2x_cl45_read(bp, phy,
|
||||
MDIO_PMA_DEVAD,
|
||||
MDIO_PMA_REG_8481_LINK_SIGNAL,
|
||||
&val);
|
||||
val &= ~(7<<6);
|
||||
val |= (1<<6); /* A83B[8:6]= 1 */
|
||||
bnx2x_cl45_write(bp, phy,
|
||||
MDIO_PMA_DEVAD,
|
||||
MDIO_PMA_REG_8481_LINK_SIGNAL,
|
||||
val);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
@ -7720,10 +7688,13 @@ static u8 bnx2x_8073_common_init_phy(struct bnx2x *bp,
|
|||
struct bnx2x_phy phy[PORT_MAX];
|
||||
struct bnx2x_phy *phy_blk[PORT_MAX];
|
||||
u16 val;
|
||||
s8 port;
|
||||
s8 port = 0;
|
||||
s8 port_of_path = 0;
|
||||
|
||||
bnx2x_ext_phy_hw_reset(bp, 0);
|
||||
u32 swap_val, swap_override;
|
||||
swap_val = REG_RD(bp, NIG_REG_PORT_SWAP);
|
||||
swap_override = REG_RD(bp, NIG_REG_STRAP_OVERRIDE);
|
||||
port ^= (swap_val && swap_override);
|
||||
bnx2x_ext_phy_hw_reset(bp, port);
|
||||
/* PART1 - Reset both phys */
|
||||
for (port = PORT_MAX - 1; port >= PORT_0; port--) {
|
||||
u32 shmem_base, shmem2_base;
|
||||
|
|
|
|||
|
|
@ -2301,15 +2301,10 @@ static void bnx2x_rxq_set_mac_filters(struct bnx2x *bp, u16 cl_id, u32 filters)
|
|||
/* accept matched ucast */
|
||||
drop_all_ucast = 0;
|
||||
}
|
||||
if (filters & BNX2X_ACCEPT_MULTICAST) {
|
||||
if (filters & BNX2X_ACCEPT_MULTICAST)
|
||||
/* accept matched mcast */
|
||||
drop_all_mcast = 0;
|
||||
if (IS_MF_SI(bp))
|
||||
/* since mcast addresses won't arrive with ovlan,
|
||||
* fw needs to accept all of them in
|
||||
* switch-independent mode */
|
||||
accp_all_mcast = 1;
|
||||
}
|
||||
|
||||
if (filters & BNX2X_ACCEPT_ALL_UNICAST) {
|
||||
/* accept all mcast */
|
||||
drop_all_ucast = 0;
|
||||
|
|
@ -5296,10 +5291,6 @@ static int bnx2x_init_hw_common(struct bnx2x *bp, u32 load_code)
|
|||
}
|
||||
}
|
||||
|
||||
bp->port.need_hw_lock = bnx2x_hw_lock_required(bp,
|
||||
bp->common.shmem_base,
|
||||
bp->common.shmem2_base);
|
||||
|
||||
bnx2x_setup_fan_failure_detection(bp);
|
||||
|
||||
/* clear PXP2 attentions */
|
||||
|
|
@ -5503,9 +5494,6 @@ static int bnx2x_init_hw_port(struct bnx2x *bp)
|
|||
|
||||
bnx2x_init_block(bp, MCP_BLOCK, init_stage);
|
||||
bnx2x_init_block(bp, DMAE_BLOCK, init_stage);
|
||||
bp->port.need_hw_lock = bnx2x_hw_lock_required(bp,
|
||||
bp->common.shmem_base,
|
||||
bp->common.shmem2_base);
|
||||
if (bnx2x_fan_failure_det_req(bp, bp->common.shmem_base,
|
||||
bp->common.shmem2_base, port)) {
|
||||
u32 reg_addr = (port ? MISC_REG_AEU_ENABLE1_FUNC_1_OUT_0 :
|
||||
|
|
@ -8379,6 +8367,17 @@ static void __devinit bnx2x_get_port_hwinfo(struct bnx2x *bp)
|
|||
(ext_phy_type != PORT_HW_CFG_XGXS_EXT_PHY_TYPE_NOT_CONN))
|
||||
bp->mdio.prtad =
|
||||
XGXS_EXT_PHY_ADDR(ext_phy_config);
|
||||
|
||||
/*
|
||||
* Check if hw lock is required to access MDC/MDIO bus to the PHY(s)
|
||||
* In MF mode, it is set to cover self test cases
|
||||
*/
|
||||
if (IS_MF(bp))
|
||||
bp->port.need_hw_lock = 1;
|
||||
else
|
||||
bp->port.need_hw_lock = bnx2x_hw_lock_required(bp,
|
||||
bp->common.shmem_base,
|
||||
bp->common.shmem2_base);
|
||||
}
|
||||
|
||||
static void __devinit bnx2x_get_mac_hwinfo(struct bnx2x *bp)
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ config CAN_SLCAN
|
|||
|
||||
As only the sending and receiving of CAN frames is implemented, this
|
||||
driver should work with the (serial/USB) CAN hardware from:
|
||||
www.canusb.com / www.can232.com / www.mictronic.com / www.canhack.de
|
||||
www.canusb.com / www.can232.com / www.mictronics.de / www.canhack.de
|
||||
|
||||
Userspace tools to attach the SLCAN line discipline (slcan_attach,
|
||||
slcand) can be found in the can-utils at the SocketCAN SVN, see
|
||||
|
|
|
|||
|
|
@ -1109,7 +1109,7 @@ static ssize_t at91_sysfs_set_mb0_id(struct device *dev,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(mb0_id, S_IWUGO | S_IRUGO,
|
||||
static DEVICE_ATTR(mb0_id, S_IWUSR | S_IRUGO,
|
||||
at91_sysfs_show_mb0_id, at91_sysfs_set_mb0_id);
|
||||
|
||||
static struct attribute *at91_sysfs_attrs[] = {
|
||||
|
|
|
|||
|
|
@ -1618,7 +1618,7 @@ static ssize_t ican3_sysfs_set_term(struct device *dev,
|
|||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(termination, S_IWUGO | S_IRUGO, ican3_sysfs_show_term,
|
||||
static DEVICE_ATTR(termination, S_IWUSR | S_IRUGO, ican3_sysfs_show_term,
|
||||
ican3_sysfs_set_term);
|
||||
|
||||
static struct attribute *ican3_sysfs_attrs[] = {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
config CAN_SOFTING
|
||||
tristate "Softing Gmbh CAN generic support"
|
||||
depends on CAN_DEV
|
||||
depends on CAN_DEV && HAS_IOMEM
|
||||
---help---
|
||||
Support for CAN cards from Softing Gmbh & some cards
|
||||
from Vector Gmbh.
|
||||
|
|
|
|||
|
|
@ -1094,7 +1094,7 @@ static int depca_rx(struct net_device *dev)
|
|||
}
|
||||
}
|
||||
/* Change buffer ownership for this last frame, back to the adapter */
|
||||
for (; lp->rx_old != entry; lp->rx_old = (++lp->rx_old) & lp->rxRingMask) {
|
||||
for (; lp->rx_old != entry; lp->rx_old = (lp->rx_old + 1) & lp->rxRingMask) {
|
||||
writel(readl(&lp->rx_ring[lp->rx_old].base) | R_OWN, &lp->rx_ring[lp->rx_old].base);
|
||||
}
|
||||
writel(readl(&lp->rx_ring[entry].base) | R_OWN, &lp->rx_ring[entry].base);
|
||||
|
|
@ -1103,7 +1103,7 @@ static int depca_rx(struct net_device *dev)
|
|||
/*
|
||||
** Update entry information
|
||||
*/
|
||||
lp->rx_new = (++lp->rx_new) & lp->rxRingMask;
|
||||
lp->rx_new = (lp->rx_new + 1) & lp->rxRingMask;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
@ -1148,7 +1148,7 @@ static int depca_tx(struct net_device *dev)
|
|||
}
|
||||
|
||||
/* Update all the pointers */
|
||||
lp->tx_old = (++lp->tx_old) & lp->txRingMask;
|
||||
lp->tx_old = (lp->tx_old + 1) & lp->txRingMask;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -1753,8 +1753,6 @@ rio_close (struct net_device *dev)
|
|||
|
||||
/* Free all the skbuffs in the queue. */
|
||||
for (i = 0; i < RX_RING_SIZE; i++) {
|
||||
np->rx_ring[i].status = 0;
|
||||
np->rx_ring[i].fraginfo = 0;
|
||||
skb = np->rx_skbuff[i];
|
||||
if (skb) {
|
||||
pci_unmap_single(np->pdev,
|
||||
|
|
@ -1763,6 +1761,8 @@ rio_close (struct net_device *dev)
|
|||
dev_kfree_skb (skb);
|
||||
np->rx_skbuff[i] = NULL;
|
||||
}
|
||||
np->rx_ring[i].status = 0;
|
||||
np->rx_ring[i].fraginfo = 0;
|
||||
}
|
||||
for (i = 0; i < TX_RING_SIZE; i++) {
|
||||
skb = np->tx_skbuff[i];
|
||||
|
|
|
|||
|
|
@ -812,7 +812,7 @@ static void enc28j60_read_tsv(struct enc28j60_net *priv, u8 tsv[TSV_SIZE])
|
|||
if (netif_msg_hw(priv))
|
||||
printk(KERN_DEBUG DRV_NAME ": reading TSV at addr:0x%04x\n",
|
||||
endptr + 1);
|
||||
enc28j60_mem_read(priv, endptr + 1, sizeof(tsv), tsv);
|
||||
enc28j60_mem_read(priv, endptr + 1, TSV_SIZE, tsv);
|
||||
}
|
||||
|
||||
static void enc28j60_dump_tsv(struct enc28j60_net *priv, const char *msg,
|
||||
|
|
|
|||
|
|
@ -4489,6 +4489,9 @@ static int niu_alloc_channels(struct niu *np)
|
|||
{
|
||||
struct niu_parent *parent = np->parent;
|
||||
int first_rx_channel, first_tx_channel;
|
||||
int num_rx_rings, num_tx_rings;
|
||||
struct rx_ring_info *rx_rings;
|
||||
struct tx_ring_info *tx_rings;
|
||||
int i, port, err;
|
||||
|
||||
port = np->port;
|
||||
|
|
@ -4498,18 +4501,21 @@ static int niu_alloc_channels(struct niu *np)
|
|||
first_tx_channel += parent->txchan_per_port[i];
|
||||
}
|
||||
|
||||
np->num_rx_rings = parent->rxchan_per_port[port];
|
||||
np->num_tx_rings = parent->txchan_per_port[port];
|
||||
num_rx_rings = parent->rxchan_per_port[port];
|
||||
num_tx_rings = parent->txchan_per_port[port];
|
||||
|
||||
netif_set_real_num_rx_queues(np->dev, np->num_rx_rings);
|
||||
netif_set_real_num_tx_queues(np->dev, np->num_tx_rings);
|
||||
|
||||
np->rx_rings = kcalloc(np->num_rx_rings, sizeof(struct rx_ring_info),
|
||||
GFP_KERNEL);
|
||||
rx_rings = kcalloc(num_rx_rings, sizeof(struct rx_ring_info),
|
||||
GFP_KERNEL);
|
||||
err = -ENOMEM;
|
||||
if (!np->rx_rings)
|
||||
if (!rx_rings)
|
||||
goto out_err;
|
||||
|
||||
np->num_rx_rings = num_rx_rings;
|
||||
smp_wmb();
|
||||
np->rx_rings = rx_rings;
|
||||
|
||||
netif_set_real_num_rx_queues(np->dev, num_rx_rings);
|
||||
|
||||
for (i = 0; i < np->num_rx_rings; i++) {
|
||||
struct rx_ring_info *rp = &np->rx_rings[i];
|
||||
|
||||
|
|
@ -4538,12 +4544,18 @@ static int niu_alloc_channels(struct niu *np)
|
|||
return err;
|
||||
}
|
||||
|
||||
np->tx_rings = kcalloc(np->num_tx_rings, sizeof(struct tx_ring_info),
|
||||
GFP_KERNEL);
|
||||
tx_rings = kcalloc(num_tx_rings, sizeof(struct tx_ring_info),
|
||||
GFP_KERNEL);
|
||||
err = -ENOMEM;
|
||||
if (!np->tx_rings)
|
||||
if (!tx_rings)
|
||||
goto out_err;
|
||||
|
||||
np->num_tx_rings = num_tx_rings;
|
||||
smp_wmb();
|
||||
np->tx_rings = tx_rings;
|
||||
|
||||
netif_set_real_num_tx_queues(np->dev, num_tx_rings);
|
||||
|
||||
for (i = 0; i < np->num_tx_rings; i++) {
|
||||
struct tx_ring_info *rp = &np->tx_rings[i];
|
||||
|
||||
|
|
@ -6246,11 +6258,17 @@ static void niu_sync_mac_stats(struct niu *np)
|
|||
static void niu_get_rx_stats(struct niu *np)
|
||||
{
|
||||
unsigned long pkts, dropped, errors, bytes;
|
||||
struct rx_ring_info *rx_rings;
|
||||
int i;
|
||||
|
||||
pkts = dropped = errors = bytes = 0;
|
||||
|
||||
rx_rings = ACCESS_ONCE(np->rx_rings);
|
||||
if (!rx_rings)
|
||||
goto no_rings;
|
||||
|
||||
for (i = 0; i < np->num_rx_rings; i++) {
|
||||
struct rx_ring_info *rp = &np->rx_rings[i];
|
||||
struct rx_ring_info *rp = &rx_rings[i];
|
||||
|
||||
niu_sync_rx_discard_stats(np, rp, 0);
|
||||
|
||||
|
|
@ -6259,6 +6277,8 @@ static void niu_get_rx_stats(struct niu *np)
|
|||
dropped += rp->rx_dropped;
|
||||
errors += rp->rx_errors;
|
||||
}
|
||||
|
||||
no_rings:
|
||||
np->dev->stats.rx_packets = pkts;
|
||||
np->dev->stats.rx_bytes = bytes;
|
||||
np->dev->stats.rx_dropped = dropped;
|
||||
|
|
@ -6268,16 +6288,24 @@ static void niu_get_rx_stats(struct niu *np)
|
|||
static void niu_get_tx_stats(struct niu *np)
|
||||
{
|
||||
unsigned long pkts, errors, bytes;
|
||||
struct tx_ring_info *tx_rings;
|
||||
int i;
|
||||
|
||||
pkts = errors = bytes = 0;
|
||||
|
||||
tx_rings = ACCESS_ONCE(np->tx_rings);
|
||||
if (!tx_rings)
|
||||
goto no_rings;
|
||||
|
||||
for (i = 0; i < np->num_tx_rings; i++) {
|
||||
struct tx_ring_info *rp = &np->tx_rings[i];
|
||||
struct tx_ring_info *rp = &tx_rings[i];
|
||||
|
||||
pkts += rp->tx_packets;
|
||||
bytes += rp->tx_bytes;
|
||||
errors += rp->tx_errors;
|
||||
}
|
||||
|
||||
no_rings:
|
||||
np->dev->stats.tx_packets = pkts;
|
||||
np->dev->stats.tx_bytes = bytes;
|
||||
np->dev->stats.tx_errors = errors;
|
||||
|
|
@ -6287,9 +6315,10 @@ static struct net_device_stats *niu_get_stats(struct net_device *dev)
|
|||
{
|
||||
struct niu *np = netdev_priv(dev);
|
||||
|
||||
niu_get_rx_stats(np);
|
||||
niu_get_tx_stats(np);
|
||||
|
||||
if (netif_running(dev)) {
|
||||
niu_get_rx_stats(np);
|
||||
niu_get_tx_stats(np);
|
||||
}
|
||||
return &dev->stats;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1488,12 +1488,10 @@ static void ei_rx_overrun(struct net_device *dev)
|
|||
|
||||
/*
|
||||
* Wait a full Tx time (1.2ms) + some guard time, NS says 1.6ms total.
|
||||
* Early datasheets said to poll the reset bit, but now they say that
|
||||
* it "is not a reliable indicator and subsequently should be ignored."
|
||||
* We wait at least 10ms.
|
||||
* We wait at least 2ms.
|
||||
*/
|
||||
|
||||
mdelay(10);
|
||||
mdelay(2);
|
||||
|
||||
/*
|
||||
* Reset RBCR[01] back to zero as per magic incantation.
|
||||
|
|
|
|||
|
|
@ -973,7 +973,8 @@ static void __rtl8169_check_link_status(struct net_device *dev,
|
|||
if (pm)
|
||||
pm_request_resume(&tp->pci_dev->dev);
|
||||
netif_carrier_on(dev);
|
||||
netif_info(tp, ifup, dev, "link up\n");
|
||||
if (net_ratelimit())
|
||||
netif_info(tp, ifup, dev, "link up\n");
|
||||
} else {
|
||||
netif_carrier_off(dev);
|
||||
netif_info(tp, ifdown, dev, "link down\n");
|
||||
|
|
@ -3757,7 +3758,8 @@ static void rtl_hw_start_8168(struct net_device *dev)
|
|||
RTL_W16(IntrMitigate, 0x5151);
|
||||
|
||||
/* Work around for RxFIFO overflow. */
|
||||
if (tp->mac_version == RTL_GIGA_MAC_VER_11) {
|
||||
if (tp->mac_version == RTL_GIGA_MAC_VER_11 ||
|
||||
tp->mac_version == RTL_GIGA_MAC_VER_22) {
|
||||
tp->intr_event |= RxFIFOOver | PCSTimeout;
|
||||
tp->intr_event &= ~RxOverflow;
|
||||
}
|
||||
|
|
@ -4639,12 +4641,33 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
|
|||
break;
|
||||
}
|
||||
|
||||
/* Work around for rx fifo overflow */
|
||||
if (unlikely(status & RxFIFOOver) &&
|
||||
(tp->mac_version == RTL_GIGA_MAC_VER_11)) {
|
||||
netif_stop_queue(dev);
|
||||
rtl8169_tx_timeout(dev);
|
||||
break;
|
||||
if (unlikely(status & RxFIFOOver)) {
|
||||
switch (tp->mac_version) {
|
||||
/* Work around for rx fifo overflow */
|
||||
case RTL_GIGA_MAC_VER_11:
|
||||
case RTL_GIGA_MAC_VER_22:
|
||||
case RTL_GIGA_MAC_VER_26:
|
||||
netif_stop_queue(dev);
|
||||
rtl8169_tx_timeout(dev);
|
||||
goto done;
|
||||
/* Testers needed. */
|
||||
case RTL_GIGA_MAC_VER_17:
|
||||
case RTL_GIGA_MAC_VER_19:
|
||||
case RTL_GIGA_MAC_VER_20:
|
||||
case RTL_GIGA_MAC_VER_21:
|
||||
case RTL_GIGA_MAC_VER_23:
|
||||
case RTL_GIGA_MAC_VER_24:
|
||||
case RTL_GIGA_MAC_VER_27:
|
||||
case RTL_GIGA_MAC_VER_28:
|
||||
/* Experimental science. Pktgen proof. */
|
||||
case RTL_GIGA_MAC_VER_12:
|
||||
case RTL_GIGA_MAC_VER_25:
|
||||
if (status == RxFIFOOver)
|
||||
goto done;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (unlikely(status & SYSErr)) {
|
||||
|
|
@ -4680,7 +4703,7 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
|
|||
(status & RxFIFOOver) ? (status | RxOverflow) : status);
|
||||
status = RTL_R16(IntrStatus);
|
||||
}
|
||||
|
||||
done:
|
||||
return IRQ_RETVAL(handled);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3690,7 +3690,7 @@ __vxge_hw_vpath_rts_table_get(struct __vxge_hw_vpath_handle *vp,
|
|||
if (status != VXGE_HW_OK)
|
||||
goto exit;
|
||||
|
||||
if ((rts_table != VXGE_HW_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_DA) ||
|
||||
if ((rts_table != VXGE_HW_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_DA) &&
|
||||
(rts_table !=
|
||||
VXGE_HW_RTS_ACS_STEER_CTRL_DATA_STRUCT_SEL_RTH_MULTI_IT))
|
||||
*data1 = 0;
|
||||
|
|
|
|||
|
|
@ -838,9 +838,9 @@ int ath5k_hw_dma_stop(struct ath5k_hw *ah)
|
|||
for (i = 0; i < qmax; i++) {
|
||||
err = ath5k_hw_stop_tx_dma(ah, i);
|
||||
/* -EINVAL -> queue inactive */
|
||||
if (err != -EINVAL)
|
||||
if (err && err != -EINVAL)
|
||||
return err;
|
||||
}
|
||||
|
||||
return err;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@ int ath5k_hw_get_frame_duration(struct ath5k_hw *ah,
|
|||
if (!ah->ah_bwmode) {
|
||||
dur = ieee80211_generic_frame_duration(sc->hw,
|
||||
NULL, len, rate);
|
||||
return dur;
|
||||
return le16_to_cpu(dur);
|
||||
}
|
||||
|
||||
bitrate = rate->bitrate;
|
||||
|
|
@ -265,8 +265,6 @@ static inline void ath5k_hw_write_rate_duration(struct ath5k_hw *ah)
|
|||
* what rate we should choose to TX ACKs. */
|
||||
tx_time = ath5k_hw_get_frame_duration(ah, 10, rate);
|
||||
|
||||
tx_time = le16_to_cpu(tx_time);
|
||||
|
||||
ath5k_hw_reg_write(ah, tx_time, reg);
|
||||
|
||||
if (!(rate->flags & IEEE80211_RATE_SHORT_PREAMBLE))
|
||||
|
|
|
|||
|
|
@ -426,9 +426,8 @@ static void ar9002_hw_configpcipowersave(struct ath_hw *ah,
|
|||
}
|
||||
|
||||
/* WAR for ASPM system hang */
|
||||
if (AR_SREV_9280(ah) || AR_SREV_9285(ah) || AR_SREV_9287(ah)) {
|
||||
if (AR_SREV_9285(ah) || AR_SREV_9287(ah))
|
||||
val |= (AR_WA_BIT6 | AR_WA_BIT7);
|
||||
}
|
||||
|
||||
if (AR_SREV_9285E_20(ah))
|
||||
val |= AR_WA_BIT23;
|
||||
|
|
|
|||
|
|
@ -142,9 +142,6 @@ static void ath9k_deinit_priv(struct ath9k_htc_priv *priv)
|
|||
{
|
||||
ath9k_htc_exit_debug(priv->ah);
|
||||
ath9k_hw_deinit(priv->ah);
|
||||
tasklet_kill(&priv->swba_tasklet);
|
||||
tasklet_kill(&priv->rx_tasklet);
|
||||
tasklet_kill(&priv->tx_tasklet);
|
||||
kfree(priv->ah);
|
||||
priv->ah = NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1025,12 +1025,6 @@ static void ath9k_htc_stop(struct ieee80211_hw *hw)
|
|||
int ret = 0;
|
||||
u8 cmd_rsp;
|
||||
|
||||
/* Cancel all the running timers/work .. */
|
||||
cancel_work_sync(&priv->fatal_work);
|
||||
cancel_work_sync(&priv->ps_work);
|
||||
cancel_delayed_work_sync(&priv->ath9k_led_blink_work);
|
||||
ath9k_led_stop_brightness(priv);
|
||||
|
||||
mutex_lock(&priv->mutex);
|
||||
|
||||
if (priv->op_flags & OP_INVALID) {
|
||||
|
|
@ -1044,8 +1038,23 @@ static void ath9k_htc_stop(struct ieee80211_hw *hw)
|
|||
WMI_CMD(WMI_DISABLE_INTR_CMDID);
|
||||
WMI_CMD(WMI_DRAIN_TXQ_ALL_CMDID);
|
||||
WMI_CMD(WMI_STOP_RECV_CMDID);
|
||||
|
||||
tasklet_kill(&priv->swba_tasklet);
|
||||
tasklet_kill(&priv->rx_tasklet);
|
||||
tasklet_kill(&priv->tx_tasklet);
|
||||
|
||||
skb_queue_purge(&priv->tx_queue);
|
||||
|
||||
mutex_unlock(&priv->mutex);
|
||||
|
||||
/* Cancel all the running timers/work .. */
|
||||
cancel_work_sync(&priv->fatal_work);
|
||||
cancel_work_sync(&priv->ps_work);
|
||||
cancel_delayed_work_sync(&priv->ath9k_led_blink_work);
|
||||
ath9k_led_stop_brightness(priv);
|
||||
|
||||
mutex_lock(&priv->mutex);
|
||||
|
||||
/* Remove monitor interface here */
|
||||
if (ah->opmode == NL80211_IFTYPE_MONITOR) {
|
||||
if (ath9k_htc_remove_monitor_interface(priv))
|
||||
|
|
|
|||
|
|
@ -598,8 +598,6 @@ err_btcoex:
|
|||
err_queues:
|
||||
ath9k_hw_deinit(ah);
|
||||
err_hw:
|
||||
tasklet_kill(&sc->intr_tq);
|
||||
tasklet_kill(&sc->bcon_tasklet);
|
||||
|
||||
kfree(ah);
|
||||
sc->sc_ah = NULL;
|
||||
|
|
@ -807,9 +805,6 @@ static void ath9k_deinit_softc(struct ath_softc *sc)
|
|||
|
||||
ath9k_hw_deinit(sc->sc_ah);
|
||||
|
||||
tasklet_kill(&sc->intr_tq);
|
||||
tasklet_kill(&sc->bcon_tasklet);
|
||||
|
||||
kfree(sc->sc_ah);
|
||||
sc->sc_ah = NULL;
|
||||
}
|
||||
|
|
@ -824,6 +819,8 @@ void ath9k_deinit_device(struct ath_softc *sc)
|
|||
wiphy_rfkill_stop_polling(sc->hw->wiphy);
|
||||
ath_deinit_leds(sc);
|
||||
|
||||
ath9k_ps_restore(sc);
|
||||
|
||||
for (i = 0; i < sc->num_sec_wiphy; i++) {
|
||||
struct ath_wiphy *aphy = sc->sec_wiphy[i];
|
||||
if (aphy == NULL)
|
||||
|
|
|
|||
|
|
@ -325,6 +325,8 @@ static bool ath_paprd_send_frame(struct ath_softc *sc, struct sk_buff *skb, int
|
|||
{
|
||||
struct ieee80211_hw *hw = sc->hw;
|
||||
struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
|
||||
struct ath_hw *ah = sc->sc_ah;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ath_tx_control txctl;
|
||||
int time_left;
|
||||
|
||||
|
|
@ -342,8 +344,12 @@ static bool ath_paprd_send_frame(struct ath_softc *sc, struct sk_buff *skb, int
|
|||
init_completion(&sc->paprd_complete);
|
||||
sc->paprd_pending = true;
|
||||
txctl.paprd = BIT(chain);
|
||||
if (ath_tx_start(hw, skb, &txctl) != 0)
|
||||
|
||||
if (ath_tx_start(hw, skb, &txctl) != 0) {
|
||||
ath_dbg(common, ATH_DBG_XMIT, "PAPRD TX failed\n");
|
||||
dev_kfree_skb_any(skb);
|
||||
return false;
|
||||
}
|
||||
|
||||
time_left = wait_for_completion_timeout(&sc->paprd_complete,
|
||||
msecs_to_jiffies(ATH_PAPRD_TIMEOUT));
|
||||
|
|
@ -953,8 +959,6 @@ void ath_radio_disable(struct ath_softc *sc, struct ieee80211_hw *hw)
|
|||
|
||||
spin_unlock_bh(&sc->sc_pcu_lock);
|
||||
ath9k_ps_restore(sc);
|
||||
|
||||
ath9k_setpower(sc, ATH9K_PM_FULL_SLEEP);
|
||||
}
|
||||
|
||||
int ath_reset(struct ath_softc *sc, bool retry_tx)
|
||||
|
|
@ -1309,6 +1313,9 @@ static void ath9k_stop(struct ieee80211_hw *hw)
|
|||
|
||||
spin_lock_bh(&sc->sc_pcu_lock);
|
||||
|
||||
/* prevent tasklets to enable interrupts once we disable them */
|
||||
ah->imask &= ~ATH9K_INT_GLOBAL;
|
||||
|
||||
/* make sure h/w will not generate any interrupt
|
||||
* before setting the invalid flag. */
|
||||
ath9k_hw_disable_interrupts(ah);
|
||||
|
|
@ -1326,6 +1333,12 @@ static void ath9k_stop(struct ieee80211_hw *hw)
|
|||
|
||||
spin_unlock_bh(&sc->sc_pcu_lock);
|
||||
|
||||
/* we can now sync irq and kill any running tasklets, since we already
|
||||
* disabled interrupts and not holding a spin lock */
|
||||
synchronize_irq(sc->irq);
|
||||
tasklet_kill(&sc->intr_tq);
|
||||
tasklet_kill(&sc->bcon_tasklet);
|
||||
|
||||
ath9k_ps_restore(sc);
|
||||
|
||||
sc->ps_idle = true;
|
||||
|
|
|
|||
|
|
@ -726,9 +726,9 @@ static int efuse_pg_packet_read(struct ieee80211_hw *hw, u8 offset, u8 *data)
|
|||
}
|
||||
|
||||
static void efuse_write_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr,
|
||||
u8 efuse_data, u8 offset, int *bcontinual,
|
||||
u8 *write_state, struct pgpkt_struct target_pkt,
|
||||
int *repeat_times, int *bresult, u8 word_en)
|
||||
u8 efuse_data, u8 offset, int *bcontinual,
|
||||
u8 *write_state, struct pgpkt_struct *target_pkt,
|
||||
int *repeat_times, int *bresult, u8 word_en)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct pgpkt_struct tmp_pkt;
|
||||
|
|
@ -744,8 +744,8 @@ static void efuse_write_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr,
|
|||
tmp_pkt.word_en = tmp_header & 0x0F;
|
||||
tmp_word_cnts = efuse_calculate_word_cnts(tmp_pkt.word_en);
|
||||
|
||||
if (tmp_pkt.offset != target_pkt.offset) {
|
||||
efuse_addr = efuse_addr + (tmp_word_cnts * 2) + 1;
|
||||
if (tmp_pkt.offset != target_pkt->offset) {
|
||||
*efuse_addr = *efuse_addr + (tmp_word_cnts * 2) + 1;
|
||||
*write_state = PG_STATE_HEADER;
|
||||
} else {
|
||||
for (tmpindex = 0; tmpindex < (tmp_word_cnts * 2); tmpindex++) {
|
||||
|
|
@ -756,23 +756,23 @@ static void efuse_write_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr,
|
|||
}
|
||||
|
||||
if (bdataempty == false) {
|
||||
efuse_addr = efuse_addr + (tmp_word_cnts * 2) + 1;
|
||||
*efuse_addr = *efuse_addr + (tmp_word_cnts * 2) + 1;
|
||||
*write_state = PG_STATE_HEADER;
|
||||
} else {
|
||||
match_word_en = 0x0F;
|
||||
if (!((target_pkt.word_en & BIT(0)) |
|
||||
if (!((target_pkt->word_en & BIT(0)) |
|
||||
(tmp_pkt.word_en & BIT(0))))
|
||||
match_word_en &= (~BIT(0));
|
||||
|
||||
if (!((target_pkt.word_en & BIT(1)) |
|
||||
if (!((target_pkt->word_en & BIT(1)) |
|
||||
(tmp_pkt.word_en & BIT(1))))
|
||||
match_word_en &= (~BIT(1));
|
||||
|
||||
if (!((target_pkt.word_en & BIT(2)) |
|
||||
if (!((target_pkt->word_en & BIT(2)) |
|
||||
(tmp_pkt.word_en & BIT(2))))
|
||||
match_word_en &= (~BIT(2));
|
||||
|
||||
if (!((target_pkt.word_en & BIT(3)) |
|
||||
if (!((target_pkt->word_en & BIT(3)) |
|
||||
(tmp_pkt.word_en & BIT(3))))
|
||||
match_word_en &= (~BIT(3));
|
||||
|
||||
|
|
@ -780,7 +780,7 @@ static void efuse_write_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr,
|
|||
badworden = efuse_word_enable_data_write(
|
||||
hw, *efuse_addr + 1,
|
||||
tmp_pkt.word_en,
|
||||
target_pkt.data);
|
||||
target_pkt->data);
|
||||
|
||||
if (0x0F != (badworden & 0x0F)) {
|
||||
u8 reorg_offset = offset;
|
||||
|
|
@ -791,26 +791,26 @@ static void efuse_write_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr,
|
|||
}
|
||||
|
||||
tmp_word_en = 0x0F;
|
||||
if ((target_pkt.word_en & BIT(0)) ^
|
||||
if ((target_pkt->word_en & BIT(0)) ^
|
||||
(match_word_en & BIT(0)))
|
||||
tmp_word_en &= (~BIT(0));
|
||||
|
||||
if ((target_pkt.word_en & BIT(1)) ^
|
||||
if ((target_pkt->word_en & BIT(1)) ^
|
||||
(match_word_en & BIT(1)))
|
||||
tmp_word_en &= (~BIT(1));
|
||||
|
||||
if ((target_pkt.word_en & BIT(2)) ^
|
||||
if ((target_pkt->word_en & BIT(2)) ^
|
||||
(match_word_en & BIT(2)))
|
||||
tmp_word_en &= (~BIT(2));
|
||||
|
||||
if ((target_pkt.word_en & BIT(3)) ^
|
||||
if ((target_pkt->word_en & BIT(3)) ^
|
||||
(match_word_en & BIT(3)))
|
||||
tmp_word_en &= (~BIT(3));
|
||||
|
||||
if ((tmp_word_en & 0x0F) != 0x0F) {
|
||||
*efuse_addr = efuse_get_current_size(hw);
|
||||
target_pkt.offset = offset;
|
||||
target_pkt.word_en = tmp_word_en;
|
||||
target_pkt->offset = offset;
|
||||
target_pkt->word_en = tmp_word_en;
|
||||
} else
|
||||
*bcontinual = false;
|
||||
*write_state = PG_STATE_HEADER;
|
||||
|
|
@ -821,8 +821,8 @@ static void efuse_write_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr,
|
|||
}
|
||||
} else {
|
||||
*efuse_addr += (2 * tmp_word_cnts) + 1;
|
||||
target_pkt.offset = offset;
|
||||
target_pkt.word_en = word_en;
|
||||
target_pkt->offset = offset;
|
||||
target_pkt->word_en = word_en;
|
||||
*write_state = PG_STATE_HEADER;
|
||||
}
|
||||
}
|
||||
|
|
@ -938,7 +938,7 @@ static int efuse_pg_packet_write(struct ieee80211_hw *hw,
|
|||
efuse_write_data_case1(hw, &efuse_addr,
|
||||
efuse_data, offset,
|
||||
&bcontinual,
|
||||
&write_state, target_pkt,
|
||||
&write_state, &target_pkt,
|
||||
&repeat_times, &bresult,
|
||||
word_en);
|
||||
else
|
||||
|
|
|
|||
|
|
@ -110,9 +110,8 @@ static void wl1271_spi_reset(struct wl1271 *wl)
|
|||
spi_message_add_tail(&t, &m);
|
||||
|
||||
spi_sync(wl_to_spi(wl), &m);
|
||||
kfree(cmd);
|
||||
|
||||
wl1271_dump(DEBUG_SPI, "spi reset -> ", cmd, WSPI_INIT_CMD_LEN);
|
||||
kfree(cmd);
|
||||
}
|
||||
|
||||
static void wl1271_spi_init(struct wl1271 *wl)
|
||||
|
|
|
|||
|
|
@ -120,6 +120,9 @@ struct netfront_info {
|
|||
unsigned long rx_pfn_array[NET_RX_RING_SIZE];
|
||||
struct multicall_entry rx_mcl[NET_RX_RING_SIZE+1];
|
||||
struct mmu_update rx_mmu[NET_RX_RING_SIZE];
|
||||
|
||||
/* Statistics */
|
||||
int rx_gso_checksum_fixup;
|
||||
};
|
||||
|
||||
struct netfront_rx_info {
|
||||
|
|
@ -770,11 +773,29 @@ static RING_IDX xennet_fill_frags(struct netfront_info *np,
|
|||
return cons;
|
||||
}
|
||||
|
||||
static int skb_checksum_setup(struct sk_buff *skb)
|
||||
static int checksum_setup(struct net_device *dev, struct sk_buff *skb)
|
||||
{
|
||||
struct iphdr *iph;
|
||||
unsigned char *th;
|
||||
int err = -EPROTO;
|
||||
int recalculate_partial_csum = 0;
|
||||
|
||||
/*
|
||||
* A GSO SKB must be CHECKSUM_PARTIAL. However some buggy
|
||||
* peers can fail to set NETRXF_csum_blank when sending a GSO
|
||||
* frame. In this case force the SKB to CHECKSUM_PARTIAL and
|
||||
* recalculate the partial checksum.
|
||||
*/
|
||||
if (skb->ip_summed != CHECKSUM_PARTIAL && skb_is_gso(skb)) {
|
||||
struct netfront_info *np = netdev_priv(dev);
|
||||
np->rx_gso_checksum_fixup++;
|
||||
skb->ip_summed = CHECKSUM_PARTIAL;
|
||||
recalculate_partial_csum = 1;
|
||||
}
|
||||
|
||||
/* A non-CHECKSUM_PARTIAL SKB does not require setup. */
|
||||
if (skb->ip_summed != CHECKSUM_PARTIAL)
|
||||
return 0;
|
||||
|
||||
if (skb->protocol != htons(ETH_P_IP))
|
||||
goto out;
|
||||
|
|
@ -788,9 +809,23 @@ static int skb_checksum_setup(struct sk_buff *skb)
|
|||
switch (iph->protocol) {
|
||||
case IPPROTO_TCP:
|
||||
skb->csum_offset = offsetof(struct tcphdr, check);
|
||||
|
||||
if (recalculate_partial_csum) {
|
||||
struct tcphdr *tcph = (struct tcphdr *)th;
|
||||
tcph->check = ~csum_tcpudp_magic(iph->saddr, iph->daddr,
|
||||
skb->len - iph->ihl*4,
|
||||
IPPROTO_TCP, 0);
|
||||
}
|
||||
break;
|
||||
case IPPROTO_UDP:
|
||||
skb->csum_offset = offsetof(struct udphdr, check);
|
||||
|
||||
if (recalculate_partial_csum) {
|
||||
struct udphdr *udph = (struct udphdr *)th;
|
||||
udph->check = ~csum_tcpudp_magic(iph->saddr, iph->daddr,
|
||||
skb->len - iph->ihl*4,
|
||||
IPPROTO_UDP, 0);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (net_ratelimit())
|
||||
|
|
@ -829,13 +864,11 @@ static int handle_incoming_queue(struct net_device *dev,
|
|||
/* Ethernet work: Delayed to here as it peeks the header. */
|
||||
skb->protocol = eth_type_trans(skb, dev);
|
||||
|
||||
if (skb->ip_summed == CHECKSUM_PARTIAL) {
|
||||
if (skb_checksum_setup(skb)) {
|
||||
kfree_skb(skb);
|
||||
packets_dropped++;
|
||||
dev->stats.rx_errors++;
|
||||
continue;
|
||||
}
|
||||
if (checksum_setup(dev, skb)) {
|
||||
kfree_skb(skb);
|
||||
packets_dropped++;
|
||||
dev->stats.rx_errors++;
|
||||
continue;
|
||||
}
|
||||
|
||||
dev->stats.rx_packets++;
|
||||
|
|
@ -1632,12 +1665,59 @@ static void netback_changed(struct xenbus_device *dev,
|
|||
}
|
||||
}
|
||||
|
||||
static const struct xennet_stat {
|
||||
char name[ETH_GSTRING_LEN];
|
||||
u16 offset;
|
||||
} xennet_stats[] = {
|
||||
{
|
||||
"rx_gso_checksum_fixup",
|
||||
offsetof(struct netfront_info, rx_gso_checksum_fixup)
|
||||
},
|
||||
};
|
||||
|
||||
static int xennet_get_sset_count(struct net_device *dev, int string_set)
|
||||
{
|
||||
switch (string_set) {
|
||||
case ETH_SS_STATS:
|
||||
return ARRAY_SIZE(xennet_stats);
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
static void xennet_get_ethtool_stats(struct net_device *dev,
|
||||
struct ethtool_stats *stats, u64 * data)
|
||||
{
|
||||
void *np = netdev_priv(dev);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(xennet_stats); i++)
|
||||
data[i] = *(int *)(np + xennet_stats[i].offset);
|
||||
}
|
||||
|
||||
static void xennet_get_strings(struct net_device *dev, u32 stringset, u8 * data)
|
||||
{
|
||||
int i;
|
||||
|
||||
switch (stringset) {
|
||||
case ETH_SS_STATS:
|
||||
for (i = 0; i < ARRAY_SIZE(xennet_stats); i++)
|
||||
memcpy(data + i * ETH_GSTRING_LEN,
|
||||
xennet_stats[i].name, ETH_GSTRING_LEN);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static const struct ethtool_ops xennet_ethtool_ops =
|
||||
{
|
||||
.set_tx_csum = ethtool_op_set_tx_csum,
|
||||
.set_sg = xennet_set_sg,
|
||||
.set_tso = xennet_set_tso,
|
||||
.get_link = ethtool_op_get_link,
|
||||
|
||||
.get_sset_count = xennet_get_sset_count,
|
||||
.get_ethtool_stats = xennet_get_ethtool_stats,
|
||||
.get_strings = xennet_get_strings,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_SYSFS
|
||||
|
|
|
|||
Loading…
Reference in a new issue