mirror of
https://github.com/torvalds/linux.git
synced 2024-12-27 05:11:48 +00: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: (37 commits) sky2: Avoid races in sky2_down drivers/net/mlx4: Adjust constant drivers/net: Move a dereference below a NULL test drivers/net: Move a dereference below a NULL test connector: maintainer/mail update. USB host CDC Phonet network interface driver macsonic, jazzsonic: fix oops on module unload macsonic: move probe function to .devinit.text can: switch carrier on if device was stopped while in bus-off state can: restart device even if dev_alloc_skb() fails can: sja1000: remove duplicated includes New device ID for sc92031 [1088:2031] 3c589_cs: re-initialize the multicast in the tc589_reset Fix error return for setsockopt(SO_TIMESTAMPING) netxen: fix thermal check and shutdown netxen: fix deadlock on dev close netxen: fix context deletion sequence net: Micrel KS8851 SPI network driver tcp: Use correct peer adr when copying MD5 keys tcp: Fix MD5 signature checking on IPv4 mapped sockets ...
This commit is contained in:
commit
402168cee1
2
CREDITS
2
CREDITS
@ -1856,7 +1856,7 @@ E: rfkoenig@immd4.informatik.uni-erlangen.de
|
||||
D: The Linux Support Team Erlangen
|
||||
|
||||
N: Andreas Koensgen
|
||||
E: ajk@iehk.rwth-aachen.de
|
||||
E: ajk@comnets.uni-bremen.de
|
||||
D: 6pack driver for AX.25
|
||||
|
||||
N: Harald Koerfgen
|
||||
|
@ -83,11 +83,12 @@ not detect it missed following items in original chain.
|
||||
obj = kmem_cache_alloc(...);
|
||||
lock_chain(); // typically a spin_lock()
|
||||
obj->key = key;
|
||||
atomic_inc(&obj->refcnt);
|
||||
/*
|
||||
* we need to make sure obj->key is updated before obj->next
|
||||
* or obj->refcnt
|
||||
*/
|
||||
smp_wmb();
|
||||
atomic_set(&obj->refcnt, 1);
|
||||
hlist_add_head_rcu(&obj->obj_node, list);
|
||||
unlock_chain(); // typically a spin_unlock()
|
||||
|
||||
@ -159,6 +160,10 @@ out:
|
||||
obj = kmem_cache_alloc(cachep);
|
||||
lock_chain(); // typically a spin_lock()
|
||||
obj->key = key;
|
||||
/*
|
||||
* changes to obj->key must be visible before refcnt one
|
||||
*/
|
||||
smp_wmb();
|
||||
atomic_set(&obj->refcnt, 1);
|
||||
/*
|
||||
* insert obj in RCU way (readers might be traversing chain)
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* cn_test.c
|
||||
*
|
||||
* 2004-2005 Copyright (c) Evgeniy Polyakov <johnpol@2ka.mipt.ru>
|
||||
* 2004+ Copyright (c) Evgeniy Polyakov <zbr@ioremap.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@ -194,5 +194,5 @@ module_init(cn_test_init);
|
||||
module_exit(cn_test_fini);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Evgeniy Polyakov <johnpol@2ka.mipt.ru>");
|
||||
MODULE_AUTHOR("Evgeniy Polyakov <zbr@ioremap.net>");
|
||||
MODULE_DESCRIPTION("Connector's test module");
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* ucon.c
|
||||
*
|
||||
* Copyright (c) 2004+ Evgeniy Polyakov <johnpol@2ka.mipt.ru>
|
||||
* Copyright (c) 2004+ Evgeniy Polyakov <zbr@ioremap.net>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@ -1,7 +1,7 @@
|
||||
This is the 6pack-mini-HOWTO, written by
|
||||
|
||||
Andreas Könsgen DG3KQ
|
||||
Internet: ajk@iehk.rwth-aachen.de
|
||||
Internet: ajk@comnets.uni-bremen.de
|
||||
AMPR-net: dg3kq@db0pra.ampr.org
|
||||
AX.25: dg3kq@db0ach.#nrw.deu.eu
|
||||
|
||||
|
11
MAINTAINERS
11
MAINTAINERS
@ -150,7 +150,7 @@ F: drivers/scsi/53c700*
|
||||
|
||||
6PACK NETWORK DRIVER FOR AX.25
|
||||
P: Andreas Koensgen
|
||||
M: ajk@iehk.rwth-aachen.de
|
||||
M: ajk@comnets.uni-bremen.de
|
||||
L: linux-hams@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/net/hamradio/6pack.c
|
||||
@ -1612,6 +1612,13 @@ S: Supported
|
||||
F: fs/configfs/
|
||||
F: include/linux/configfs.h
|
||||
|
||||
CONNECTOR
|
||||
P: Evgeniy Polyakov
|
||||
M: zbr@ioremap.net
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/connector/
|
||||
|
||||
CONTROL GROUPS (CGROUPS)
|
||||
P: Paul Menage
|
||||
M: menage@google.com
|
||||
@ -4089,6 +4096,7 @@ L: netfilter@vger.kernel.org
|
||||
L: coreteam@netfilter.org
|
||||
W: http://www.netfilter.org/
|
||||
W: http://www.iptables.org/
|
||||
T: git://git.kernel.org/pub/scm/linux/kernel/git/kaber/nf-2.6.git
|
||||
S: Supported
|
||||
F: include/linux/netfilter*
|
||||
F: include/linux/netfilter/
|
||||
@ -5586,7 +5594,6 @@ S: Odd Fixes
|
||||
F: drivers/net/starfire*
|
||||
|
||||
STARMODE RADIO IP (STRIP) PROTOCOL DRIVER
|
||||
W: http://mosquitonet.Stanford.EDU/strip.html
|
||||
S: Orphan
|
||||
F: drivers/net/wireless/strip.c
|
||||
F: include/linux/if_strip.h
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* cn_queue.c
|
||||
*
|
||||
* 2004-2005 Copyright (c) Evgeniy Polyakov <johnpol@2ka.mipt.ru>
|
||||
* 2004+ Copyright (c) Evgeniy Polyakov <zbr@ioremap.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* connector.c
|
||||
*
|
||||
* 2004-2005 Copyright (c) Evgeniy Polyakov <johnpol@2ka.mipt.ru>
|
||||
* 2004+ Copyright (c) Evgeniy Polyakov <zbr@ioremap.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@ -33,7 +33,7 @@
|
||||
#include <net/sock.h>
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Evgeniy Polyakov <johnpol@2ka.mipt.ru>");
|
||||
MODULE_AUTHOR("Evgeniy Polyakov <zbr@ioremap.net>");
|
||||
MODULE_DESCRIPTION("Generic userspace <-> kernelspace connector.");
|
||||
|
||||
static u32 cn_idx = CN_IDX_CONNECTOR;
|
||||
|
@ -1729,6 +1729,12 @@ config KS8842
|
||||
help
|
||||
This platform driver is for Micrel KSZ8842 chip.
|
||||
|
||||
config KS8851
|
||||
tristate "Micrel KS8851 SPI"
|
||||
depends on SPI
|
||||
help
|
||||
SPI driver for Micrel KS8851 SPI attached network chip.
|
||||
|
||||
config VIA_RHINE
|
||||
tristate "VIA Rhine support"
|
||||
depends on NET_PCI && PCI
|
||||
|
@ -88,6 +88,7 @@ obj-$(CONFIG_SKGE) += skge.o
|
||||
obj-$(CONFIG_SKY2) += sky2.o
|
||||
obj-$(CONFIG_SKFP) += skfp/
|
||||
obj-$(CONFIG_KS8842) += ks8842.o
|
||||
obj-$(CONFIG_KS8851) += ks8851.o
|
||||
obj-$(CONFIG_VIA_RHINE) += via-rhine.o
|
||||
obj-$(CONFIG_VIA_VELOCITY) += via-velocity.o
|
||||
obj-$(CONFIG_ADAPTEC_STARFIRE) += starfire.o
|
||||
|
@ -63,3 +63,11 @@ config IXP4XX_ETH
|
||||
help
|
||||
Say Y here if you want to use built-in Ethernet ports
|
||||
on IXP4xx processor.
|
||||
|
||||
config W90P910_ETH
|
||||
tristate "Nuvoton w90p910 Ethernet support"
|
||||
depends on ARM && ARCH_W90X900
|
||||
select PHYLIB
|
||||
help
|
||||
Say Y here if you want to use built-in Ethernet ports
|
||||
on w90p910 processor.
|
||||
|
@ -11,3 +11,4 @@ obj-$(CONFIG_ARM_AT91_ETHER) += at91_ether.o
|
||||
obj-$(CONFIG_ARM_KS8695_ETHER) += ks8695net.o
|
||||
obj-$(CONFIG_EP93XX_ETH) += ep93xx_eth.o
|
||||
obj-$(CONFIG_IXP4XX_ETH) += ixp4xx_eth.o
|
||||
obj-$(CONFIG_W90P910_ETH) += w90p910_ether.o
|
||||
|
1105
drivers/net/arm/w90p910_ether.c
Normal file
1105
drivers/net/arm/w90p910_ether.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -188,14 +188,14 @@ struct atl1c_tpd_ext_desc {
|
||||
#define RRS_HDS_TYPE_DATA 2
|
||||
|
||||
#define RRS_IS_NO_HDS_TYPE(flag) \
|
||||
(((flag) >> (RRS_HDS_TYPE_SHIFT)) & RRS_HDS_TYPE_MASK == 0)
|
||||
((((flag) >> (RRS_HDS_TYPE_SHIFT)) & RRS_HDS_TYPE_MASK) == 0)
|
||||
|
||||
#define RRS_IS_HDS_HEAD(flag) \
|
||||
(((flag) >> (RRS_HDS_TYPE_SHIFT)) & RRS_HDS_TYPE_MASK == \
|
||||
((((flag) >> (RRS_HDS_TYPE_SHIFT)) & RRS_HDS_TYPE_MASK) == \
|
||||
RRS_HDS_TYPE_HEAD)
|
||||
|
||||
#define RRS_IS_HDS_DATA(flag) \
|
||||
(((flag) >> (RRS_HDS_TYPE_SHIFT)) & RRS_HDS_TYPE_MASK == \
|
||||
((((flag) >> (RRS_HDS_TYPE_SHIFT)) & RRS_HDS_TYPE_MASK) == \
|
||||
RRS_HDS_TYPE_DATA)
|
||||
|
||||
/* rrs word 3 bit 0:31 */
|
||||
@ -245,7 +245,7 @@ struct atl1c_tpd_ext_desc {
|
||||
#define RRS_PACKET_TYPE_802_3 1
|
||||
#define RRS_PACKET_TYPE_ETH 0
|
||||
#define RRS_PACKET_IS_ETH(word) \
|
||||
(((word) >> RRS_PACKET_TYPE_SHIFT) & RRS_PACKET_TYPE_MASK == \
|
||||
((((word) >> RRS_PACKET_TYPE_SHIFT) & RRS_PACKET_TYPE_MASK) == \
|
||||
RRS_PACKET_TYPE_ETH)
|
||||
#define RRS_RXD_IS_VALID(word) \
|
||||
((((word) >> RRS_RXD_UPDATED_SHIFT) & RRS_RXD_UPDATED_MASK) == 1)
|
||||
|
@ -1689,7 +1689,7 @@ static void atl1c_clean_rx_irq(struct atl1c_adapter *adapter, u8 que,
|
||||
if (likely(RRS_RXD_IS_VALID(rrs->word3))) {
|
||||
rfd_num = (rrs->word0 >> RRS_RX_RFD_CNT_SHIFT) &
|
||||
RRS_RX_RFD_CNT_MASK;
|
||||
if (unlikely(rfd_num) != 1)
|
||||
if (unlikely(rfd_num != 1))
|
||||
/* TODO support mul rfd*/
|
||||
if (netif_msg_rx_err(adapter))
|
||||
dev_warn(&pdev->dev,
|
||||
|
@ -4212,13 +4212,14 @@ static void bnx2x_turn_off_sf(struct bnx2x *bp, u8 port)
|
||||
u8 bnx2x_get_ext_phy_fw_version(struct link_params *params, u8 driver_loaded,
|
||||
u8 *version, u16 len)
|
||||
{
|
||||
struct bnx2x *bp = params->bp;
|
||||
struct bnx2x *bp;
|
||||
u32 ext_phy_type = 0;
|
||||
u32 spirom_ver = 0;
|
||||
u8 status = 0 ;
|
||||
|
||||
if (version == NULL || params == NULL)
|
||||
return -EINVAL;
|
||||
bp = params->bp;
|
||||
|
||||
spirom_ver = REG_RD(bp, params->shmem_base +
|
||||
offsetof(struct shmem_region,
|
||||
|
@ -1459,8 +1459,16 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
|
||||
* ether type (eg ARPHRD_ETHER and ARPHRD_INFINIBAND) share the same bond
|
||||
*/
|
||||
if (bond->slave_cnt == 0) {
|
||||
if (slave_dev->type != ARPHRD_ETHER)
|
||||
bond_setup_by_slave(bond_dev, slave_dev);
|
||||
if (bond_dev->type != slave_dev->type) {
|
||||
dev_close(bond_dev);
|
||||
pr_debug("%s: change device type from %d to %d\n",
|
||||
bond_dev->name, bond_dev->type, slave_dev->type);
|
||||
if (slave_dev->type != ARPHRD_ETHER)
|
||||
bond_setup_by_slave(bond_dev, slave_dev);
|
||||
else
|
||||
ether_setup(bond_dev);
|
||||
dev_open(bond_dev);
|
||||
}
|
||||
} else if (bond_dev->type != slave_dev->type) {
|
||||
pr_err(DRV_NAME ": %s ether type (%d) is different "
|
||||
"from other slaves (%d), can not enslave it.\n",
|
||||
|
@ -346,7 +346,7 @@ void can_restart(unsigned long data)
|
||||
skb = dev_alloc_skb(sizeof(struct can_frame));
|
||||
if (skb == NULL) {
|
||||
err = -ENOMEM;
|
||||
goto out;
|
||||
goto restart;
|
||||
}
|
||||
skb->dev = dev;
|
||||
skb->protocol = htons(ETH_P_CAN);
|
||||
@ -361,13 +361,13 @@ void can_restart(unsigned long data)
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->can_dlc;
|
||||
|
||||
restart:
|
||||
dev_dbg(dev->dev.parent, "restarted\n");
|
||||
priv->can_stats.restarts++;
|
||||
|
||||
/* Now restart the device */
|
||||
err = priv->do_set_mode(dev, CAN_MODE_START);
|
||||
|
||||
out:
|
||||
netif_carrier_on(dev);
|
||||
if (err)
|
||||
dev_err(dev->dev.parent, "Error %d during restart", err);
|
||||
@ -473,6 +473,10 @@ int open_candev(struct net_device *dev)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Switch carrier on if device was stopped while in bus-off state */
|
||||
if (!netif_carrier_ok(dev))
|
||||
netif_carrier_on(dev);
|
||||
|
||||
setup_timer(&priv->restart_timer, can_restart, (unsigned long)dev);
|
||||
|
||||
return 0;
|
||||
|
@ -63,7 +63,6 @@
|
||||
#include <linux/can.h>
|
||||
#include <linux/can/dev.h>
|
||||
#include <linux/can/error.h>
|
||||
#include <linux/can/dev.h>
|
||||
|
||||
#include "sja1000.h"
|
||||
|
||||
|
@ -1897,6 +1897,9 @@ static int e100_rx_indicate(struct nic *nic, struct rx *rx,
|
||||
|
||||
if (ioread8(&nic->csr->scb.status) & rus_no_res)
|
||||
nic->ru_running = RU_SUSPENDED;
|
||||
pci_dma_sync_single_for_device(nic->pdev, rx->dma_addr,
|
||||
sizeof(struct rfd),
|
||||
PCI_DMA_BIDIRECTIONAL);
|
||||
return -ENODATA;
|
||||
}
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
* devices like TTY. It interfaces between a raw TTY and the
|
||||
* kernel's AX.25 protocol layers.
|
||||
*
|
||||
* Authors: Andreas Könsgen <ajk@iehk.rwth-aachen.de>
|
||||
* Authors: Andreas Könsgen <ajk@comnets.uni-bremen.de>
|
||||
* Ralf Baechle DL5RB <ralf@linux-mips.org>
|
||||
*
|
||||
* Quite a lot of stuff "stolen" by Joerg Reuter from slip.c, written by
|
||||
|
@ -188,11 +188,12 @@ void rgmii_put_mdio(struct of_device *ofdev, int input)
|
||||
void rgmii_detach(struct of_device *ofdev, int input)
|
||||
{
|
||||
struct rgmii_instance *dev = dev_get_drvdata(&ofdev->dev);
|
||||
struct rgmii_regs __iomem *p = dev->base;
|
||||
|
||||
mutex_lock(&dev->lock);
|
||||
struct rgmii_regs __iomem *p;
|
||||
|
||||
BUG_ON(!dev || dev->users == 0);
|
||||
p = dev->base;
|
||||
|
||||
mutex_lock(&dev->lock);
|
||||
|
||||
RGMII_DBG(dev, "detach(%d)" NL, input);
|
||||
|
||||
|
@ -106,8 +106,6 @@ static u8 ixgbe_dcbnl_get_state(struct net_device *netdev)
|
||||
{
|
||||
struct ixgbe_adapter *adapter = netdev_priv(netdev);
|
||||
|
||||
DPRINTK(DRV, INFO, "Get DCB Admin Mode.\n");
|
||||
|
||||
return !!(adapter->flags & IXGBE_FLAG_DCB_ENABLED);
|
||||
}
|
||||
|
||||
@ -116,8 +114,6 @@ static u8 ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state)
|
||||
u8 err = 0;
|
||||
struct ixgbe_adapter *adapter = netdev_priv(netdev);
|
||||
|
||||
DPRINTK(DRV, INFO, "Set DCB Admin Mode.\n");
|
||||
|
||||
if (state > 0) {
|
||||
/* Turn on DCB */
|
||||
if (adapter->flags & IXGBE_FLAG_DCB_ENABLED)
|
||||
@ -175,6 +171,8 @@ static void ixgbe_dcbnl_get_perm_hw_addr(struct net_device *netdev,
|
||||
struct ixgbe_adapter *adapter = netdev_priv(netdev);
|
||||
int i, j;
|
||||
|
||||
memset(perm_addr, 0xff, MAX_ADDR_LEN);
|
||||
|
||||
for (i = 0; i < netdev->addr_len; i++)
|
||||
perm_addr[i] = adapter->hw.mac.perm_addr[i];
|
||||
|
||||
|
@ -229,6 +229,7 @@ static int __init jazz_sonic_probe(struct platform_device *pdev)
|
||||
lp = netdev_priv(dev);
|
||||
lp->device = &pdev->dev;
|
||||
SET_NETDEV_DEV(dev, &pdev->dev);
|
||||
platform_set_drvdata(pdev, dev);
|
||||
|
||||
netdev_boot_setup_check(dev);
|
||||
|
||||
|
1322
drivers/net/ks8851.c
Normal file
1322
drivers/net/ks8851.c
Normal file
File diff suppressed because it is too large
Load Diff
296
drivers/net/ks8851.h
Normal file
296
drivers/net/ks8851.h
Normal file
@ -0,0 +1,296 @@
|
||||
/* drivers/net/ks8851.h
|
||||
*
|
||||
* Copyright 2009 Simtec Electronics
|
||||
* Ben Dooks <ben@simtec.co.uk>
|
||||
*
|
||||
* KS8851 register definitions
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#define KS_CCR 0x08
|
||||
#define CCR_EEPROM (1 << 9)
|
||||
#define CCR_SPI (1 << 8)
|
||||
#define CCR_32PIN (1 << 0)
|
||||
|
||||
/* MAC address registers */
|
||||
#define KS_MARL 0x10
|
||||
#define KS_MARM 0x12
|
||||
#define KS_MARH 0x14
|
||||
|
||||
#define KS_OBCR 0x20
|
||||
#define OBCR_ODS_16mA (1 << 6)
|
||||
|
||||
#define KS_EEPCR 0x22
|
||||
#define EEPCR_EESA (1 << 4)
|
||||
#define EEPCR_EESB (1 << 3)
|
||||
#define EEPCR_EEDO (1 << 2)
|
||||
#define EEPCR_EESCK (1 << 1)
|
||||
#define EEPCR_EECS (1 << 0)
|
||||
|
||||
#define KS_MBIR 0x24
|
||||
#define MBIR_TXMBF (1 << 12)
|
||||
#define MBIR_TXMBFA (1 << 11)
|
||||
#define MBIR_RXMBF (1 << 4)
|
||||
#define MBIR_RXMBFA (1 << 3)
|
||||
|
||||
#define KS_GRR 0x26
|
||||
#define GRR_QMU (1 << 1)
|
||||
#define GRR_GSR (1 << 0)
|
||||
|
||||
#define KS_WFCR 0x2A
|
||||
#define WFCR_MPRXE (1 << 7)
|
||||
#define WFCR_WF3E (1 << 3)
|
||||
#define WFCR_WF2E (1 << 2)
|
||||
#define WFCR_WF1E (1 << 1)
|
||||
#define WFCR_WF0E (1 << 0)
|
||||
|
||||
#define KS_WF0CRC0 0x30
|
||||
#define KS_WF0CRC1 0x32
|
||||
#define KS_WF0BM0 0x34
|
||||
#define KS_WF0BM1 0x36
|
||||
#define KS_WF0BM2 0x38
|
||||
#define KS_WF0BM3 0x3A
|
||||
|
||||
#define KS_WF1CRC0 0x40
|
||||
#define KS_WF1CRC1 0x42
|
||||
#define KS_WF1BM0 0x44
|
||||
#define KS_WF1BM1 0x46
|
||||
#define KS_WF1BM2 0x48
|
||||
#define KS_WF1BM3 0x4A
|
||||
|
||||
#define KS_WF2CRC0 0x50
|
||||
#define KS_WF2CRC1 0x52
|
||||
#define KS_WF2BM0 0x54
|
||||
#define KS_WF2BM1 0x56
|
||||
#define KS_WF2BM2 0x58
|
||||
#define KS_WF2BM3 0x5A
|
||||
|
||||
#define KS_WF3CRC0 0x60
|
||||
#define KS_WF3CRC1 0x62
|
||||
#define KS_WF3BM0 0x64
|
||||
#define KS_WF3BM1 0x66
|
||||
#define KS_WF3BM2 0x68
|
||||
#define KS_WF3BM3 0x6A
|
||||
|
||||
#define KS_TXCR 0x70
|
||||
#define TXCR_TCGICMP (1 << 8)
|
||||
#define TXCR_TCGUDP (1 << 7)
|
||||
#define TXCR_TCGTCP (1 << 6)
|
||||
#define TXCR_TCGIP (1 << 5)
|
||||
#define TXCR_FTXQ (1 << 4)
|
||||
#define TXCR_TXFCE (1 << 3)
|
||||
#define TXCR_TXPE (1 << 2)
|
||||
#define TXCR_TXCRC (1 << 1)
|
||||
#define TXCR_TXE (1 << 0)
|
||||
|
||||
#define KS_TXSR 0x72
|
||||
#define TXSR_TXLC (1 << 13)
|
||||
#define TXSR_TXMC (1 << 12)
|
||||
#define TXSR_TXFID_MASK (0x3f << 0)
|
||||
#define TXSR_TXFID_SHIFT (0)
|
||||
#define TXSR_TXFID_GET(_v) (((_v) >> 0) & 0x3f)
|
||||
|
||||
#define KS_RXCR1 0x74
|
||||
#define RXCR1_FRXQ (1 << 15)
|
||||
#define RXCR1_RXUDPFCC (1 << 14)
|
||||
#define RXCR1_RXTCPFCC (1 << 13)
|
||||
#define RXCR1_RXIPFCC (1 << 12)
|
||||
#define RXCR1_RXPAFMA (1 << 11)
|
||||
#define RXCR1_RXFCE (1 << 10)
|
||||
#define RXCR1_RXEFE (1 << 9)
|
||||
#define RXCR1_RXMAFMA (1 << 8)
|
||||
#define RXCR1_RXBE (1 << 7)
|
||||
#define RXCR1_RXME (1 << 6)
|
||||
#define RXCR1_RXUE (1 << 5)
|
||||
#define RXCR1_RXAE (1 << 4)
|
||||
#define RXCR1_RXINVF (1 << 1)
|
||||
#define RXCR1_RXE (1 << 0)
|
||||
|
||||
#define KS_RXCR2 0x76
|
||||
#define RXCR2_SRDBL_MASK (0x7 << 5)
|
||||
#define RXCR2_SRDBL_SHIFT (5)
|
||||
#define RXCR2_SRDBL_4B (0x0 << 5)
|
||||
#define RXCR2_SRDBL_8B (0x1 << 5)
|
||||
#define RXCR2_SRDBL_16B (0x2 << 5)
|
||||
#define RXCR2_SRDBL_32B (0x3 << 5)
|
||||
#define RXCR2_SRDBL_FRAME (0x4 << 5)
|
||||
#define RXCR2_IUFFP (1 << 4)
|
||||
#define RXCR2_RXIUFCEZ (1 << 3)
|
||||
#define RXCR2_UDPLFE (1 << 2)
|
||||
#define RXCR2_RXICMPFCC (1 << 1)
|
||||
#define RXCR2_RXSAF (1 << 0)
|
||||
|
||||
#define KS_TXMIR 0x78
|
||||
|
||||
#define KS_RXFHSR 0x7C
|
||||
#define RXFSHR_RXFV (1 << 15)
|
||||
#define RXFSHR_RXICMPFCS (1 << 13)
|
||||
#define RXFSHR_RXIPFCS (1 << 12)
|
||||
#define RXFSHR_RXTCPFCS (1 << 11)
|
||||
#define RXFSHR_RXUDPFCS (1 << 10)
|
||||
#define RXFSHR_RXBF (1 << 7)
|
||||
#define RXFSHR_RXMF (1 << 6)
|
||||
#define RXFSHR_RXUF (1 << 5)
|
||||
#define RXFSHR_RXMR (1 << 4)
|
||||
#define RXFSHR_RXFT (1 << 3)
|
||||
#define RXFSHR_RXFTL (1 << 2)
|
||||
#define RXFSHR_RXRF (1 << 1)
|
||||
#define RXFSHR_RXCE (1 << 0)
|
||||
|
||||
#define KS_RXFHBCR 0x7E
|
||||
#define KS_TXQCR 0x80
|
||||
#define TXQCR_AETFE (1 << 2)
|
||||
#define TXQCR_TXQMAM (1 << 1)
|
||||
#define TXQCR_METFE (1 << 0)
|
||||
|
||||
#define KS_RXQCR 0x82
|
||||
#define RXQCR_RXDTTS (1 << 12)
|
||||
#define RXQCR_RXDBCTS (1 << 11)
|
||||
#define RXQCR_RXFCTS (1 << 10)
|
||||
#define RXQCR_RXIPHTOE (1 << 9)
|
||||
#define RXQCR_RXDTTE (1 << 7)
|
||||
#define RXQCR_RXDBCTE (1 << 6)
|
||||
#define RXQCR_RXFCTE (1 << 5)
|
||||
#define RXQCR_ADRFE (1 << 4)
|
||||
#define RXQCR_SDA (1 << 3)
|
||||
#define RXQCR_RRXEF (1 << 0)
|
||||
|
||||
#define KS_TXFDPR 0x84
|
||||
#define TXFDPR_TXFPAI (1 << 14)
|
||||
#define TXFDPR_TXFP_MASK (0x7ff << 0)
|
||||
#define TXFDPR_TXFP_SHIFT (0)
|
||||
|
||||
#define KS_RXFDPR 0x86
|
||||
#define RXFDPR_RXFPAI (1 << 14)
|
||||
|
||||
#define KS_RXDTTR 0x8C
|
||||
#define KS_RXDBCTR 0x8E
|
||||
|
||||
#define KS_IER 0x90
|
||||
#define KS_ISR 0x92
|
||||
#define IRQ_LCI (1 << 15)
|
||||
#define IRQ_TXI (1 << 14)
|
||||
#define IRQ_RXI (1 << 13)
|
||||
#define IRQ_RXOI (1 << 11)
|
||||
#define IRQ_TXPSI (1 << 9)
|
||||
#define IRQ_RXPSI (1 << 8)
|
||||
#define IRQ_TXSAI (1 << 6)
|
||||
#define IRQ_RXWFDI (1 << 5)
|
||||
#define IRQ_RXMPDI (1 << 4)
|
||||
#define IRQ_LDI (1 << 3)
|
||||
#define IRQ_EDI (1 << 2)
|
||||
#define IRQ_SPIBEI (1 << 1)
|
||||
#define IRQ_DEDI (1 << 0)
|
||||
|
||||
#define KS_RXFCTR 0x9C
|
||||
#define KS_RXFC 0x9D
|
||||
#define RXFCTR_RXFC_MASK (0xff << 8)
|
||||
#define RXFCTR_RXFC_SHIFT (8)
|
||||
#define RXFCTR_RXFC_GET(_v) (((_v) >> 8) & 0xff)
|
||||
#define RXFCTR_RXFCT_MASK (0xff << 0)
|
||||
#define RXFCTR_RXFCT_SHIFT (0)
|
||||
|
||||
#define KS_TXNTFSR 0x9E
|
||||
|
||||
#define KS_MAHTR0 0xA0
|
||||
#define KS_MAHTR1 0xA2
|
||||
#define KS_MAHTR2 0xA4
|
||||
#define KS_MAHTR3 0xA6
|
||||
|
||||
#define KS_FCLWR 0xB0
|
||||
#define KS_FCHWR 0xB2
|
||||
#define KS_FCOWR 0xB4
|
||||
|
||||
#define KS_CIDER 0xC0
|
||||
#define CIDER_ID 0x8870
|
||||
#define CIDER_REV_MASK (0x7 << 1)
|
||||
#define CIDER_REV_SHIFT (1)
|
||||
#define CIDER_REV_GET(_v) (((_v) >> 1) & 0x7)
|
||||
|
||||
#define KS_CGCR 0xC6
|
||||
|
||||
#define KS_IACR 0xC8
|
||||
#define IACR_RDEN (1 << 12)
|
||||
#define IACR_TSEL_MASK (0x3 << 10)
|
||||
#define IACR_TSEL_SHIFT (10)
|
||||
#define IACR_TSEL_MIB (0x3 << 10)
|
||||
#define IACR_ADDR_MASK (0x1f << 0)
|
||||
#define IACR_ADDR_SHIFT (0)
|
||||
|
||||
#define KS_IADLR 0xD0
|
||||
#define KS_IAHDR 0xD2
|
||||
|
||||
#define KS_PMECR 0xD4
|
||||
#define PMECR_PME_DELAY (1 << 14)
|
||||
#define PMECR_PME_POL (1 << 12)
|
||||
#define PMECR_WOL_WAKEUP (1 << 11)
|
||||
#define PMECR_WOL_MAGICPKT (1 << 10)
|
||||
#define PMECR_WOL_LINKUP (1 << 9)
|
||||
#define PMECR_WOL_ENERGY (1 << 8)
|
||||
#define PMECR_AUTO_WAKE_EN (1 << 7)
|
||||
#define PMECR_WAKEUP_NORMAL (1 << 6)
|
||||
#define PMECR_WKEVT_MASK (0xf << 2)
|
||||
#define PMECR_WKEVT_SHIFT (2)
|
||||
#define PMECR_WKEVT_GET(_v) (((_v) >> 2) & 0xf)
|
||||
#define PMECR_WKEVT_ENERGY (0x1 << 2)
|
||||
#define PMECR_WKEVT_LINK (0x2 << 2)
|
||||
#define PMECR_WKEVT_MAGICPKT (0x4 << 2)
|
||||
#define PMECR_WKEVT_FRAME (0x8 << 2)
|
||||
#define PMECR_PM_MASK (0x3 << 0)
|
||||
#define PMECR_PM_SHIFT (0)
|
||||
#define PMECR_PM_NORMAL (0x0 << 0)
|
||||
#define PMECR_PM_ENERGY (0x1 << 0)
|
||||
#define PMECR_PM_SOFTDOWN (0x2 << 0)
|
||||
#define PMECR_PM_POWERSAVE (0x3 << 0)
|
||||
|
||||
/* Standard MII PHY data */
|
||||
#define KS_P1MBCR 0xE4
|
||||
#define KS_P1MBSR 0xE6
|
||||
#define KS_PHY1ILR 0xE8
|
||||
#define KS_PHY1IHR 0xEA
|
||||
#define KS_P1ANAR 0xEC
|
||||
#define KS_P1ANLPR 0xEE
|
||||
|
||||
#define KS_P1SCLMD 0xF4
|
||||
#define P1SCLMD_LEDOFF (1 << 15)
|
||||
#define P1SCLMD_TXIDS (1 << 14)
|
||||
#define P1SCLMD_RESTARTAN (1 << 13)
|
||||
#define P1SCLMD_DISAUTOMDIX (1 << 10)
|
||||
#define P1SCLMD_FORCEMDIX (1 << 9)
|
||||
#define P1SCLMD_AUTONEGEN (1 << 7)
|
||||
#define P1SCLMD_FORCE100 (1 << 6)
|
||||
#define P1SCLMD_FORCEFDX (1 << 5)
|
||||
#define P1SCLMD_ADV_FLOW (1 << 4)
|
||||
#define P1SCLMD_ADV_100BT_FDX (1 << 3)
|
||||
#define P1SCLMD_ADV_100BT_HDX (1 << 2)
|
||||
#define P1SCLMD_ADV_10BT_FDX (1 << 1)
|
||||
#define P1SCLMD_ADV_10BT_HDX (1 << 0)
|
||||
|
||||
#define KS_P1CR 0xF6
|
||||
#define P1CR_HP_MDIX (1 << 15)
|
||||
#define P1CR_REV_POL (1 << 13)
|
||||
#define P1CR_OP_100M (1 << 10)
|
||||
#define P1CR_OP_FDX (1 << 9)
|
||||
#define P1CR_OP_MDI (1 << 7)
|
||||
#define P1CR_AN_DONE (1 << 6)
|
||||
#define P1CR_LINK_GOOD (1 << 5)
|
||||
#define P1CR_PNTR_FLOW (1 << 4)
|
||||
#define P1CR_PNTR_100BT_FDX (1 << 3)
|
||||
#define P1CR_PNTR_100BT_HDX (1 << 2)
|
||||
#define P1CR_PNTR_10BT_FDX (1 << 1)
|
||||
#define P1CR_PNTR_10BT_HDX (1 << 0)
|
||||
|
||||
/* TX Frame control */
|
||||
|
||||
#define TXFR_TXIC (1 << 15)
|
||||
#define TXFR_TXFID_MASK (0x3f << 0)
|
||||
#define TXFR_TXFID_SHIFT (0)
|
||||
|
||||
/* SPI frame opcodes */
|
||||
#define KS_SPIOP_RD (0x00)
|
||||
#define KS_SPIOP_WR (0x40)
|
||||
#define KS_SPIOP_RXFIFO (0x80)
|
||||
#define KS_SPIOP_TXFIFO (0xC0)
|
@ -179,7 +179,7 @@ static const struct net_device_ops macsonic_netdev_ops = {
|
||||
.ndo_set_mac_address = eth_mac_addr,
|
||||
};
|
||||
|
||||
static int __init macsonic_init(struct net_device *dev)
|
||||
static int __devinit macsonic_init(struct net_device *dev)
|
||||
{
|
||||
struct sonic_local* lp = netdev_priv(dev);
|
||||
|
||||
@ -223,7 +223,7 @@ static int __init macsonic_init(struct net_device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init mac_onboard_sonic_ethernet_addr(struct net_device *dev)
|
||||
static int __devinit mac_onboard_sonic_ethernet_addr(struct net_device *dev)
|
||||
{
|
||||
struct sonic_local *lp = netdev_priv(dev);
|
||||
const int prom_addr = ONBOARD_SONIC_PROM_BASE;
|
||||
@ -288,7 +288,7 @@ static int __init mac_onboard_sonic_ethernet_addr(struct net_device *dev)
|
||||
} else return 0;
|
||||
}
|
||||
|
||||
static int __init mac_onboard_sonic_probe(struct net_device *dev)
|
||||
static int __devinit mac_onboard_sonic_probe(struct net_device *dev)
|
||||
{
|
||||
/* Bwahahaha */
|
||||
static int once_is_more_than_enough;
|
||||
@ -409,7 +409,7 @@ static int __init mac_onboard_sonic_probe(struct net_device *dev)
|
||||
return macsonic_init(dev);
|
||||
}
|
||||
|
||||
static int __init mac_nubus_sonic_ethernet_addr(struct net_device *dev,
|
||||
static int __devinit mac_nubus_sonic_ethernet_addr(struct net_device *dev,
|
||||
unsigned long prom_addr,
|
||||
int id)
|
||||
{
|
||||
@ -424,7 +424,7 @@ static int __init mac_nubus_sonic_ethernet_addr(struct net_device *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init macsonic_ident(struct nubus_dev *ndev)
|
||||
static int __devinit macsonic_ident(struct nubus_dev *ndev)
|
||||
{
|
||||
if (ndev->dr_hw == NUBUS_DRHW_ASANTE_LC &&
|
||||
ndev->dr_sw == NUBUS_DRSW_SONIC_LC)
|
||||
@ -449,7 +449,7 @@ static int __init macsonic_ident(struct nubus_dev *ndev)
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int __init mac_nubus_sonic_probe(struct net_device *dev)
|
||||
static int __devinit mac_nubus_sonic_probe(struct net_device *dev)
|
||||
{
|
||||
static int slots;
|
||||
struct nubus_dev* ndev = NULL;
|
||||
@ -562,7 +562,7 @@ static int __init mac_nubus_sonic_probe(struct net_device *dev)
|
||||
return macsonic_init(dev);
|
||||
}
|
||||
|
||||
static int __init mac_sonic_probe(struct platform_device *pdev)
|
||||
static int __devinit mac_sonic_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct net_device *dev;
|
||||
struct sonic_local *lp;
|
||||
@ -575,6 +575,7 @@ static int __init mac_sonic_probe(struct platform_device *pdev)
|
||||
lp = netdev_priv(dev);
|
||||
lp->device = &pdev->dev;
|
||||
SET_NETDEV_DEV(dev, &pdev->dev);
|
||||
platform_set_drvdata(pdev, dev);
|
||||
|
||||
/* This will catch fatal stuff like -ENOMEM as well as success */
|
||||
err = mac_onboard_sonic_probe(dev);
|
||||
|
@ -220,7 +220,7 @@ static int mlx4_en_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
|
||||
{
|
||||
cmd->autoneg = AUTONEG_DISABLE;
|
||||
cmd->supported = SUPPORTED_10000baseT_Full;
|
||||
cmd->advertising = SUPPORTED_10000baseT_Full;
|
||||
cmd->advertising = ADVERTISED_1000baseT_Full;
|
||||
if (netif_carrier_ok(dev)) {
|
||||
cmd->speed = SPEED_10000;
|
||||
cmd->duplex = DUPLEX_FULL;
|
||||
|
@ -210,6 +210,7 @@
|
||||
#define NETXEN_CTX_SIGNATURE 0xdee0
|
||||
#define NETXEN_CTX_SIGNATURE_V2 0x0002dee0
|
||||
#define NETXEN_CTX_RESET 0xbad0
|
||||
#define NETXEN_CTX_D3_RESET 0xacc0
|
||||
#define NETXEN_RCV_PRODUCER(ringid) (ringid)
|
||||
|
||||
#define PHAN_PEG_RCV_INITIALIZED 0xff01
|
||||
@ -773,6 +774,8 @@ struct nx_host_tx_ring {
|
||||
u32 crb_cmd_consumer;
|
||||
u32 num_desc;
|
||||
|
||||
struct netdev_queue *txq;
|
||||
|
||||
struct netxen_cmd_buffer *cmd_buf_arr;
|
||||
struct cmd_desc_type0 *desc_head;
|
||||
dma_addr_t phys_addr;
|
||||
|
@ -684,10 +684,8 @@ int netxen_alloc_hw_resources(struct netxen_adapter *adapter)
|
||||
goto err_out_free;
|
||||
} else {
|
||||
err = netxen_init_old_ctx(adapter);
|
||||
if (err) {
|
||||
netxen_free_hw_resources(adapter);
|
||||
return err;
|
||||
}
|
||||
if (err)
|
||||
goto err_out_free;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -708,15 +706,18 @@ void netxen_free_hw_resources(struct netxen_adapter *adapter)
|
||||
int port = adapter->portnum;
|
||||
|
||||
if (adapter->fw_major >= 4) {
|
||||
nx_fw_cmd_destroy_tx_ctx(adapter);
|
||||
nx_fw_cmd_destroy_rx_ctx(adapter);
|
||||
nx_fw_cmd_destroy_tx_ctx(adapter);
|
||||
} else {
|
||||
netxen_api_lock(adapter);
|
||||
NXWR32(adapter, CRB_CTX_SIGNATURE_REG(port),
|
||||
NETXEN_CTX_RESET | port);
|
||||
NETXEN_CTX_D3_RESET | port);
|
||||
netxen_api_unlock(adapter);
|
||||
}
|
||||
|
||||
/* Allow dma queues to drain after context reset */
|
||||
msleep(20);
|
||||
|
||||
recv_ctx = &adapter->recv_ctx;
|
||||
|
||||
if (recv_ctx->hwctx != NULL) {
|
||||
|
@ -461,13 +461,14 @@ netxen_send_cmd_descs(struct netxen_adapter *adapter,
|
||||
i = 0;
|
||||
|
||||
tx_ring = adapter->tx_ring;
|
||||
netif_tx_lock_bh(adapter->netdev);
|
||||
__netif_tx_lock_bh(tx_ring->txq);
|
||||
|
||||
producer = tx_ring->producer;
|
||||
consumer = tx_ring->sw_consumer;
|
||||
|
||||
if (nr_desc >= find_diff_among(producer, consumer, tx_ring->num_desc)) {
|
||||
netif_tx_unlock_bh(adapter->netdev);
|
||||
if (nr_desc >= netxen_tx_avail(tx_ring)) {
|
||||
netif_tx_stop_queue(tx_ring->txq);
|
||||
__netif_tx_unlock_bh(tx_ring->txq);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
@ -490,7 +491,7 @@ netxen_send_cmd_descs(struct netxen_adapter *adapter,
|
||||
|
||||
netxen_nic_update_cmd_producer(adapter, tx_ring);
|
||||
|
||||
netif_tx_unlock_bh(adapter->netdev);
|
||||
__netif_tx_unlock_bh(tx_ring->txq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -214,6 +214,7 @@ int netxen_alloc_sw_resources(struct netxen_adapter *adapter)
|
||||
adapter->tx_ring = tx_ring;
|
||||
|
||||
tx_ring->num_desc = adapter->num_txd;
|
||||
tx_ring->txq = netdev_get_tx_queue(netdev, 0);
|
||||
|
||||
cmd_buf_arr = vmalloc(TX_BUFF_RINGSIZE(tx_ring));
|
||||
if (cmd_buf_arr == NULL) {
|
||||
@ -1400,10 +1401,10 @@ int netxen_process_cmd_ring(struct netxen_adapter *adapter)
|
||||
smp_mb();
|
||||
|
||||
if (netif_queue_stopped(netdev) && netif_carrier_ok(netdev)) {
|
||||
netif_tx_lock(netdev);
|
||||
__netif_tx_lock(tx_ring->txq, smp_processor_id());
|
||||
if (netxen_tx_avail(tx_ring) > TX_STOP_THRESH)
|
||||
netif_wake_queue(netdev);
|
||||
netif_tx_unlock(netdev);
|
||||
__netif_tx_unlock(tx_ring->txq);
|
||||
}
|
||||
}
|
||||
/*
|
||||
|
@ -215,9 +215,9 @@ netxen_napi_disable(struct netxen_adapter *adapter)
|
||||
|
||||
for (ring = 0; ring < adapter->max_sds_rings; ring++) {
|
||||
sds_ring = &recv_ctx->sds_rings[ring];
|
||||
napi_disable(&sds_ring->napi);
|
||||
netxen_nic_disable_int(sds_ring);
|
||||
synchronize_irq(sds_ring->irq);
|
||||
napi_synchronize(&sds_ring->napi);
|
||||
napi_disable(&sds_ring->napi);
|
||||
}
|
||||
}
|
||||
|
||||
@ -833,11 +833,11 @@ netxen_nic_up(struct netxen_adapter *adapter, struct net_device *netdev)
|
||||
|
||||
adapter->ahw.linkup = 0;
|
||||
|
||||
netxen_napi_enable(adapter);
|
||||
|
||||
if (adapter->max_sds_rings > 1)
|
||||
netxen_config_rss(adapter, 1);
|
||||
|
||||
netxen_napi_enable(adapter);
|
||||
|
||||
if (adapter->capabilities & NX_FW_CAPABILITY_LINK_NOTIFICATION)
|
||||
netxen_linkevent_request(adapter, 1);
|
||||
else
|
||||
@ -851,8 +851,9 @@ netxen_nic_up(struct netxen_adapter *adapter, struct net_device *netdev)
|
||||
static void
|
||||
netxen_nic_down(struct netxen_adapter *adapter, struct net_device *netdev)
|
||||
{
|
||||
spin_lock(&adapter->tx_clean_lock);
|
||||
netif_carrier_off(netdev);
|
||||
netif_stop_queue(netdev);
|
||||
netif_tx_disable(netdev);
|
||||
|
||||
if (adapter->stop_port)
|
||||
adapter->stop_port(adapter);
|
||||
@ -863,9 +864,10 @@ netxen_nic_down(struct netxen_adapter *adapter, struct net_device *netdev)
|
||||
netxen_napi_disable(adapter);
|
||||
|
||||
netxen_release_tx_buffers(adapter);
|
||||
spin_unlock(&adapter->tx_clean_lock);
|
||||
|
||||
FLUSH_SCHEDULED_WORK();
|
||||
del_timer_sync(&adapter->watchdog_timer);
|
||||
FLUSH_SCHEDULED_WORK();
|
||||
}
|
||||
|
||||
|
||||
@ -943,8 +945,8 @@ err_out_free_sw:
|
||||
static void
|
||||
netxen_nic_detach(struct netxen_adapter *adapter)
|
||||
{
|
||||
netxen_release_rx_buffers(adapter);
|
||||
netxen_free_hw_resources(adapter);
|
||||
netxen_release_rx_buffers(adapter);
|
||||
netxen_nic_free_irq(adapter);
|
||||
netxen_free_sw_resources(adapter);
|
||||
|
||||
@ -1533,10 +1535,12 @@ static int netxen_nic_check_temp(struct netxen_adapter *adapter)
|
||||
printk(KERN_ALERT
|
||||
"%s: Device temperature %d degrees C exceeds"
|
||||
" maximum allowed. Hardware has been shut down.\n",
|
||||
netxen_nic_driver_name, temp_val);
|
||||
netdev->name, temp_val);
|
||||
|
||||
netif_device_detach(netdev);
|
||||
netxen_nic_down(adapter, netdev);
|
||||
netxen_nic_detach(adapter);
|
||||
|
||||
netif_carrier_off(netdev);
|
||||
netif_stop_queue(netdev);
|
||||
rv = 1;
|
||||
} else if (temp_state == NX_TEMP_WARN) {
|
||||
if (adapter->temp == NX_TEMP_NORMAL) {
|
||||
@ -1544,13 +1548,13 @@ static int netxen_nic_check_temp(struct netxen_adapter *adapter)
|
||||
"%s: Device temperature %d degrees C "
|
||||
"exceeds operating range."
|
||||
" Immediate action needed.\n",
|
||||
netxen_nic_driver_name, temp_val);
|
||||
netdev->name, temp_val);
|
||||
}
|
||||
} else {
|
||||
if (adapter->temp == NX_TEMP_WARN) {
|
||||
printk(KERN_INFO
|
||||
"%s: Device temperature is now %d degrees C"
|
||||
" in normal range.\n", netxen_nic_driver_name,
|
||||
" in normal range.\n", netdev->name,
|
||||
temp_val);
|
||||
}
|
||||
}
|
||||
@ -1623,7 +1627,7 @@ void netxen_watchdog_task(struct work_struct *work)
|
||||
struct netxen_adapter *adapter =
|
||||
container_of(work, struct netxen_adapter, watchdog_task);
|
||||
|
||||
if ((adapter->portnum == 0) && netxen_nic_check_temp(adapter))
|
||||
if (netxen_nic_check_temp(adapter))
|
||||
return;
|
||||
|
||||
if (!adapter->has_link_events)
|
||||
@ -1645,6 +1649,9 @@ static void netxen_tx_timeout_task(struct work_struct *work)
|
||||
struct netxen_adapter *adapter =
|
||||
container_of(work, struct netxen_adapter, tx_timeout_task);
|
||||
|
||||
if (!netif_running(adapter->netdev))
|
||||
return;
|
||||
|
||||
printk(KERN_ERR "%s %s: transmit timeout, resetting.\n",
|
||||
netxen_nic_driver_name, adapter->netdev->name);
|
||||
|
||||
@ -1757,7 +1764,8 @@ static int netxen_nic_poll(struct napi_struct *napi, int budget)
|
||||
|
||||
if ((work_done < budget) && tx_complete) {
|
||||
napi_complete(&sds_ring->napi);
|
||||
netxen_nic_enable_int(sds_ring);
|
||||
if (netif_running(adapter->netdev))
|
||||
netxen_nic_enable_int(sds_ring);
|
||||
}
|
||||
|
||||
return work_done;
|
||||
|
@ -156,6 +156,7 @@ static struct net_device_stats *el3_get_stats(struct net_device *dev);
|
||||
static int el3_rx(struct net_device *dev);
|
||||
static int el3_close(struct net_device *dev);
|
||||
static void el3_tx_timeout(struct net_device *dev);
|
||||
static void set_rx_mode(struct net_device *dev);
|
||||
static void set_multicast_list(struct net_device *dev);
|
||||
static const struct ethtool_ops netdev_ethtool_ops;
|
||||
|
||||
@ -488,8 +489,7 @@ static void tc589_reset(struct net_device *dev)
|
||||
/* Switch to register set 1 for normal use. */
|
||||
EL3WINDOW(1);
|
||||
|
||||
/* Accept b-cast and phys addr only. */
|
||||
outw(SetRxFilter | RxStation | RxBroadcast, ioaddr + EL3_CMD);
|
||||
set_rx_mode(dev);
|
||||
outw(StatsEnable, ioaddr + EL3_CMD); /* Turn on statistics. */
|
||||
outw(RxEnable, ioaddr + EL3_CMD); /* Enable the receiver. */
|
||||
outw(TxEnable, ioaddr + EL3_CMD); /* Enable transmitter. */
|
||||
@ -700,7 +700,7 @@ static irqreturn_t el3_interrupt(int irq, void *dev_id)
|
||||
if (fifo_diag & 0x2000) {
|
||||
/* Rx underrun */
|
||||
tc589_wait_for_completion(dev, RxReset);
|
||||
set_multicast_list(dev);
|
||||
set_rx_mode(dev);
|
||||
outw(RxEnable, ioaddr + EL3_CMD);
|
||||
}
|
||||
outw(AckIntr | AdapterFailure, ioaddr + EL3_CMD);
|
||||
@ -905,14 +905,11 @@ static int el3_rx(struct net_device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void set_multicast_list(struct net_device *dev)
|
||||
static void set_rx_mode(struct net_device *dev)
|
||||
{
|
||||
struct el3_private *lp = netdev_priv(dev);
|
||||
struct pcmcia_device *link = lp->p_dev;
|
||||
unsigned int ioaddr = dev->base_addr;
|
||||
u16 opts = SetRxFilter | RxStation | RxBroadcast;
|
||||
|
||||
if (!pcmcia_dev_present(link)) return;
|
||||
if (dev->flags & IFF_PROMISC)
|
||||
opts |= RxMulticast | RxProm;
|
||||
else if (dev->mc_count || (dev->flags & IFF_ALLMULTI))
|
||||
@ -920,6 +917,16 @@ static void set_multicast_list(struct net_device *dev)
|
||||
outw(opts, ioaddr + EL3_CMD);
|
||||
}
|
||||
|
||||
static void set_multicast_list(struct net_device *dev)
|
||||
{
|
||||
struct el3_private *priv = netdev_priv(dev);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
set_rx_mode(dev);
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
}
|
||||
|
||||
static int el3_close(struct net_device *dev)
|
||||
{
|
||||
struct el3_private *lp = netdev_priv(dev);
|
||||
|
@ -1593,6 +1593,7 @@ out:
|
||||
static struct pci_device_id sc92031_pci_device_id_table[] __devinitdata = {
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_SILAN, 0x2031) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_SILAN, 0x8139) },
|
||||
{ PCI_DEVICE(0x1088, 0x2031) },
|
||||
{ 0, }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, sc92031_pci_device_id_table);
|
||||
|
@ -1151,14 +1151,7 @@ stopped:
|
||||
|
||||
/* reset the Rx prefetch unit */
|
||||
sky2_write32(hw, Y2_QADDR(rxq, PREF_UNIT_CTRL), PREF_UNIT_RST_SET);
|
||||
|
||||
/* Reset the RAM Buffer receive queue */
|
||||
sky2_write8(hw, RB_ADDR(rxq, RB_CTRL), RB_RST_SET);
|
||||
|
||||
/* Reset Rx MAC FIFO */
|
||||
sky2_write8(hw, SK_REG(sky2->port, RX_GMF_CTRL_T), GMF_RST_SET);
|
||||
|
||||
sky2_read8(hw, B0_CTST);
|
||||
mmiowb();
|
||||
}
|
||||
|
||||
/* Clean out receive buffer area, assumes receiver hardware stopped */
|
||||
@ -1825,12 +1818,6 @@ static int sky2_down(struct net_device *dev)
|
||||
if (netif_msg_ifdown(sky2))
|
||||
printk(KERN_INFO PFX "%s: disabling interface\n", dev->name);
|
||||
|
||||
/* Disable port IRQ */
|
||||
imask = sky2_read32(hw, B0_IMSK);
|
||||
imask &= ~portirq_msk[port];
|
||||
sky2_write32(hw, B0_IMSK, imask);
|
||||
sky2_read32(hw, B0_IMSK);
|
||||
|
||||
/* Force flow control off */
|
||||
sky2_write8(hw, SK_REG(port, GMAC_CTRL), GMC_PAUSE_OFF);
|
||||
|
||||
@ -1870,8 +1857,6 @@ static int sky2_down(struct net_device *dev)
|
||||
|
||||
sky2_write32(hw, RB_ADDR(txqaddr[port], RB_CTRL), RB_RST_SET);
|
||||
|
||||
sky2_rx_stop(sky2);
|
||||
|
||||
sky2_write8(hw, SK_REG(port, RX_GMF_CTRL_T), GMF_RST_SET);
|
||||
sky2_write8(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_RST_SET);
|
||||
|
||||
@ -1881,6 +1866,14 @@ static int sky2_down(struct net_device *dev)
|
||||
sky2_write32(hw, STAT_ISR_TIMER_CNT, 0);
|
||||
sky2_read8(hw, STAT_ISR_TIMER_CTRL);
|
||||
|
||||
sky2_rx_stop(sky2);
|
||||
|
||||
/* Disable port IRQ */
|
||||
imask = sky2_read32(hw, B0_IMSK);
|
||||
imask &= ~portirq_msk[port];
|
||||
sky2_write32(hw, B0_IMSK, imask);
|
||||
sky2_read32(hw, B0_IMSK);
|
||||
|
||||
synchronize_irq(hw->pdev->irq);
|
||||
napi_synchronize(&hw->napi);
|
||||
|
||||
|
@ -369,4 +369,12 @@ config USB_NET_INT51X1
|
||||
(Powerline Communications) solution with an Intellon
|
||||
INT51x1/INT5200 chip, like the "devolo dLan duo".
|
||||
|
||||
config USB_CDC_PHONET
|
||||
tristate "CDC Phonet support"
|
||||
depends on PHONET
|
||||
help
|
||||
Choose this option to support the Phonet interface to a Nokia
|
||||
cellular modem, as found on most Nokia handsets with the
|
||||
"PC suite" USB profile.
|
||||
|
||||
endmenu
|
||||
|
@ -21,4 +21,5 @@ obj-$(CONFIG_USB_NET_ZAURUS) += zaurus.o
|
||||
obj-$(CONFIG_USB_NET_MCS7830) += mcs7830.o
|
||||
obj-$(CONFIG_USB_USBNET) += usbnet.o
|
||||
obj-$(CONFIG_USB_NET_INT51X1) += int51x1.o
|
||||
obj-$(CONFIG_USB_CDC_PHONET) += cdc-phonet.o
|
||||
|
||||
|
461
drivers/net/usb/cdc-phonet.c
Normal file
461
drivers/net/usb/cdc-phonet.c
Normal file
@ -0,0 +1,461 @@
|
||||
/*
|
||||
* phonet.c -- USB CDC Phonet host driver
|
||||
*
|
||||
* Copyright (C) 2008-2009 Nokia Corporation. All rights reserved.
|
||||
*
|
||||
* Author: Rémi Denis-Courmont
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* version 2 as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/usb.h>
|
||||
#include <linux/usb/cdc.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/if_arp.h>
|
||||
#include <linux/if_phonet.h>
|
||||
|
||||
#define PN_MEDIA_USB 0x1B
|
||||
|
||||
static const unsigned rxq_size = 17;
|
||||
|
||||
struct usbpn_dev {
|
||||
struct net_device *dev;
|
||||
|
||||
struct usb_interface *intf, *data_intf;
|
||||
struct usb_device *usb;
|
||||
unsigned int tx_pipe, rx_pipe;
|
||||
u8 active_setting;
|
||||
u8 disconnected;
|
||||
|
||||
unsigned tx_queue;
|
||||
spinlock_t tx_lock;
|
||||
|
||||
spinlock_t rx_lock;
|
||||
struct sk_buff *rx_skb;
|
||||
struct urb *urbs[0];
|
||||
};
|
||||
|
||||
static void tx_complete(struct urb *req);
|
||||
static void rx_complete(struct urb *req);
|
||||
|
||||
/*
|
||||
* Network device callbacks
|
||||
*/
|
||||
static int usbpn_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
{
|
||||
struct usbpn_dev *pnd = netdev_priv(dev);
|
||||
struct urb *req = NULL;
|
||||
unsigned long flags;
|
||||
int err;
|
||||
|
||||
if (skb->protocol != htons(ETH_P_PHONET))
|
||||
goto drop;
|
||||
|
||||
req = usb_alloc_urb(0, GFP_ATOMIC);
|
||||
if (!req)
|
||||
goto drop;
|
||||
usb_fill_bulk_urb(req, pnd->usb, pnd->tx_pipe, skb->data, skb->len,
|
||||
tx_complete, skb);
|
||||
req->transfer_flags = URB_ZERO_PACKET;
|
||||
err = usb_submit_urb(req, GFP_ATOMIC);
|
||||
if (err) {
|
||||
usb_free_urb(req);
|
||||
goto drop;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&pnd->tx_lock, flags);
|
||||
pnd->tx_queue++;
|
||||
if (pnd->tx_queue >= dev->tx_queue_len)
|
||||
netif_stop_queue(dev);
|
||||
spin_unlock_irqrestore(&pnd->tx_lock, flags);
|
||||
return 0;
|
||||
|
||||
drop:
|
||||
dev_kfree_skb(skb);
|
||||
dev->stats.tx_dropped++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void tx_complete(struct urb *req)
|
||||
{
|
||||
struct sk_buff *skb = req->context;
|
||||
struct net_device *dev = skb->dev;
|
||||
struct usbpn_dev *pnd = netdev_priv(dev);
|
||||
|
||||
switch (req->status) {
|
||||
case 0:
|
||||
dev->stats.tx_bytes += skb->len;
|
||||
break;
|
||||
|
||||
case -ENOENT:
|
||||
case -ECONNRESET:
|
||||
case -ESHUTDOWN:
|
||||
dev->stats.tx_aborted_errors++;
|
||||
default:
|
||||
dev->stats.tx_errors++;
|
||||
dev_dbg(&dev->dev, "TX error (%d)\n", req->status);
|
||||
}
|
||||
dev->stats.tx_packets++;
|
||||
|
||||
spin_lock(&pnd->tx_lock);
|
||||
pnd->tx_queue--;
|
||||
netif_wake_queue(dev);
|
||||
spin_unlock(&pnd->tx_lock);
|
||||
|
||||
dev_kfree_skb_any(skb);
|
||||
usb_free_urb(req);
|
||||
}
|
||||
|
||||
static int rx_submit(struct usbpn_dev *pnd, struct urb *req, gfp_t gfp_flags)
|
||||
{
|
||||
struct net_device *dev = pnd->dev;
|
||||
struct page *page;
|
||||
int err;
|
||||
|
||||
page = __netdev_alloc_page(dev, gfp_flags);
|
||||
if (!page)
|
||||
return -ENOMEM;
|
||||
|
||||
usb_fill_bulk_urb(req, pnd->usb, pnd->rx_pipe, page_address(page),
|
||||
PAGE_SIZE, rx_complete, dev);
|
||||
req->transfer_flags = 0;
|
||||
err = usb_submit_urb(req, gfp_flags);
|
||||
if (unlikely(err)) {
|
||||
dev_dbg(&dev->dev, "RX submit error (%d)\n", err);
|
||||
netdev_free_page(dev, page);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
static void rx_complete(struct urb *req)
|
||||
{
|
||||
struct net_device *dev = req->context;
|
||||
struct usbpn_dev *pnd = netdev_priv(dev);
|
||||
struct page *page = virt_to_page(req->transfer_buffer);
|
||||
struct sk_buff *skb;
|
||||
unsigned long flags;
|
||||
|
||||
switch (req->status) {
|
||||
case 0:
|
||||
spin_lock_irqsave(&pnd->rx_lock, flags);
|
||||
skb = pnd->rx_skb;
|
||||
if (!skb) {
|
||||
skb = pnd->rx_skb = netdev_alloc_skb(dev, 12);
|
||||
if (likely(skb)) {
|
||||
/* Can't use pskb_pull() on page in IRQ */
|
||||
memcpy(skb_put(skb, 1), page_address(page), 1);
|
||||
skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,
|
||||
page, 1, req->actual_length);
|
||||
page = NULL;
|
||||
}
|
||||
} else {
|
||||
skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,
|
||||
page, 0, req->actual_length);
|
||||
page = NULL;
|
||||
}
|
||||
if (req->actual_length < PAGE_SIZE)
|
||||
pnd->rx_skb = NULL; /* Last fragment */
|
||||
else
|
||||
skb = NULL;
|
||||
spin_unlock_irqrestore(&pnd->rx_lock, flags);
|
||||
if (skb) {
|
||||
skb->protocol = htons(ETH_P_PHONET);
|
||||
skb_reset_mac_header(skb);
|
||||
__skb_pull(skb, 1);
|
||||
skb->dev = dev;
|
||||
dev->stats.rx_packets++;
|
||||
dev->stats.rx_bytes += skb->len;
|
||||
|
||||
netif_rx(skb);
|
||||
}
|
||||
goto resubmit;
|
||||
|
||||
case -ENOENT:
|
||||
case -ECONNRESET:
|
||||
case -ESHUTDOWN:
|
||||
req = NULL;
|
||||
break;
|
||||
|
||||
case -EOVERFLOW:
|
||||
dev->stats.rx_over_errors++;
|
||||
dev_dbg(&dev->dev, "RX overflow\n");
|
||||
break;
|
||||
|
||||
case -EILSEQ:
|
||||
dev->stats.rx_crc_errors++;
|
||||
break;
|
||||
}
|
||||
|
||||
dev->stats.rx_errors++;
|
||||
resubmit:
|
||||
if (page)
|
||||
netdev_free_page(dev, page);
|
||||
if (req)
|
||||
rx_submit(pnd, req, GFP_ATOMIC);
|
||||
}
|
||||
|
||||
static int usbpn_close(struct net_device *dev);
|
||||
|
||||
static int usbpn_open(struct net_device *dev)
|
||||
{
|
||||
struct usbpn_dev *pnd = netdev_priv(dev);
|
||||
int err;
|
||||
unsigned i;
|
||||
unsigned num = pnd->data_intf->cur_altsetting->desc.bInterfaceNumber;
|
||||
|
||||
err = usb_set_interface(pnd->usb, num, pnd->active_setting);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
for (i = 0; i < rxq_size; i++) {
|
||||
struct urb *req = usb_alloc_urb(0, GFP_KERNEL);
|
||||
|
||||
if (!req || rx_submit(pnd, req, GFP_KERNEL)) {
|
||||
usbpn_close(dev);
|
||||
return -ENOMEM;
|
||||
}
|
||||
pnd->urbs[i] = req;
|
||||
}
|
||||
|
||||
netif_wake_queue(dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int usbpn_close(struct net_device *dev)
|
||||
{
|
||||
struct usbpn_dev *pnd = netdev_priv(dev);
|
||||
unsigned i;
|
||||
unsigned num = pnd->data_intf->cur_altsetting->desc.bInterfaceNumber;
|
||||
|
||||
netif_stop_queue(dev);
|
||||
|
||||
for (i = 0; i < rxq_size; i++) {
|
||||
struct urb *req = pnd->urbs[i];
|
||||
|
||||
if (!req)
|
||||
continue;
|
||||
usb_kill_urb(req);
|
||||
usb_free_urb(req);
|
||||
pnd->urbs[i] = NULL;
|
||||
}
|
||||
|
||||
return usb_set_interface(pnd->usb, num, !pnd->active_setting);
|
||||
}
|
||||
|
||||
static int usbpn_set_mtu(struct net_device *dev, int new_mtu)
|
||||
{
|
||||
if ((new_mtu < PHONET_MIN_MTU) || (new_mtu > PHONET_MAX_MTU))
|
||||
return -EINVAL;
|
||||
|
||||
dev->mtu = new_mtu;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct net_device_ops usbpn_ops = {
|
||||
.ndo_open = usbpn_open,
|
||||
.ndo_stop = usbpn_close,
|
||||
.ndo_start_xmit = usbpn_xmit,
|
||||
.ndo_change_mtu = usbpn_set_mtu,
|
||||
};
|
||||
|
||||
static void usbpn_setup(struct net_device *dev)
|
||||
{
|
||||
dev->features = 0;
|
||||
dev->netdev_ops = &usbpn_ops,
|
||||
dev->header_ops = &phonet_header_ops;
|
||||
dev->type = ARPHRD_PHONET;
|
||||
dev->flags = IFF_POINTOPOINT | IFF_NOARP;
|
||||
dev->mtu = PHONET_MAX_MTU;
|
||||
dev->hard_header_len = 1;
|
||||
dev->dev_addr[0] = PN_MEDIA_USB;
|
||||
dev->addr_len = 1;
|
||||
dev->tx_queue_len = 3;
|
||||
|
||||
dev->destructor = free_netdev;
|
||||
}
|
||||
|
||||
/*
|
||||
* USB driver callbacks
|
||||
*/
|
||||
static struct usb_device_id usbpn_ids[] = {
|
||||
{
|
||||
.match_flags = USB_DEVICE_ID_MATCH_VENDOR
|
||||
| USB_DEVICE_ID_MATCH_INT_CLASS
|
||||
| USB_DEVICE_ID_MATCH_INT_SUBCLASS,
|
||||
.idVendor = 0x0421, /* Nokia */
|
||||
.bInterfaceClass = USB_CLASS_COMM,
|
||||
.bInterfaceSubClass = 0xFE,
|
||||
},
|
||||
{ },
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(usb, usbpn_ids);
|
||||
|
||||
static struct usb_driver usbpn_driver;
|
||||
|
||||
int usbpn_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
{
|
||||
static const char ifname[] = "usbpn%d";
|
||||
const struct usb_cdc_union_desc *union_header = NULL;
|
||||
const struct usb_cdc_header_desc *phonet_header = NULL;
|
||||
const struct usb_host_interface *data_desc;
|
||||
struct usb_interface *data_intf;
|
||||
struct usb_device *usbdev = interface_to_usbdev(intf);
|
||||
struct net_device *dev;
|
||||
struct usbpn_dev *pnd;
|
||||
u8 *data;
|
||||
int len, err;
|
||||
|
||||
data = intf->altsetting->extra;
|
||||
len = intf->altsetting->extralen;
|
||||
while (len >= 3) {
|
||||
u8 dlen = data[0];
|
||||
if (dlen < 3)
|
||||
return -EINVAL;
|
||||
|
||||
/* bDescriptorType */
|
||||
if (data[1] == USB_DT_CS_INTERFACE) {
|
||||
/* bDescriptorSubType */
|
||||
switch (data[2]) {
|
||||
case USB_CDC_UNION_TYPE:
|
||||
if (union_header || dlen < 5)
|
||||
break;
|
||||
union_header =
|
||||
(struct usb_cdc_union_desc *)data;
|
||||
break;
|
||||
case 0xAB:
|
||||
if (phonet_header || dlen < 5)
|
||||
break;
|
||||
phonet_header =
|
||||
(struct usb_cdc_header_desc *)data;
|
||||
break;
|
||||
}
|
||||
}
|
||||
data += dlen;
|
||||
len -= dlen;
|
||||
}
|
||||
|
||||
if (!union_header || !phonet_header)
|
||||
return -EINVAL;
|
||||
|
||||
data_intf = usb_ifnum_to_if(usbdev, union_header->bSlaveInterface0);
|
||||
if (data_intf == NULL)
|
||||
return -ENODEV;
|
||||
/* Data interface has one inactive and one active setting */
|
||||
if (data_intf->num_altsetting != 2)
|
||||
return -EINVAL;
|
||||
if (data_intf->altsetting[0].desc.bNumEndpoints == 0
|
||||
&& data_intf->altsetting[1].desc.bNumEndpoints == 2)
|
||||
data_desc = data_intf->altsetting + 1;
|
||||
else
|
||||
if (data_intf->altsetting[0].desc.bNumEndpoints == 2
|
||||
&& data_intf->altsetting[1].desc.bNumEndpoints == 0)
|
||||
data_desc = data_intf->altsetting;
|
||||
else
|
||||
return -EINVAL;
|
||||
|
||||
dev = alloc_netdev(sizeof(*pnd) + sizeof(pnd->urbs[0]) * rxq_size,
|
||||
ifname, usbpn_setup);
|
||||
if (!dev)
|
||||
return -ENOMEM;
|
||||
|
||||
pnd = netdev_priv(dev);
|
||||
SET_NETDEV_DEV(dev, &intf->dev);
|
||||
netif_stop_queue(dev);
|
||||
|
||||
pnd->dev = dev;
|
||||
pnd->usb = usb_get_dev(usbdev);
|
||||
pnd->intf = intf;
|
||||
pnd->data_intf = data_intf;
|
||||
spin_lock_init(&pnd->tx_lock);
|
||||
spin_lock_init(&pnd->rx_lock);
|
||||
/* Endpoints */
|
||||
if (usb_pipein(data_desc->endpoint[0].desc.bEndpointAddress)) {
|
||||
pnd->rx_pipe = usb_rcvbulkpipe(usbdev,
|
||||
data_desc->endpoint[0].desc.bEndpointAddress);
|
||||
pnd->tx_pipe = usb_sndbulkpipe(usbdev,
|
||||
data_desc->endpoint[1].desc.bEndpointAddress);
|
||||
} else {
|
||||
pnd->rx_pipe = usb_rcvbulkpipe(usbdev,
|
||||
data_desc->endpoint[1].desc.bEndpointAddress);
|
||||
pnd->tx_pipe = usb_sndbulkpipe(usbdev,
|
||||
data_desc->endpoint[0].desc.bEndpointAddress);
|
||||
}
|
||||
pnd->active_setting = data_desc - data_intf->altsetting;
|
||||
|
||||
err = usb_driver_claim_interface(&usbpn_driver, data_intf, pnd);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
/* Force inactive mode until the network device is brought UP */
|
||||
usb_set_interface(usbdev, union_header->bSlaveInterface0,
|
||||
!pnd->active_setting);
|
||||
usb_set_intfdata(intf, pnd);
|
||||
|
||||
err = register_netdev(dev);
|
||||
if (err) {
|
||||
usb_driver_release_interface(&usbpn_driver, data_intf);
|
||||
goto out;
|
||||
}
|
||||
|
||||
dev_dbg(&dev->dev, "USB CDC Phonet device found\n");
|
||||
return 0;
|
||||
|
||||
out:
|
||||
usb_set_intfdata(intf, NULL);
|
||||
free_netdev(dev);
|
||||
return err;
|
||||
}
|
||||
|
||||
static void usbpn_disconnect(struct usb_interface *intf)
|
||||
{
|
||||
struct usbpn_dev *pnd = usb_get_intfdata(intf);
|
||||
struct usb_device *usb = pnd->usb;
|
||||
|
||||
if (pnd->disconnected)
|
||||
return;
|
||||
|
||||
pnd->disconnected = 1;
|
||||
usb_driver_release_interface(&usbpn_driver,
|
||||
(pnd->intf == intf) ? pnd->data_intf : pnd->intf);
|
||||
unregister_netdev(pnd->dev);
|
||||
usb_put_dev(usb);
|
||||
}
|
||||
|
||||
static struct usb_driver usbpn_driver = {
|
||||
.name = "cdc_phonet",
|
||||
.probe = usbpn_probe,
|
||||
.disconnect = usbpn_disconnect,
|
||||
.id_table = usbpn_ids,
|
||||
};
|
||||
|
||||
static int __init usbpn_init(void)
|
||||
{
|
||||
return usb_register(&usbpn_driver);
|
||||
}
|
||||
|
||||
static void __exit usbpn_exit(void)
|
||||
{
|
||||
usb_deregister(&usbpn_driver);
|
||||
}
|
||||
|
||||
module_init(usbpn_init);
|
||||
module_exit(usbpn_exit);
|
||||
|
||||
MODULE_AUTHOR("Remi Denis-Courmont");
|
||||
MODULE_DESCRIPTION("USB CDC Phonet host interface");
|
||||
MODULE_LICENSE("GPL");
|
@ -311,7 +311,7 @@ static int eem_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
|
||||
* bmCRC = 0 : CRC = 0xDEADBEEF
|
||||
*/
|
||||
if (header & BIT(14))
|
||||
crc2 = ~crc32_le(~0, skb2->data, len);
|
||||
crc2 = ~crc32_le(~0, skb2->data, skb2->len);
|
||||
else
|
||||
crc2 = 0xdeadbeef;
|
||||
|
||||
|
@ -104,15 +104,15 @@ struct net;
|
||||
|
||||
/**
|
||||
* struct sock_common - minimal network layer representation of sockets
|
||||
* @skc_node: main hash linkage for various protocol lookup tables
|
||||
* @skc_nulls_node: main hash linkage for UDP/UDP-Lite protocol
|
||||
* @skc_refcnt: reference count
|
||||
* @skc_hash: hash value used with various protocol lookup tables
|
||||
* @skc_family: network address family
|
||||
* @skc_state: Connection state
|
||||
* @skc_reuse: %SO_REUSEADDR setting
|
||||
* @skc_bound_dev_if: bound device index if != 0
|
||||
* @skc_node: main hash linkage for various protocol lookup tables
|
||||
* @skc_nulls_node: main hash linkage for UDP/UDP-Lite protocol
|
||||
* @skc_bind_node: bind hash linkage for various protocol lookup tables
|
||||
* @skc_refcnt: reference count
|
||||
* @skc_hash: hash value used with various protocol lookup tables
|
||||
* @skc_prot: protocol handlers inside a network family
|
||||
* @skc_net: reference to the network namespace of this socket
|
||||
*
|
||||
@ -120,17 +120,21 @@ struct net;
|
||||
* for struct sock and struct inet_timewait_sock.
|
||||
*/
|
||||
struct sock_common {
|
||||
unsigned short skc_family;
|
||||
volatile unsigned char skc_state;
|
||||
unsigned char skc_reuse;
|
||||
int skc_bound_dev_if;
|
||||
/*
|
||||
* first fields are not copied in sock_copy()
|
||||
*/
|
||||
union {
|
||||
struct hlist_node skc_node;
|
||||
struct hlist_nulls_node skc_nulls_node;
|
||||
};
|
||||
struct hlist_node skc_bind_node;
|
||||
atomic_t skc_refcnt;
|
||||
|
||||
unsigned int skc_hash;
|
||||
unsigned short skc_family;
|
||||
volatile unsigned char skc_state;
|
||||
unsigned char skc_reuse;
|
||||
int skc_bound_dev_if;
|
||||
struct hlist_node skc_bind_node;
|
||||
struct proto *skc_prot;
|
||||
#ifdef CONFIG_NET_NS
|
||||
struct net *skc_net;
|
||||
@ -208,15 +212,17 @@ struct sock {
|
||||
* don't add nothing before this first member (__sk_common) --acme
|
||||
*/
|
||||
struct sock_common __sk_common;
|
||||
#define sk_node __sk_common.skc_node
|
||||
#define sk_nulls_node __sk_common.skc_nulls_node
|
||||
#define sk_refcnt __sk_common.skc_refcnt
|
||||
|
||||
#define sk_copy_start __sk_common.skc_hash
|
||||
#define sk_hash __sk_common.skc_hash
|
||||
#define sk_family __sk_common.skc_family
|
||||
#define sk_state __sk_common.skc_state
|
||||
#define sk_reuse __sk_common.skc_reuse
|
||||
#define sk_bound_dev_if __sk_common.skc_bound_dev_if
|
||||
#define sk_node __sk_common.skc_node
|
||||
#define sk_nulls_node __sk_common.skc_nulls_node
|
||||
#define sk_bind_node __sk_common.skc_bind_node
|
||||
#define sk_refcnt __sk_common.skc_refcnt
|
||||
#define sk_hash __sk_common.skc_hash
|
||||
#define sk_prot __sk_common.skc_prot
|
||||
#define sk_net __sk_common.skc_net
|
||||
kmemcheck_bitfield_begin(flags);
|
||||
|
@ -1425,6 +1425,11 @@ struct tcp_request_sock_ops {
|
||||
#ifdef CONFIG_TCP_MD5SIG
|
||||
struct tcp_md5sig_key *(*md5_lookup) (struct sock *sk,
|
||||
struct request_sock *req);
|
||||
int (*calc_md5_hash) (char *location,
|
||||
struct tcp_md5sig_key *md5,
|
||||
struct sock *sk,
|
||||
struct request_sock *req,
|
||||
struct sk_buff *skb);
|
||||
#endif
|
||||
};
|
||||
|
||||
|
@ -75,6 +75,7 @@ static __initdata const char banner[] = KERN_INFO
|
||||
MODULE_DESCRIPTION("PF_CAN broadcast manager protocol");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_AUTHOR("Oliver Hartkopp <oliver.hartkopp@volkswagen.de>");
|
||||
MODULE_ALIAS("can-proto-2");
|
||||
|
||||
/* easy access to can_frame payload */
|
||||
static inline u64 GET_U64(const struct can_frame *cp)
|
||||
@ -1469,6 +1470,9 @@ static int bcm_release(struct socket *sock)
|
||||
bo->ifindex = 0;
|
||||
}
|
||||
|
||||
sock_orphan(sk);
|
||||
sock->sk = NULL;
|
||||
|
||||
release_sock(sk);
|
||||
sock_put(sk);
|
||||
|
||||
|
@ -62,6 +62,7 @@ static __initdata const char banner[] =
|
||||
MODULE_DESCRIPTION("PF_CAN raw protocol");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_AUTHOR("Urs Thuermann <urs.thuermann@volkswagen.de>");
|
||||
MODULE_ALIAS("can-proto-1");
|
||||
|
||||
#define MASK_ALL 0
|
||||
|
||||
@ -306,6 +307,9 @@ static int raw_release(struct socket *sock)
|
||||
ro->bound = 0;
|
||||
ro->count = 0;
|
||||
|
||||
sock_orphan(sk);
|
||||
sock->sk = NULL;
|
||||
|
||||
release_sock(sk);
|
||||
sock_put(sk);
|
||||
|
||||
|
@ -631,7 +631,7 @@ set_rcvbuf:
|
||||
|
||||
case SO_TIMESTAMPING:
|
||||
if (val & ~SOF_TIMESTAMPING_MASK) {
|
||||
ret = EINVAL;
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
sock_valbool_flag(sk, SOCK_TIMESTAMPING_TX_HARDWARE,
|
||||
@ -919,13 +919,19 @@ static inline void sock_lock_init(struct sock *sk)
|
||||
af_family_keys + sk->sk_family);
|
||||
}
|
||||
|
||||
/*
|
||||
* Copy all fields from osk to nsk but nsk->sk_refcnt must not change yet,
|
||||
* even temporarly, because of RCU lookups. sk_node should also be left as is.
|
||||
*/
|
||||
static void sock_copy(struct sock *nsk, const struct sock *osk)
|
||||
{
|
||||
#ifdef CONFIG_SECURITY_NETWORK
|
||||
void *sptr = nsk->sk_security;
|
||||
#endif
|
||||
|
||||
memcpy(nsk, osk, osk->sk_prot->obj_size);
|
||||
BUILD_BUG_ON(offsetof(struct sock, sk_copy_start) !=
|
||||
sizeof(osk->sk_node) + sizeof(osk->sk_refcnt));
|
||||
memcpy(&nsk->sk_copy_start, &osk->sk_copy_start,
|
||||
osk->sk_prot->obj_size - offsetof(struct sock, sk_copy_start));
|
||||
#ifdef CONFIG_SECURITY_NETWORK
|
||||
nsk->sk_security = sptr;
|
||||
security_sk_clone(osk, nsk);
|
||||
@ -1140,6 +1146,11 @@ struct sock *sk_clone(const struct sock *sk, const gfp_t priority)
|
||||
|
||||
newsk->sk_err = 0;
|
||||
newsk->sk_priority = 0;
|
||||
/*
|
||||
* Before updating sk_refcnt, we must commit prior changes to memory
|
||||
* (Documentation/RCU/rculist_nulls.txt for details)
|
||||
*/
|
||||
smp_wmb();
|
||||
atomic_set(&newsk->sk_refcnt, 2);
|
||||
|
||||
/*
|
||||
@ -1855,6 +1866,11 @@ void sock_init_data(struct socket *sock, struct sock *sk)
|
||||
|
||||
sk->sk_stamp = ktime_set(-1L, 0);
|
||||
|
||||
/*
|
||||
* Before updating sk_refcnt, we must commit prior changes to memory
|
||||
* (Documentation/RCU/rculist_nulls.txt for details)
|
||||
*/
|
||||
smp_wmb();
|
||||
atomic_set(&sk->sk_refcnt, 1);
|
||||
atomic_set(&sk->sk_wmem_alloc, 1);
|
||||
atomic_set(&sk->sk_drops, 0);
|
||||
|
@ -1160,6 +1160,7 @@ struct request_sock_ops tcp_request_sock_ops __read_mostly = {
|
||||
#ifdef CONFIG_TCP_MD5SIG
|
||||
static struct tcp_request_sock_ops tcp_request_sock_ipv4_ops = {
|
||||
.md5_lookup = tcp_v4_reqsk_md5_lookup,
|
||||
.calc_md5_hash = tcp_v4_md5_hash_skb,
|
||||
};
|
||||
#endif
|
||||
|
||||
@ -1373,7 +1374,7 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
|
||||
*/
|
||||
char *newkey = kmemdup(key->key, key->keylen, GFP_ATOMIC);
|
||||
if (newkey != NULL)
|
||||
tcp_v4_md5_do_add(newsk, inet_sk(sk)->daddr,
|
||||
tcp_v4_md5_do_add(newsk, newinet->daddr,
|
||||
newkey, key->keylen);
|
||||
newsk->sk_route_caps &= ~NETIF_F_GSO_MASK;
|
||||
}
|
||||
|
@ -2261,7 +2261,7 @@ struct sk_buff *tcp_make_synack(struct sock *sk, struct dst_entry *dst,
|
||||
#ifdef CONFIG_TCP_MD5SIG
|
||||
/* Okay, we have all we need - do the md5 hash if needed */
|
||||
if (md5) {
|
||||
tp->af_specific->calc_md5_hash(md5_hash_location,
|
||||
tcp_rsk(req)->af_specific->calc_md5_hash(md5_hash_location,
|
||||
md5, NULL, req, skb);
|
||||
}
|
||||
#endif
|
||||
|
@ -896,6 +896,7 @@ struct request_sock_ops tcp6_request_sock_ops __read_mostly = {
|
||||
#ifdef CONFIG_TCP_MD5SIG
|
||||
static struct tcp_request_sock_ops tcp_request_sock_ipv6_ops = {
|
||||
.md5_lookup = tcp_v6_reqsk_md5_lookup,
|
||||
.calc_md5_hash = tcp_v6_md5_hash_skb,
|
||||
};
|
||||
#endif
|
||||
|
||||
@ -1441,7 +1442,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
|
||||
*/
|
||||
char *newkey = kmemdup(key->key, key->keylen, GFP_ATOMIC);
|
||||
if (newkey != NULL)
|
||||
tcp_v6_md5_do_add(newsk, &inet6_sk(sk)->daddr,
|
||||
tcp_v6_md5_do_add(newsk, &newnp->daddr,
|
||||
newkey, key->keylen);
|
||||
}
|
||||
#endif
|
||||
|
@ -561,23 +561,38 @@ struct nf_conn *nf_conntrack_alloc(struct net *net,
|
||||
}
|
||||
}
|
||||
|
||||
ct = kmem_cache_zalloc(nf_conntrack_cachep, gfp);
|
||||
/*
|
||||
* Do not use kmem_cache_zalloc(), as this cache uses
|
||||
* SLAB_DESTROY_BY_RCU.
|
||||
*/
|
||||
ct = kmem_cache_alloc(nf_conntrack_cachep, gfp);
|
||||
if (ct == NULL) {
|
||||
pr_debug("nf_conntrack_alloc: Can't alloc conntrack.\n");
|
||||
atomic_dec(&net->ct.count);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
/*
|
||||
* Let ct->tuplehash[IP_CT_DIR_ORIGINAL].hnnode.next
|
||||
* and ct->tuplehash[IP_CT_DIR_REPLY].hnnode.next unchanged.
|
||||
*/
|
||||
memset(&ct->tuplehash[IP_CT_DIR_MAX], 0,
|
||||
sizeof(*ct) - offsetof(struct nf_conn, tuplehash[IP_CT_DIR_MAX]));
|
||||
spin_lock_init(&ct->lock);
|
||||
atomic_set(&ct->ct_general.use, 1);
|
||||
ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple = *orig;
|
||||
ct->tuplehash[IP_CT_DIR_ORIGINAL].hnnode.pprev = NULL;
|
||||
ct->tuplehash[IP_CT_DIR_REPLY].tuple = *repl;
|
||||
ct->tuplehash[IP_CT_DIR_REPLY].hnnode.pprev = NULL;
|
||||
/* Don't set timer yet: wait for confirmation */
|
||||
setup_timer(&ct->timeout, death_by_timeout, (unsigned long)ct);
|
||||
#ifdef CONFIG_NET_NS
|
||||
ct->ct_net = net;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* changes to lookup keys must be done before setting refcnt to 1
|
||||
*/
|
||||
smp_wmb();
|
||||
atomic_set(&ct->ct_general.use, 1);
|
||||
return ct;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nf_conntrack_alloc);
|
||||
|
@ -330,7 +330,8 @@ static bool xt_osf_match_packet(const struct sk_buff *skb,
|
||||
fcount++;
|
||||
|
||||
if (info->flags & XT_OSF_LOG)
|
||||
nf_log_packet(p->hooknum, 0, skb, p->in, p->out, NULL,
|
||||
nf_log_packet(p->family, p->hooknum, skb,
|
||||
p->in, p->out, NULL,
|
||||
"%s [%s:%s] : %pi4:%d -> %pi4:%d hops=%d\n",
|
||||
f->genre, f->version, f->subtype,
|
||||
&ip->saddr, ntohs(tcp->source),
|
||||
@ -345,7 +346,7 @@ static bool xt_osf_match_packet(const struct sk_buff *skb,
|
||||
rcu_read_unlock();
|
||||
|
||||
if (!fcount && (info->flags & XT_OSF_LOG))
|
||||
nf_log_packet(p->hooknum, 0, skb, p->in, p->out, NULL,
|
||||
nf_log_packet(p->family, p->hooknum, skb, p->in, p->out, NULL,
|
||||
"Remote OS is not known: %pi4:%u -> %pi4:%u\n",
|
||||
&ip->saddr, ntohs(tcp->source),
|
||||
&ip->daddr, ntohs(tcp->dest));
|
||||
|
Loading…
Reference in New Issue
Block a user