From 36d1783e2f38adaea75eb3b1e2014677e58ca389 Mon Sep 17 00:00:00 2001 From: Bruce Allan Date: Sat, 5 Jan 2013 08:06:03 +0000 Subject: [PATCH] --- yaml --- r: 351700 b: refs/heads/master c: 7de89f058ec2c58ef16582e4efadeb33d711c9e1 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/net/can/Kconfig | 37 +- trunk/drivers/net/can/Makefile | 2 - trunk/drivers/net/can/at91_can.c | 10 - trunk/drivers/net/can/c_can/Kconfig | 2 +- trunk/drivers/net/can/c_can/c_can.c | 10 - trunk/drivers/net/can/cc770/Kconfig | 2 +- trunk/drivers/net/can/dev.c | 26 +- trunk/drivers/net/can/flexcan.c | 11 - trunk/drivers/net/can/led.c | 124 -- trunk/drivers/net/can/mcp251x.c | 23 +- trunk/drivers/net/can/mscan/Kconfig | 2 +- trunk/drivers/net/can/sja1000/Kconfig | 14 +- trunk/drivers/net/can/sja1000/sja1000.c | 17 +- trunk/drivers/net/can/slcan.c | 8 +- trunk/drivers/net/can/softing/Kconfig | 2 +- trunk/drivers/net/can/ti_hecc.c | 10 - trunk/drivers/net/can/usb/Kconfig | 8 +- trunk/drivers/net/can/usb/Makefile | 1 - trunk/drivers/net/can/usb/usb_8dev.c | 1033 ----------------- trunk/drivers/net/ethernet/intel/e1000e/phy.c | 33 +- .../net/ethernet/mellanox/mlx4/en_netdev.c | 55 +- .../net/ethernet/mellanox/mlx4/en_tx.c | 16 +- .../drivers/net/ethernet/mellanox/mlx4/main.c | 7 +- trunk/drivers/net/macvtap.c | 3 +- trunk/drivers/net/tun.c | 12 +- trunk/drivers/net/virtio_net.c | 12 +- trunk/include/linux/can/dev.h | 11 - trunk/include/linux/can/led.h | 51 - trunk/include/linux/can/skb.h | 45 - trunk/include/linux/skbuff.h | 19 - trunk/include/net/dn_route.h | 2 +- trunk/include/net/sock.h | 2 +- trunk/include/uapi/linux/can/gw.h | 2 - trunk/net/can/Kconfig | 13 +- trunk/net/can/bcm.c | 12 +- trunk/net/can/gw.c | 72 +- trunk/net/can/raw.c | 8 +- trunk/net/core/dev.c | 9 - trunk/net/core/skbuff.c | 4 - trunk/net/decnet/af_decnet.c | 6 +- trunk/net/decnet/dn_nsp_out.c | 2 +- trunk/net/decnet/dn_route.c | 2 +- trunk/net/ipv4/af_inet.c | 1 - trunk/net/ipv4/ip_gre.c | 4 +- trunk/net/ipv4/ipip.c | 4 +- trunk/net/ipv4/tcp.c | 3 - trunk/net/ipv4/tcp_input.c | 4 +- trunk/net/ipv4/tcp_output.c | 4 +- trunk/net/ipv6/ip6_offload.c | 1 - 50 files changed, 109 insertions(+), 1654 deletions(-) delete mode 100644 trunk/drivers/net/can/led.c delete mode 100644 trunk/drivers/net/can/usb/usb_8dev.c delete mode 100644 trunk/include/linux/can/led.h delete mode 100644 trunk/include/linux/can/skb.h diff --git a/[refs] b/[refs] index 8763d8df8f66..0821373ee464 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 2bf3440d7b8755f2627232e6a4c37efbbe053685 +refs/heads/master: 7de89f058ec2c58ef16582e4efadeb33d711c9e1 diff --git a/trunk/drivers/net/can/Kconfig b/trunk/drivers/net/can/Kconfig index 1cca19f1c490..b56bd9e80957 100644 --- a/trunk/drivers/net/can/Kconfig +++ b/trunk/drivers/net/can/Kconfig @@ -1,7 +1,9 @@ menu "CAN Device Drivers" + depends on CAN config CAN_VCAN tristate "Virtual Local CAN Interface (vcan)" + depends on CAN ---help--- Similar to the network loopback devices, vcan offers a virtual local CAN interface. @@ -11,6 +13,7 @@ config CAN_VCAN config CAN_SLCAN tristate "Serial / USB serial CAN Adaptors (slcan)" + depends on CAN ---help--- CAN driver for several 'low cost' CAN interfaces that are attached via serial lines or via USB-to-serial adapters using the LAWICEL @@ -30,16 +33,16 @@ config CAN_SLCAN config CAN_DEV tristate "Platform CAN drivers with Netlink support" + depends on CAN default y ---help--- Enables the common framework for platform CAN drivers with Netlink support. This is the standard library for CAN drivers. If unsure, say Y. -if CAN_DEV - config CAN_CALC_BITTIMING bool "CAN bit-timing calculation" + depends on CAN_DEV default y ---help--- If enabled, CAN bit-timing parameters will be calculated for the @@ -51,26 +54,15 @@ config CAN_CALC_BITTIMING arguments "tq", "prop_seg", "phase_seg1", "phase_seg2" and "sjw". If unsure, say Y. -config CAN_LEDS - bool "Enable LED triggers for Netlink based drivers" - depends on LEDS_CLASS - select LEDS_TRIGGERS - ---help--- - This option adds two LED triggers for packet receive and transmit - events on each supported CAN device. - - Say Y here if you are working on a system with led-class supported - LEDs and you want to use them as canbus activity indicators. - config CAN_AT91 tristate "Atmel AT91 onchip CAN controller" - depends on ARCH_AT91SAM9263 || ARCH_AT91SAM9X5 + depends on CAN_DEV && (ARCH_AT91SAM9263 || ARCH_AT91SAM9X5) ---help--- This is a driver for the SoC CAN controller in Atmel's AT91SAM9263 and AT91SAM9X5 processors. config CAN_TI_HECC - depends on ARCH_OMAP3 + depends on CAN_DEV && ARCH_OMAP3 tristate "TI High End CAN Controller" ---help--- Driver for TI HECC (High End CAN Controller) module found on many @@ -78,12 +70,12 @@ config CAN_TI_HECC config CAN_MCP251X tristate "Microchip MCP251x SPI CAN controllers" - depends on SPI && HAS_DMA + depends on CAN_DEV && SPI && HAS_DMA ---help--- Driver for the Microchip MCP251x SPI CAN controllers. config CAN_BFIN - depends on BF534 || BF536 || BF537 || BF538 || BF539 || BF54x + depends on CAN_DEV && (BF534 || BF536 || BF537 || BF538 || BF539 || BF54x) tristate "Analog Devices Blackfin on-chip CAN" ---help--- Driver for the Analog Devices Blackfin on-chip CAN controllers @@ -93,7 +85,7 @@ config CAN_BFIN config CAN_JANZ_ICAN3 tristate "Janz VMOD-ICAN3 Intelligent CAN controller" - depends on MFD_JANZ_CMODIO + depends on CAN_DEV && MFD_JANZ_CMODIO ---help--- Driver for Janz VMOD-ICAN3 Intelligent CAN controller module, which connects to a MODULbus carrier board. @@ -106,13 +98,13 @@ config HAVE_CAN_FLEXCAN config CAN_FLEXCAN tristate "Support for Freescale FLEXCAN based chips" - depends on HAVE_CAN_FLEXCAN + depends on CAN_DEV && HAVE_CAN_FLEXCAN ---help--- Say Y here if you want to support for Freescale FlexCAN. config PCH_CAN tristate "Intel EG20T PCH CAN controller" - depends on PCI + depends on CAN_DEV && PCI ---help--- This driver is for PCH CAN of Topcliff (Intel EG20T PCH) which is an IOH for x86 embedded processor (Intel Atom E6xx series). @@ -120,7 +112,7 @@ config PCH_CAN config CAN_GRCAN tristate "Aeroflex Gaisler GRCAN and GRHCAN CAN devices" - depends on OF + depends on CAN_DEV && OF ---help--- Say Y here if you want to use Aeroflex Gaisler GRCAN or GRHCAN. Note that the driver supports little endian, even though little @@ -139,10 +131,9 @@ source "drivers/net/can/usb/Kconfig" source "drivers/net/can/softing/Kconfig" -endif - config CAN_DEBUG_DEVICES bool "CAN devices debugging messages" + depends on CAN ---help--- Say Y here if you want the CAN device drivers to produce a bunch of debug messages to the system log. Select this if you are having diff --git a/trunk/drivers/net/can/Makefile b/trunk/drivers/net/can/Makefile index c7440392adbb..7de59862bbe9 100644 --- a/trunk/drivers/net/can/Makefile +++ b/trunk/drivers/net/can/Makefile @@ -8,8 +8,6 @@ obj-$(CONFIG_CAN_SLCAN) += slcan.o obj-$(CONFIG_CAN_DEV) += can-dev.o can-dev-y := dev.o -can-dev-$(CONFIG_CAN_LEDS) += led.o - obj-y += usb/ obj-y += softing/ diff --git a/trunk/drivers/net/can/at91_can.c b/trunk/drivers/net/can/at91_can.c index 44f363792b59..81baefda037b 100644 --- a/trunk/drivers/net/can/at91_can.c +++ b/trunk/drivers/net/can/at91_can.c @@ -37,7 +37,6 @@ #include #include -#include #define AT91_MB_MASK(i) ((1 << (i)) - 1) @@ -642,8 +641,6 @@ static void at91_read_msg(struct net_device *dev, unsigned int mb) stats->rx_packets++; stats->rx_bytes += cf->can_dlc; - - can_led_event(dev, CAN_LED_EVENT_RX); } /** @@ -878,7 +875,6 @@ static void at91_irq_tx(struct net_device *dev, u32 reg_sr) /* _NOTE_: subtract AT91_MB_TX_FIRST offset from mb! */ can_get_echo_skb(dev, mb - get_mb_tx_first(priv)); dev->stats.tx_packets++; - can_led_event(dev, CAN_LED_EVENT_TX); } } @@ -1132,8 +1128,6 @@ static int at91_open(struct net_device *dev) goto out_close; } - can_led_event(dev, CAN_LED_EVENT_OPEN); - /* start chip and queuing */ at91_chip_start(dev); napi_enable(&priv->napi); @@ -1165,8 +1159,6 @@ static int at91_close(struct net_device *dev) close_candev(dev); - can_led_event(dev, CAN_LED_EVENT_STOP); - return 0; } @@ -1329,8 +1321,6 @@ static int at91_can_probe(struct platform_device *pdev) goto exit_free; } - devm_can_led_init(dev); - dev_info(&pdev->dev, "device registered (reg_base=%p, irq=%d)\n", priv->reg_base, dev->irq); diff --git a/trunk/drivers/net/can/c_can/Kconfig b/trunk/drivers/net/can/c_can/Kconfig index 61ffc12d8fd8..3b83bafcd947 100644 --- a/trunk/drivers/net/can/c_can/Kconfig +++ b/trunk/drivers/net/can/c_can/Kconfig @@ -1,6 +1,6 @@ menuconfig CAN_C_CAN tristate "Bosch C_CAN/D_CAN devices" - depends on HAS_IOMEM + depends on CAN_DEV && HAS_IOMEM if CAN_C_CAN diff --git a/trunk/drivers/net/can/c_can/c_can.c b/trunk/drivers/net/can/c_can/c_can.c index 57eb1e77865d..5233b8f58d77 100644 --- a/trunk/drivers/net/can/c_can/c_can.c +++ b/trunk/drivers/net/can/c_can/c_can.c @@ -39,7 +39,6 @@ #include #include #include -#include #include "c_can.h" @@ -478,8 +477,6 @@ static int c_can_read_msg_object(struct net_device *dev, int iface, int ctrl) stats->rx_packets++; stats->rx_bytes += frame->can_dlc; - can_led_event(dev, CAN_LED_EVENT_RX); - return 0; } @@ -754,7 +751,6 @@ static void c_can_do_tx(struct net_device *dev) C_CAN_IFACE(MSGCTRL_REG, 0)) & IF_MCONT_DLC_MASK; stats->tx_packets++; - can_led_event(dev, CAN_LED_EVENT_TX); c_can_inval_msg_object(dev, 0, msg_obj_no); } else { break; @@ -1119,8 +1115,6 @@ static int c_can_open(struct net_device *dev) napi_enable(&priv->napi); - can_led_event(dev, CAN_LED_EVENT_OPEN); - /* start the c_can controller */ c_can_start(dev); @@ -1149,8 +1143,6 @@ static int c_can_close(struct net_device *dev) c_can_reset_ram(priv, false); c_can_pm_runtime_put_sync(priv); - can_led_event(dev, CAN_LED_EVENT_STOP); - return 0; } @@ -1276,8 +1268,6 @@ int register_c_can_dev(struct net_device *dev) err = register_candev(dev); if (err) c_can_pm_runtime_disable(priv); - else - devm_can_led_init(dev); return err; } diff --git a/trunk/drivers/net/can/cc770/Kconfig b/trunk/drivers/net/can/cc770/Kconfig index 6a9a5ba79220..22c07a8c8b43 100644 --- a/trunk/drivers/net/can/cc770/Kconfig +++ b/trunk/drivers/net/can/cc770/Kconfig @@ -1,6 +1,6 @@ menuconfig CAN_CC770 tristate "Bosch CC770 and Intel AN82527 devices" - depends on HAS_IOMEM + depends on CAN_DEV && HAS_IOMEM if CAN_CC770 diff --git a/trunk/drivers/net/can/dev.c b/trunk/drivers/net/can/dev.c index f9cba4123c66..8233e5ed2939 100644 --- a/trunk/drivers/net/can/dev.c +++ b/trunk/drivers/net/can/dev.c @@ -24,9 +24,7 @@ #include #include #include -#include #include -#include #include #define MOD_DESC "CAN device driver interface" @@ -503,18 +501,13 @@ struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf) { struct sk_buff *skb; - skb = netdev_alloc_skb(dev, sizeof(struct can_skb_priv) + - sizeof(struct can_frame)); + skb = netdev_alloc_skb(dev, sizeof(struct can_frame)); if (unlikely(!skb)) return NULL; skb->protocol = htons(ETH_P_CAN); skb->pkt_type = PACKET_BROADCAST; skb->ip_summed = CHECKSUM_UNNECESSARY; - - can_skb_reserve(skb); - can_skb_prv(skb)->ifindex = dev->ifindex; - *cf = (struct can_frame *)skb_put(skb, sizeof(struct can_frame)); memset(*cf, 0, sizeof(struct can_frame)); @@ -801,25 +794,10 @@ void unregister_candev(struct net_device *dev) } EXPORT_SYMBOL_GPL(unregister_candev); -/* - * Test if a network device is a candev based device - * and return the can_priv* if so. - */ -struct can_priv *safe_candev_priv(struct net_device *dev) -{ - if ((dev->type != ARPHRD_CAN) || (dev->rtnl_link_ops != &can_link_ops)) - return NULL; - - return netdev_priv(dev); -} -EXPORT_SYMBOL_GPL(safe_candev_priv); - static __init int can_dev_init(void) { int err; - can_led_notifier_init(); - err = rtnl_link_register(&can_link_ops); if (!err) printk(KERN_INFO MOD_DESC "\n"); @@ -831,8 +809,6 @@ module_init(can_dev_init); static __exit void can_dev_exit(void) { rtnl_link_unregister(&can_link_ops); - - can_led_notifier_exit(); } module_exit(can_dev_exit); diff --git a/trunk/drivers/net/can/flexcan.c b/trunk/drivers/net/can/flexcan.c index 769d29ed106d..0289a6d86f66 100644 --- a/trunk/drivers/net/can/flexcan.c +++ b/trunk/drivers/net/can/flexcan.c @@ -23,7 +23,6 @@ #include #include #include -#include #include #include #include @@ -565,8 +564,6 @@ static int flexcan_read_frame(struct net_device *dev) stats->rx_packets++; stats->rx_bytes += cf->can_dlc; - can_led_event(dev, CAN_LED_EVENT_RX); - return 1; } @@ -655,7 +652,6 @@ static irqreturn_t flexcan_irq(int irq, void *dev_id) if (reg_iflag1 & (1 << FLEXCAN_TX_BUF_ID)) { stats->tx_bytes += can_get_echo_skb(dev, 0); stats->tx_packets++; - can_led_event(dev, CAN_LED_EVENT_TX); flexcan_write((1 << FLEXCAN_TX_BUF_ID), ®s->iflag1); netif_wake_queue(dev); } @@ -869,9 +865,6 @@ static int flexcan_open(struct net_device *dev) err = flexcan_chip_start(dev); if (err) goto out_close; - - can_led_event(dev, CAN_LED_EVENT_OPEN); - napi_enable(&priv->napi); netif_start_queue(dev); @@ -900,8 +893,6 @@ static int flexcan_close(struct net_device *dev) close_candev(dev); - can_led_event(dev, CAN_LED_EVENT_STOP); - return 0; } @@ -1101,8 +1092,6 @@ static int flexcan_probe(struct platform_device *pdev) goto failed_register; } - devm_can_led_init(dev); - dev_info(&pdev->dev, "device registered (reg_base=%p, irq=%d)\n", priv->base, dev->irq); diff --git a/trunk/drivers/net/can/led.c b/trunk/drivers/net/can/led.c deleted file mode 100644 index f27fca65dc4a..000000000000 --- a/trunk/drivers/net/can/led.c +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright 2012, Fabio Baltieri - * Copyright 2012, Kurt Van Dijck - * - * 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. - */ - -#include -#include -#include -#include -#include -#include - -#include - -static unsigned long led_delay = 50; -module_param(led_delay, ulong, 0644); -MODULE_PARM_DESC(led_delay, - "blink delay time for activity leds (msecs, default: 50)."); - -/* Trigger a LED event in response to a CAN device event */ -void can_led_event(struct net_device *netdev, enum can_led_event event) -{ - struct can_priv *priv = netdev_priv(netdev); - - switch (event) { - case CAN_LED_EVENT_OPEN: - led_trigger_event(priv->tx_led_trig, LED_FULL); - led_trigger_event(priv->rx_led_trig, LED_FULL); - break; - case CAN_LED_EVENT_STOP: - led_trigger_event(priv->tx_led_trig, LED_OFF); - led_trigger_event(priv->rx_led_trig, LED_OFF); - break; - case CAN_LED_EVENT_TX: - if (led_delay) - led_trigger_blink_oneshot(priv->tx_led_trig, - &led_delay, &led_delay, 1); - break; - case CAN_LED_EVENT_RX: - if (led_delay) - led_trigger_blink_oneshot(priv->rx_led_trig, - &led_delay, &led_delay, 1); - break; - } -} -EXPORT_SYMBOL_GPL(can_led_event); - -static void can_led_release(struct device *gendev, void *res) -{ - struct can_priv *priv = netdev_priv(to_net_dev(gendev)); - - led_trigger_unregister_simple(priv->tx_led_trig); - led_trigger_unregister_simple(priv->rx_led_trig); -} - -/* Register CAN LED triggers for a CAN device - * - * This is normally called from a driver's probe function - */ -void devm_can_led_init(struct net_device *netdev) -{ - struct can_priv *priv = netdev_priv(netdev); - void *res; - - res = devres_alloc(can_led_release, 0, GFP_KERNEL); - if (!res) { - netdev_err(netdev, "cannot register LED triggers\n"); - return; - } - - snprintf(priv->tx_led_trig_name, sizeof(priv->tx_led_trig_name), - "%s-tx", netdev->name); - snprintf(priv->rx_led_trig_name, sizeof(priv->rx_led_trig_name), - "%s-rx", netdev->name); - - led_trigger_register_simple(priv->tx_led_trig_name, - &priv->tx_led_trig); - led_trigger_register_simple(priv->rx_led_trig_name, - &priv->rx_led_trig); - - devres_add(&netdev->dev, res); -} -EXPORT_SYMBOL_GPL(devm_can_led_init); - -/* NETDEV rename notifier to rename the associated led triggers too */ -static int can_led_notifier(struct notifier_block *nb, unsigned long msg, - void *data) -{ - struct net_device *netdev = data; - struct can_priv *priv = safe_candev_priv(netdev); - char name[CAN_LED_NAME_SZ]; - - if (!priv) - return NOTIFY_DONE; - - if (msg == NETDEV_CHANGENAME) { - snprintf(name, sizeof(name), "%s-tx", netdev->name); - led_trigger_rename_static(name, priv->tx_led_trig); - - snprintf(name, sizeof(name), "%s-rx", netdev->name); - led_trigger_rename_static(name, priv->rx_led_trig); - } - - return NOTIFY_DONE; -} - -/* notifier block for netdevice event */ -static struct notifier_block can_netdev_notifier __read_mostly = { - .notifier_call = can_led_notifier, -}; - -int __init can_led_notifier_init(void) -{ - return register_netdevice_notifier(&can_netdev_notifier); -} - -void __exit can_led_notifier_exit(void) -{ - unregister_netdevice_notifier(&can_netdev_notifier); -} diff --git a/trunk/drivers/net/can/mcp251x.c b/trunk/drivers/net/can/mcp251x.c index f32b9fc6a983..5eaf47b8e37b 100644 --- a/trunk/drivers/net/can/mcp251x.c +++ b/trunk/drivers/net/can/mcp251x.c @@ -60,7 +60,6 @@ #include #include -#include #include #include #include @@ -495,9 +494,6 @@ static void mcp251x_hw_rx(struct spi_device *spi, int buf_idx) priv->net->stats.rx_packets++; priv->net->stats.rx_bytes += frame->can_dlc; - - can_led_event(priv->net, CAN_LED_EVENT_RX); - netif_rx_ni(skb); } @@ -711,8 +707,6 @@ static int mcp251x_stop(struct net_device *net) mutex_unlock(&priv->mcp_lock); - can_led_event(net, CAN_LED_EVENT_STOP); - return 0; } @@ -911,7 +905,6 @@ static irqreturn_t mcp251x_can_ist(int irq, void *dev_id) if (intf & CANINTF_TX) { net->stats.tx_packets++; net->stats.tx_bytes += priv->tx_len - 1; - can_led_event(net, CAN_LED_EVENT_TX); if (priv->tx_len) { can_get_echo_skb(net, 0); priv->tx_len = 0; @@ -975,9 +968,6 @@ static int mcp251x_open(struct net_device *net) mcp251x_open_clean(net); goto open_unlock; } - - can_led_event(net, CAN_LED_EVENT_OPEN); - netif_wake_queue(net); open_unlock: @@ -1087,15 +1077,10 @@ static int mcp251x_can_probe(struct spi_device *spi) pdata->transceiver_enable(0); ret = register_candev(net); - if (ret) - goto error_probe; - - devm_can_led_init(net); - - dev_info(&spi->dev, "probed\n"); - - return ret; - + if (!ret) { + dev_info(&spi->dev, "probed\n"); + return ret; + } error_probe: if (!mcp251x_enable_dma) kfree(priv->spi_rx_buf); diff --git a/trunk/drivers/net/can/mscan/Kconfig b/trunk/drivers/net/can/mscan/Kconfig index f19be5269e7b..d38706958af6 100644 --- a/trunk/drivers/net/can/mscan/Kconfig +++ b/trunk/drivers/net/can/mscan/Kconfig @@ -1,5 +1,5 @@ config CAN_MSCAN - depends on PPC || M68K + depends on CAN_DEV && (PPC || M68K) tristate "Support for Freescale MSCAN based chips" ---help--- The Motorola Scalable Controller Area Network (MSCAN) definition diff --git a/trunk/drivers/net/can/sja1000/Kconfig b/trunk/drivers/net/can/sja1000/Kconfig index b39ca5b3ea7f..92f73c708a3d 100644 --- a/trunk/drivers/net/can/sja1000/Kconfig +++ b/trunk/drivers/net/can/sja1000/Kconfig @@ -1,6 +1,6 @@ menuconfig CAN_SJA1000 tristate "Philips/NXP SJA1000 devices" - depends on HAS_IOMEM + depends on CAN_DEV && HAS_IOMEM if CAN_SJA1000 @@ -99,11 +99,11 @@ config CAN_TSCAN1 tristate "TS-CAN1 PC104 boards" depends on ISA help - This driver is for Technologic Systems' TSCAN-1 PC104 boards. - http://www.embeddedarm.com/products/board-detail.php?product=TS-CAN1 - The driver supports multiple boards and automatically configures them: - PLD IO base addresses are read from jumpers JP1 and JP2, - IRQ numbers are read from jumpers JP4 and JP5, - SJA1000 IO base addresses are chosen heuristically (first that works). + This driver is for Technologic Systems' TSCAN-1 PC104 boards. + http://www.embeddedarm.com/products/board-detail.php?product=TS-CAN1 + The driver supports multiple boards and automatically configures them: + PLD IO base addresses are read from jumpers JP1 and JP2, + IRQ numbers are read from jumpers JP4 and JP5, + SJA1000 IO base addresses are chosen heuristically (first that works). endif diff --git a/trunk/drivers/net/can/sja1000/sja1000.c b/trunk/drivers/net/can/sja1000/sja1000.c index daf4013a8fc7..83ee11eca0e2 100644 --- a/trunk/drivers/net/can/sja1000/sja1000.c +++ b/trunk/drivers/net/can/sja1000/sja1000.c @@ -60,7 +60,6 @@ #include #include -#include #include "sja1000.h" @@ -369,8 +368,6 @@ static void sja1000_rx(struct net_device *dev) stats->rx_packets++; stats->rx_bytes += cf->can_dlc; - - can_led_event(dev, CAN_LED_EVENT_RX); } static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status) @@ -524,7 +521,6 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id) can_get_echo_skb(dev, 0); } netif_wake_queue(dev); - can_led_event(dev, CAN_LED_EVENT_TX); } if (isrc & IRQ_RI) { /* receive interrupt */ @@ -579,8 +575,6 @@ static int sja1000_open(struct net_device *dev) /* init and start chi */ sja1000_start(dev); - can_led_event(dev, CAN_LED_EVENT_OPEN); - netif_start_queue(dev); return 0; @@ -598,8 +592,6 @@ static int sja1000_close(struct net_device *dev) close_candev(dev); - can_led_event(dev, CAN_LED_EVENT_STOP); - return 0; } @@ -647,8 +639,6 @@ static const struct net_device_ops sja1000_netdev_ops = { int register_sja1000dev(struct net_device *dev) { - int ret; - if (!sja1000_probe_chip(dev)) return -ENODEV; @@ -658,12 +648,7 @@ int register_sja1000dev(struct net_device *dev) set_reset_mode(dev); chipset_init(dev); - ret = register_candev(dev); - - if (!ret) - devm_can_led_init(dev); - - return ret; + return register_candev(dev); } EXPORT_SYMBOL_GPL(register_sja1000dev); diff --git a/trunk/drivers/net/can/slcan.c b/trunk/drivers/net/can/slcan.c index 06b7e097d36e..adc3708d8829 100644 --- a/trunk/drivers/net/can/slcan.c +++ b/trunk/drivers/net/can/slcan.c @@ -55,7 +55,6 @@ #include #include #include -#include static __initconst const char banner[] = KERN_INFO "slcan: serial line CAN interface driver\n"; @@ -185,8 +184,7 @@ static void slc_bump(struct slcan *sl) cf.data[i] |= tmp; } - skb = dev_alloc_skb(sizeof(struct can_frame) + - sizeof(struct can_skb_priv)); + skb = dev_alloc_skb(sizeof(struct can_frame)); if (!skb) return; @@ -194,10 +192,6 @@ static void slc_bump(struct slcan *sl) skb->protocol = htons(ETH_P_CAN); skb->pkt_type = PACKET_BROADCAST; skb->ip_summed = CHECKSUM_UNNECESSARY; - - can_skb_reserve(skb); - can_skb_prv(skb)->ifindex = sl->dev->ifindex; - memcpy(skb_put(skb, sizeof(struct can_frame)), &cf, sizeof(struct can_frame)); netif_rx_ni(skb); diff --git a/trunk/drivers/net/can/softing/Kconfig b/trunk/drivers/net/can/softing/Kconfig index 96b6fe158b5b..5de46a9a77bb 100644 --- a/trunk/drivers/net/can/softing/Kconfig +++ b/trunk/drivers/net/can/softing/Kconfig @@ -1,6 +1,6 @@ config CAN_SOFTING tristate "Softing Gmbh CAN generic support" - depends on HAS_IOMEM + depends on CAN_DEV && HAS_IOMEM ---help--- Support for CAN cards from Softing Gmbh & some cards from Vector Gmbh. diff --git a/trunk/drivers/net/can/ti_hecc.c b/trunk/drivers/net/can/ti_hecc.c index f52a9755fb3e..f898c6363729 100644 --- a/trunk/drivers/net/can/ti_hecc.c +++ b/trunk/drivers/net/can/ti_hecc.c @@ -50,7 +50,6 @@ #include #include -#include #include #define DRV_NAME "ti_hecc" @@ -594,7 +593,6 @@ static int ti_hecc_rx_pkt(struct ti_hecc_priv *priv, int mbxno) spin_unlock_irqrestore(&priv->mbx_lock, flags); stats->rx_bytes += cf->can_dlc; - can_led_event(priv->ndev, CAN_LED_EVENT_RX); netif_receive_skb(skb); stats->rx_packets++; @@ -798,7 +796,6 @@ static irqreturn_t ti_hecc_interrupt(int irq, void *dev_id) stats->tx_bytes += hecc_read_mbx(priv, mbxno, HECC_CANMCF) & 0xF; stats->tx_packets++; - can_led_event(ndev, CAN_LED_EVENT_TX); can_get_echo_skb(ndev, mbxno); --priv->tx_tail; } @@ -854,8 +851,6 @@ static int ti_hecc_open(struct net_device *ndev) return err; } - can_led_event(ndev, CAN_LED_EVENT_OPEN); - ti_hecc_start(ndev); napi_enable(&priv->napi); netif_start_queue(ndev); @@ -874,8 +869,6 @@ static int ti_hecc_close(struct net_device *ndev) close_candev(ndev); ti_hecc_transceiver_switch(priv, 0); - can_led_event(ndev, CAN_LED_EVENT_STOP); - return 0; } @@ -968,9 +961,6 @@ static int ti_hecc_probe(struct platform_device *pdev) dev_err(&pdev->dev, "register_candev() failed\n"); goto probe_exit_clk; } - - devm_can_led_init(ndev); - dev_info(&pdev->dev, "device registered (reg_base=%p, irq=%u)\n", priv->base, (u32) ndev->irq); diff --git a/trunk/drivers/net/can/usb/Kconfig b/trunk/drivers/net/can/usb/Kconfig index fc96a3d83ebe..a4e4bee35710 100644 --- a/trunk/drivers/net/can/usb/Kconfig +++ b/trunk/drivers/net/can/usb/Kconfig @@ -1,5 +1,5 @@ menu "CAN USB interfaces" - depends on USB + depends on USB && CAN_DEV config CAN_EMS_USB tristate "EMS CPC-USB/ARM7 CAN/USB interface" @@ -48,10 +48,4 @@ config CAN_PEAK_USB This driver supports the PCAN-USB and PCAN-USB Pro adapters from PEAK-System Technik (http://www.peak-system.com). -config CAN_8DEV_USB - tristate "8 devices USB2CAN interface" - ---help--- - This driver supports the USB2CAN interface - from 8 devices (http://www.8devices.com). - endmenu diff --git a/trunk/drivers/net/can/usb/Makefile b/trunk/drivers/net/can/usb/Makefile index becef460a91a..80a2ee41fd61 100644 --- a/trunk/drivers/net/can/usb/Makefile +++ b/trunk/drivers/net/can/usb/Makefile @@ -6,6 +6,5 @@ obj-$(CONFIG_CAN_EMS_USB) += ems_usb.o obj-$(CONFIG_CAN_ESD_USB2) += esd_usb2.o obj-$(CONFIG_CAN_KVASER_USB) += kvaser_usb.o obj-$(CONFIG_CAN_PEAK_USB) += peak_usb/ -obj-$(CONFIG_CAN_8DEV_USB) += usb_8dev.o ccflags-$(CONFIG_CAN_DEBUG_DEVICES) := -DDEBUG diff --git a/trunk/drivers/net/can/usb/usb_8dev.c b/trunk/drivers/net/can/usb/usb_8dev.c deleted file mode 100644 index f789e6f54a55..000000000000 --- a/trunk/drivers/net/can/usb/usb_8dev.c +++ /dev/null @@ -1,1033 +0,0 @@ -/* - * CAN driver for "8 devices" USB2CAN converter - * - * Copyright (C) 2012 Bernd Krumboeck (krumboeck@universalnet.at) - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published - * by the Free Software Foundation; version 2 of the License. - * - * 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. - * - * This driver is inspired by the 3.2.0 version of drivers/net/can/usb/ems_usb.c - * and drivers/net/can/usb/esd_usb2.c - * - * Many thanks to Gerhard Bertelsmann (info@gerhard-bertelsmann.de) - * for testing and fixing this driver. Also many thanks to "8 devices", - * who were very cooperative and answered my questions. - */ - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -/* driver constants */ -#define MAX_RX_URBS 20 -#define MAX_TX_URBS 20 -#define RX_BUFFER_SIZE 64 - -/* vendor and product id */ -#define USB_8DEV_VENDOR_ID 0x0483 -#define USB_8DEV_PRODUCT_ID 0x1234 - -/* endpoints */ -enum usb_8dev_endpoint { - USB_8DEV_ENDP_DATA_RX = 1, - USB_8DEV_ENDP_DATA_TX, - USB_8DEV_ENDP_CMD_RX, - USB_8DEV_ENDP_CMD_TX -}; - -/* device CAN clock */ -#define USB_8DEV_ABP_CLOCK 32000000 - -/* setup flags */ -#define USB_8DEV_SILENT 0x01 -#define USB_8DEV_LOOPBACK 0x02 -#define USB_8DEV_DISABLE_AUTO_RESTRANS 0x04 -#define USB_8DEV_STATUS_FRAME 0x08 - -/* commands */ -enum usb_8dev_cmd { - USB_8DEV_RESET = 1, - USB_8DEV_OPEN, - USB_8DEV_CLOSE, - USB_8DEV_SET_SPEED, - USB_8DEV_SET_MASK_FILTER, - USB_8DEV_GET_STATUS, - USB_8DEV_GET_STATISTICS, - USB_8DEV_GET_SERIAL, - USB_8DEV_GET_SOFTW_VER, - USB_8DEV_GET_HARDW_VER, - USB_8DEV_RESET_TIMESTAMP, - USB_8DEV_GET_SOFTW_HARDW_VER -}; - -/* command options */ -#define USB_8DEV_BAUD_MANUAL 0x09 -#define USB_8DEV_CMD_START 0x11 -#define USB_8DEV_CMD_END 0x22 - -#define USB_8DEV_CMD_SUCCESS 0 -#define USB_8DEV_CMD_ERROR 255 - -#define USB_8DEV_CMD_TIMEOUT 1000 - -/* frames */ -#define USB_8DEV_DATA_START 0x55 -#define USB_8DEV_DATA_END 0xAA - -#define USB_8DEV_TYPE_CAN_FRAME 0 -#define USB_8DEV_TYPE_ERROR_FRAME 3 - -#define USB_8DEV_EXTID 0x01 -#define USB_8DEV_RTR 0x02 -#define USB_8DEV_ERR_FLAG 0x04 - -/* status */ -#define USB_8DEV_STATUSMSG_OK 0x00 /* Normal condition. */ -#define USB_8DEV_STATUSMSG_OVERRUN 0x01 /* Overrun occured when sending */ -#define USB_8DEV_STATUSMSG_BUSLIGHT 0x02 /* Error counter has reached 96 */ -#define USB_8DEV_STATUSMSG_BUSHEAVY 0x03 /* Error count. has reached 128 */ -#define USB_8DEV_STATUSMSG_BUSOFF 0x04 /* Device is in BUSOFF */ -#define USB_8DEV_STATUSMSG_STUFF 0x20 /* Stuff Error */ -#define USB_8DEV_STATUSMSG_FORM 0x21 /* Form Error */ -#define USB_8DEV_STATUSMSG_ACK 0x23 /* Ack Error */ -#define USB_8DEV_STATUSMSG_BIT0 0x24 /* Bit1 Error */ -#define USB_8DEV_STATUSMSG_BIT1 0x25 /* Bit0 Error */ -#define USB_8DEV_STATUSMSG_CRC 0x27 /* CRC Error */ - -#define USB_8DEV_RP_MASK 0x7F /* Mask for Receive Error Bit */ - - -/* table of devices that work with this driver */ -static const struct usb_device_id usb_8dev_table[] = { - { USB_DEVICE(USB_8DEV_VENDOR_ID, USB_8DEV_PRODUCT_ID) }, - { } /* Terminating entry */ -}; - -MODULE_DEVICE_TABLE(usb, usb_8dev_table); - -struct usb_8dev_tx_urb_context { - struct usb_8dev_priv *priv; - - u32 echo_index; - u8 dlc; -}; - -/* Structure to hold all of our device specific stuff */ -struct usb_8dev_priv { - struct can_priv can; /* must be the first member */ - - struct sk_buff *echo_skb[MAX_TX_URBS]; - - struct usb_device *udev; - struct net_device *netdev; - - atomic_t active_tx_urbs; - struct usb_anchor tx_submitted; - struct usb_8dev_tx_urb_context tx_contexts[MAX_TX_URBS]; - - struct usb_anchor rx_submitted; - - struct can_berr_counter bec; - - u8 *cmd_msg_buffer; - - struct mutex usb_8dev_cmd_lock; - -}; - -/* tx frame */ -struct __packed usb_8dev_tx_msg { - u8 begin; - u8 flags; /* RTR and EXT_ID flag */ - __be32 id; /* upper 3 bits not used */ - u8 dlc; /* data length code 0-8 bytes */ - u8 data[8]; /* 64-bit data */ - u8 end; -}; - -/* rx frame */ -struct __packed usb_8dev_rx_msg { - u8 begin; - u8 type; /* frame type */ - u8 flags; /* RTR and EXT_ID flag */ - __be32 id; /* upper 3 bits not used */ - u8 dlc; /* data length code 0-8 bytes */ - u8 data[8]; /* 64-bit data */ - __be32 timestamp; /* 32-bit timestamp */ - u8 end; -}; - -/* command frame */ -struct __packed usb_8dev_cmd_msg { - u8 begin; - u8 channel; /* unkown - always 0 */ - u8 command; /* command to execute */ - u8 opt1; /* optional parameter / return value */ - u8 opt2; /* optional parameter 2 */ - u8 data[10]; /* optional parameter and data */ - u8 end; -}; - -static int usb_8dev_send_cmd_msg(struct usb_8dev_priv *priv, u8 *msg, int size) -{ - int actual_length; - - return usb_bulk_msg(priv->udev, - usb_sndbulkpipe(priv->udev, USB_8DEV_ENDP_CMD_TX), - msg, size, &actual_length, USB_8DEV_CMD_TIMEOUT); -} - -static int usb_8dev_wait_cmd_msg(struct usb_8dev_priv *priv, u8 *msg, int size, - int *actual_length) -{ - return usb_bulk_msg(priv->udev, - usb_rcvbulkpipe(priv->udev, USB_8DEV_ENDP_CMD_RX), - msg, size, actual_length, USB_8DEV_CMD_TIMEOUT); -} - -/* Send command to device and receive result. - * Command was successful when opt1 = 0. - */ -static int usb_8dev_send_cmd(struct usb_8dev_priv *priv, - struct usb_8dev_cmd_msg *out, - struct usb_8dev_cmd_msg *in) -{ - int err; - int num_bytes_read; - struct net_device *netdev; - - netdev = priv->netdev; - - out->begin = USB_8DEV_CMD_START; - out->end = USB_8DEV_CMD_END; - - mutex_lock(&priv->usb_8dev_cmd_lock); - - memcpy(priv->cmd_msg_buffer, out, - sizeof(struct usb_8dev_cmd_msg)); - - err = usb_8dev_send_cmd_msg(priv, priv->cmd_msg_buffer, - sizeof(struct usb_8dev_cmd_msg)); - if (err < 0) { - netdev_err(netdev, "sending command message failed\n"); - goto failed; - } - - err = usb_8dev_wait_cmd_msg(priv, priv->cmd_msg_buffer, - sizeof(struct usb_8dev_cmd_msg), - &num_bytes_read); - if (err < 0) { - netdev_err(netdev, "no command message answer\n"); - goto failed; - } - - memcpy(in, priv->cmd_msg_buffer, sizeof(struct usb_8dev_cmd_msg)); - - if (in->begin != USB_8DEV_CMD_START || in->end != USB_8DEV_CMD_END || - num_bytes_read != 16 || in->opt1 != 0) - err = -EPROTO; - -failed: - mutex_unlock(&priv->usb_8dev_cmd_lock); - return err; -} - -/* Send open command to device */ -static int usb_8dev_cmd_open(struct usb_8dev_priv *priv) -{ - struct can_bittiming *bt = &priv->can.bittiming; - struct usb_8dev_cmd_msg outmsg; - struct usb_8dev_cmd_msg inmsg; - u32 ctrlmode = priv->can.ctrlmode; - u32 flags = USB_8DEV_STATUS_FRAME; - __be32 beflags; - __be16 bebrp; - - memset(&outmsg, 0, sizeof(outmsg)); - outmsg.command = USB_8DEV_OPEN; - outmsg.opt1 = USB_8DEV_BAUD_MANUAL; - outmsg.data[0] = bt->prop_seg + bt->phase_seg1; - outmsg.data[1] = bt->phase_seg2; - outmsg.data[2] = bt->sjw; - - /* BRP */ - bebrp = cpu_to_be16((u16)bt->brp); - memcpy(&outmsg.data[3], &bebrp, sizeof(bebrp)); - - /* flags */ - if (ctrlmode & CAN_CTRLMODE_LOOPBACK) - flags |= USB_8DEV_LOOPBACK; - if (ctrlmode & CAN_CTRLMODE_LISTENONLY) - flags |= USB_8DEV_SILENT; - if (ctrlmode & CAN_CTRLMODE_ONE_SHOT) - flags |= USB_8DEV_DISABLE_AUTO_RESTRANS; - - beflags = cpu_to_be32(flags); - memcpy(&outmsg.data[5], &beflags, sizeof(beflags)); - - return usb_8dev_send_cmd(priv, &outmsg, &inmsg); -} - -/* Send close command to device */ -static int usb_8dev_cmd_close(struct usb_8dev_priv *priv) -{ - struct usb_8dev_cmd_msg inmsg; - struct usb_8dev_cmd_msg outmsg = { - .channel = 0, - .command = USB_8DEV_CLOSE, - .opt1 = 0, - .opt2 = 0 - }; - - return usb_8dev_send_cmd(priv, &outmsg, &inmsg); -} - -/* Get firmware and hardware version */ -static int usb_8dev_cmd_version(struct usb_8dev_priv *priv, u32 *res) -{ - struct usb_8dev_cmd_msg inmsg; - struct usb_8dev_cmd_msg outmsg = { - .channel = 0, - .command = USB_8DEV_GET_SOFTW_HARDW_VER, - .opt1 = 0, - .opt2 = 0 - }; - - int err = usb_8dev_send_cmd(priv, &outmsg, &inmsg); - if (err) - return err; - - *res = be32_to_cpup((__be32 *)inmsg.data); - - return err; -} - -/* Set network device mode - * - * Maybe we should leave this function empty, because the device - * set mode variable with open command. - */ -static int usb_8dev_set_mode(struct net_device *netdev, enum can_mode mode) -{ - struct usb_8dev_priv *priv = netdev_priv(netdev); - int err = 0; - - switch (mode) { - case CAN_MODE_START: - err = usb_8dev_cmd_open(priv); - if (err) - netdev_warn(netdev, "couldn't start device"); - break; - - default: - return -EOPNOTSUPP; - } - - return err; -} - -/* Read error/status frames */ -static void usb_8dev_rx_err_msg(struct usb_8dev_priv *priv, - struct usb_8dev_rx_msg *msg) -{ - struct can_frame *cf; - struct sk_buff *skb; - struct net_device_stats *stats = &priv->netdev->stats; - - /* Error message: - * byte 0: Status - * byte 1: bit 7: Receive Passive - * byte 1: bit 0-6: Receive Error Counter - * byte 2: Transmit Error Counter - * byte 3: Always 0 (maybe reserved for future use) - */ - - u8 state = msg->data[0]; - u8 rxerr = msg->data[1] & USB_8DEV_RP_MASK; - u8 txerr = msg->data[2]; - int rx_errors = 0; - int tx_errors = 0; - - skb = alloc_can_err_skb(priv->netdev, &cf); - if (!skb) - return; - - switch (state) { - case USB_8DEV_STATUSMSG_OK: - priv->can.state = CAN_STATE_ERROR_ACTIVE; - cf->can_id |= CAN_ERR_PROT; - cf->data[2] = CAN_ERR_PROT_ACTIVE; - break; - case USB_8DEV_STATUSMSG_BUSOFF: - priv->can.state = CAN_STATE_BUS_OFF; - cf->can_id |= CAN_ERR_BUSOFF; - can_bus_off(priv->netdev); - break; - case USB_8DEV_STATUSMSG_OVERRUN: - case USB_8DEV_STATUSMSG_BUSLIGHT: - case USB_8DEV_STATUSMSG_BUSHEAVY: - cf->can_id |= CAN_ERR_CRTL; - break; - default: - priv->can.state = CAN_STATE_ERROR_WARNING; - cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR; - priv->can.can_stats.bus_error++; - break; - } - - switch (state) { - case USB_8DEV_STATUSMSG_OK: - case USB_8DEV_STATUSMSG_BUSOFF: - break; - case USB_8DEV_STATUSMSG_ACK: - cf->can_id |= CAN_ERR_ACK; - tx_errors = 1; - break; - case USB_8DEV_STATUSMSG_CRC: - cf->data[2] |= CAN_ERR_PROT_UNSPEC; - cf->data[3] |= CAN_ERR_PROT_LOC_CRC_SEQ | - CAN_ERR_PROT_LOC_CRC_DEL; - rx_errors = 1; - break; - case USB_8DEV_STATUSMSG_BIT0: - cf->data[2] |= CAN_ERR_PROT_BIT0; - tx_errors = 1; - break; - case USB_8DEV_STATUSMSG_BIT1: - cf->data[2] |= CAN_ERR_PROT_BIT1; - tx_errors = 1; - break; - case USB_8DEV_STATUSMSG_FORM: - cf->data[2] |= CAN_ERR_PROT_FORM; - rx_errors = 1; - break; - case USB_8DEV_STATUSMSG_STUFF: - cf->data[2] |= CAN_ERR_PROT_STUFF; - rx_errors = 1; - break; - case USB_8DEV_STATUSMSG_OVERRUN: - cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW; - stats->rx_over_errors++; - rx_errors = 1; - break; - case USB_8DEV_STATUSMSG_BUSLIGHT: - priv->can.state = CAN_STATE_ERROR_WARNING; - cf->data[1] = (txerr > rxerr) ? - CAN_ERR_CRTL_TX_WARNING : - CAN_ERR_CRTL_RX_WARNING; - priv->can.can_stats.error_warning++; - break; - case USB_8DEV_STATUSMSG_BUSHEAVY: - priv->can.state = CAN_STATE_ERROR_PASSIVE; - cf->data[1] = (txerr > rxerr) ? - CAN_ERR_CRTL_TX_PASSIVE : - CAN_ERR_CRTL_RX_PASSIVE; - priv->can.can_stats.error_passive++; - break; - default: - netdev_warn(priv->netdev, - "Unknown status/error message (%d)\n", state); - break; - } - - if (tx_errors) { - cf->data[2] |= CAN_ERR_PROT_TX; - stats->tx_errors++; - } - - if (rx_errors) - stats->rx_errors++; - - cf->data[6] = txerr; - cf->data[7] = rxerr; - - priv->bec.txerr = txerr; - priv->bec.rxerr = rxerr; - - netif_rx(skb); - - stats->rx_packets++; - stats->rx_bytes += cf->can_dlc; -} - -/* Read data and status frames */ -static void usb_8dev_rx_can_msg(struct usb_8dev_priv *priv, - struct usb_8dev_rx_msg *msg) -{ - struct can_frame *cf; - struct sk_buff *skb; - struct net_device_stats *stats = &priv->netdev->stats; - - if (msg->type == USB_8DEV_TYPE_ERROR_FRAME && - msg->flags == USB_8DEV_ERR_FLAG) { - usb_8dev_rx_err_msg(priv, msg); - } else if (msg->type == USB_8DEV_TYPE_CAN_FRAME) { - skb = alloc_can_skb(priv->netdev, &cf); - if (!skb) - return; - - cf->can_id = be32_to_cpu(msg->id); - cf->can_dlc = get_can_dlc(msg->dlc & 0xF); - - if (msg->flags & USB_8DEV_EXTID) - cf->can_id |= CAN_EFF_FLAG; - - if (msg->flags & USB_8DEV_RTR) - cf->can_id |= CAN_RTR_FLAG; - else - memcpy(cf->data, msg->data, cf->can_dlc); - - netif_rx(skb); - - stats->rx_packets++; - stats->rx_bytes += cf->can_dlc; - - can_led_event(priv->netdev, CAN_LED_EVENT_RX); - } else { - netdev_warn(priv->netdev, "frame type %d unknown", - msg->type); - } - -} - -/* Callback for reading data from device - * - * Check urb status, call read function and resubmit urb read operation. - */ -static void usb_8dev_read_bulk_callback(struct urb *urb) -{ - struct usb_8dev_priv *priv = urb->context; - struct net_device *netdev; - int retval; - int pos = 0; - - netdev = priv->netdev; - - if (!netif_device_present(netdev)) - return; - - switch (urb->status) { - case 0: /* success */ - break; - - case -ENOENT: - case -ESHUTDOWN: - return; - - default: - netdev_info(netdev, "Rx URB aborted (%d)\n", - urb->status); - goto resubmit_urb; - } - - while (pos < urb->actual_length) { - struct usb_8dev_rx_msg *msg; - - if (pos + sizeof(struct usb_8dev_rx_msg) > urb->actual_length) { - netdev_err(priv->netdev, "format error\n"); - break; - } - - msg = (struct usb_8dev_rx_msg *)(urb->transfer_buffer + pos); - usb_8dev_rx_can_msg(priv, msg); - - pos += sizeof(struct usb_8dev_rx_msg); - } - -resubmit_urb: - usb_fill_bulk_urb(urb, priv->udev, - usb_rcvbulkpipe(priv->udev, USB_8DEV_ENDP_DATA_RX), - urb->transfer_buffer, RX_BUFFER_SIZE, - usb_8dev_read_bulk_callback, priv); - - retval = usb_submit_urb(urb, GFP_ATOMIC); - - if (retval == -ENODEV) - netif_device_detach(netdev); - else if (retval) - netdev_err(netdev, - "failed resubmitting read bulk urb: %d\n", retval); -} - -/* Callback handler for write operations - * - * Free allocated buffers, check transmit status and - * calculate statistic. - */ -static void usb_8dev_write_bulk_callback(struct urb *urb) -{ - struct usb_8dev_tx_urb_context *context = urb->context; - struct usb_8dev_priv *priv; - struct net_device *netdev; - - BUG_ON(!context); - - priv = context->priv; - netdev = priv->netdev; - - /* free up our allocated buffer */ - usb_free_coherent(urb->dev, urb->transfer_buffer_length, - urb->transfer_buffer, urb->transfer_dma); - - atomic_dec(&priv->active_tx_urbs); - - if (!netif_device_present(netdev)) - return; - - if (urb->status) - netdev_info(netdev, "Tx URB aborted (%d)\n", - urb->status); - - netdev->stats.tx_packets++; - netdev->stats.tx_bytes += context->dlc; - - can_get_echo_skb(netdev, context->echo_index); - - can_led_event(netdev, CAN_LED_EVENT_TX); - - /* Release context */ - context->echo_index = MAX_TX_URBS; - - netif_wake_queue(netdev); -} - -/* Send data to device */ -static netdev_tx_t usb_8dev_start_xmit(struct sk_buff *skb, - struct net_device *netdev) -{ - struct usb_8dev_priv *priv = netdev_priv(netdev); - struct net_device_stats *stats = &netdev->stats; - struct can_frame *cf = (struct can_frame *) skb->data; - struct usb_8dev_tx_msg *msg; - struct urb *urb; - struct usb_8dev_tx_urb_context *context = NULL; - u8 *buf; - int i, err; - size_t size = sizeof(struct usb_8dev_tx_msg); - - if (can_dropped_invalid_skb(netdev, skb)) - return NETDEV_TX_OK; - - /* create a URB, and a buffer for it, and copy the data to the URB */ - urb = usb_alloc_urb(0, GFP_ATOMIC); - if (!urb) { - netdev_err(netdev, "No memory left for URBs\n"); - goto nomem; - } - - buf = usb_alloc_coherent(priv->udev, size, GFP_ATOMIC, - &urb->transfer_dma); - if (!buf) { - netdev_err(netdev, "No memory left for USB buffer\n"); - goto nomembuf; - } - - memset(buf, 0, size); - - msg = (struct usb_8dev_tx_msg *)buf; - msg->begin = USB_8DEV_DATA_START; - msg->flags = 0x00; - - if (cf->can_id & CAN_RTR_FLAG) - msg->flags |= USB_8DEV_RTR; - - if (cf->can_id & CAN_EFF_FLAG) - msg->flags |= USB_8DEV_EXTID; - - msg->id = cpu_to_be32(cf->can_id & CAN_ERR_MASK); - msg->dlc = cf->can_dlc; - memcpy(msg->data, cf->data, cf->can_dlc); - msg->end = USB_8DEV_DATA_END; - - for (i = 0; i < MAX_TX_URBS; i++) { - if (priv->tx_contexts[i].echo_index == MAX_TX_URBS) { - context = &priv->tx_contexts[i]; - break; - } - } - - /* May never happen! When this happens we'd more URBs in flight as - * allowed (MAX_TX_URBS). - */ - if (!context) - goto nofreecontext; - - context->priv = priv; - context->echo_index = i; - context->dlc = cf->can_dlc; - - usb_fill_bulk_urb(urb, priv->udev, - usb_sndbulkpipe(priv->udev, USB_8DEV_ENDP_DATA_TX), - buf, size, usb_8dev_write_bulk_callback, context); - urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; - usb_anchor_urb(urb, &priv->tx_submitted); - - can_put_echo_skb(skb, netdev, context->echo_index); - - atomic_inc(&priv->active_tx_urbs); - - err = usb_submit_urb(urb, GFP_ATOMIC); - if (unlikely(err)) - goto failed; - else if (atomic_read(&priv->active_tx_urbs) >= MAX_TX_URBS) - /* Slow down tx path */ - netif_stop_queue(netdev); - - /* Release our reference to this URB, the USB core will eventually free - * it entirely. - */ - usb_free_urb(urb); - - return NETDEV_TX_OK; - -nofreecontext: - usb_unanchor_urb(urb); - usb_free_coherent(priv->udev, size, buf, urb->transfer_dma); - - netdev_warn(netdev, "couldn't find free context"); - - return NETDEV_TX_BUSY; - -failed: - can_free_echo_skb(netdev, context->echo_index); - - usb_unanchor_urb(urb); - usb_free_coherent(priv->udev, size, buf, urb->transfer_dma); - - atomic_dec(&priv->active_tx_urbs); - - if (err == -ENODEV) - netif_device_detach(netdev); - else - netdev_warn(netdev, "failed tx_urb %d\n", err); - -nomembuf: - usb_free_urb(urb); - -nomem: - dev_kfree_skb(skb); - stats->tx_dropped++; - - return NETDEV_TX_OK; -} - -static int usb_8dev_get_berr_counter(const struct net_device *netdev, - struct can_berr_counter *bec) -{ - struct usb_8dev_priv *priv = netdev_priv(netdev); - - bec->txerr = priv->bec.txerr; - bec->rxerr = priv->bec.rxerr; - - return 0; -} - -/* Start USB device */ -static int usb_8dev_start(struct usb_8dev_priv *priv) -{ - struct net_device *netdev = priv->netdev; - int err, i; - - for (i = 0; i < MAX_RX_URBS; i++) { - struct urb *urb = NULL; - u8 *buf; - - /* create a URB, and a buffer for it */ - urb = usb_alloc_urb(0, GFP_KERNEL); - if (!urb) { - netdev_err(netdev, "No memory left for URBs\n"); - err = -ENOMEM; - break; - } - - buf = usb_alloc_coherent(priv->udev, RX_BUFFER_SIZE, GFP_KERNEL, - &urb->transfer_dma); - if (!buf) { - netdev_err(netdev, "No memory left for USB buffer\n"); - usb_free_urb(urb); - err = -ENOMEM; - break; - } - - usb_fill_bulk_urb(urb, priv->udev, - usb_rcvbulkpipe(priv->udev, - USB_8DEV_ENDP_DATA_RX), - buf, RX_BUFFER_SIZE, - usb_8dev_read_bulk_callback, priv); - urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; - usb_anchor_urb(urb, &priv->rx_submitted); - - err = usb_submit_urb(urb, GFP_KERNEL); - if (err) { - usb_unanchor_urb(urb); - usb_free_coherent(priv->udev, RX_BUFFER_SIZE, buf, - urb->transfer_dma); - break; - } - - /* Drop reference, USB core will take care of freeing it */ - usb_free_urb(urb); - } - - /* Did we submit any URBs */ - if (i == 0) { - netdev_warn(netdev, "couldn't setup read URBs\n"); - return err; - } - - /* Warn if we've couldn't transmit all the URBs */ - if (i < MAX_RX_URBS) - netdev_warn(netdev, "rx performance may be slow\n"); - - err = usb_8dev_cmd_open(priv); - if (err) - goto failed; - - priv->can.state = CAN_STATE_ERROR_ACTIVE; - - return 0; - -failed: - if (err == -ENODEV) - netif_device_detach(priv->netdev); - - netdev_warn(netdev, "couldn't submit control: %d\n", err); - - return err; -} - -/* Open USB device */ -static int usb_8dev_open(struct net_device *netdev) -{ - struct usb_8dev_priv *priv = netdev_priv(netdev); - int err; - - /* common open */ - err = open_candev(netdev); - if (err) - return err; - - can_led_event(netdev, CAN_LED_EVENT_OPEN); - - /* finally start device */ - err = usb_8dev_start(priv); - if (err) { - if (err == -ENODEV) - netif_device_detach(priv->netdev); - - netdev_warn(netdev, "couldn't start device: %d\n", - err); - - close_candev(netdev); - - return err; - } - - netif_start_queue(netdev); - - return 0; -} - -static void unlink_all_urbs(struct usb_8dev_priv *priv) -{ - int i; - - usb_kill_anchored_urbs(&priv->rx_submitted); - - usb_kill_anchored_urbs(&priv->tx_submitted); - atomic_set(&priv->active_tx_urbs, 0); - - for (i = 0; i < MAX_TX_URBS; i++) - priv->tx_contexts[i].echo_index = MAX_TX_URBS; -} - -/* Close USB device */ -static int usb_8dev_close(struct net_device *netdev) -{ - struct usb_8dev_priv *priv = netdev_priv(netdev); - int err = 0; - - /* Send CLOSE command to CAN controller */ - err = usb_8dev_cmd_close(priv); - if (err) - netdev_warn(netdev, "couldn't stop device"); - - priv->can.state = CAN_STATE_STOPPED; - - netif_stop_queue(netdev); - - /* Stop polling */ - unlink_all_urbs(priv); - - close_candev(netdev); - - can_led_event(netdev, CAN_LED_EVENT_STOP); - - return err; -} - -static const struct net_device_ops usb_8dev_netdev_ops = { - .ndo_open = usb_8dev_open, - .ndo_stop = usb_8dev_close, - .ndo_start_xmit = usb_8dev_start_xmit, -}; - -static const struct can_bittiming_const usb_8dev_bittiming_const = { - .name = "usb_8dev", - .tseg1_min = 1, - .tseg1_max = 16, - .tseg2_min = 1, - .tseg2_max = 8, - .sjw_max = 4, - .brp_min = 1, - .brp_max = 1024, - .brp_inc = 1, -}; - -/* Probe USB device - * - * Check device and firmware. - * Set supported modes and bittiming constants. - * Allocate some memory. - */ -static int usb_8dev_probe(struct usb_interface *intf, - const struct usb_device_id *id) -{ - struct net_device *netdev; - struct usb_8dev_priv *priv; - int i, err = -ENOMEM; - u32 version; - char buf[18]; - struct usb_device *usbdev = interface_to_usbdev(intf); - - /* product id looks strange, better we also check iProduct string */ - if (usb_string(usbdev, usbdev->descriptor.iProduct, buf, - sizeof(buf)) > 0 && strcmp(buf, "USB2CAN converter")) { - dev_info(&usbdev->dev, "ignoring: not an USB2CAN converter\n"); - return -ENODEV; - } - - netdev = alloc_candev(sizeof(struct usb_8dev_priv), MAX_TX_URBS); - if (!netdev) { - dev_err(&intf->dev, "Couldn't alloc candev\n"); - return -ENOMEM; - } - - priv = netdev_priv(netdev); - - priv->udev = usbdev; - priv->netdev = netdev; - - priv->can.state = CAN_STATE_STOPPED; - priv->can.clock.freq = USB_8DEV_ABP_CLOCK; - priv->can.bittiming_const = &usb_8dev_bittiming_const; - priv->can.do_set_mode = usb_8dev_set_mode; - priv->can.do_get_berr_counter = usb_8dev_get_berr_counter; - priv->can.ctrlmode_supported = CAN_CTRLMODE_LOOPBACK | - CAN_CTRLMODE_LISTENONLY | - CAN_CTRLMODE_ONE_SHOT; - - netdev->netdev_ops = &usb_8dev_netdev_ops; - - netdev->flags |= IFF_ECHO; /* we support local echo */ - - init_usb_anchor(&priv->rx_submitted); - - init_usb_anchor(&priv->tx_submitted); - atomic_set(&priv->active_tx_urbs, 0); - - for (i = 0; i < MAX_TX_URBS; i++) - priv->tx_contexts[i].echo_index = MAX_TX_URBS; - - priv->cmd_msg_buffer = kzalloc(sizeof(struct usb_8dev_cmd_msg), - GFP_KERNEL); - if (!priv->cmd_msg_buffer) { - netdev_err(netdev, "Couldn't alloc Tx buffer\n"); - goto cleanup_candev; - } - - usb_set_intfdata(intf, priv); - - SET_NETDEV_DEV(netdev, &intf->dev); - - mutex_init(&priv->usb_8dev_cmd_lock); - - err = register_candev(netdev); - if (err) { - netdev_err(netdev, - "couldn't register CAN device: %d\n", err); - goto cleanup_cmd_msg_buffer; - } - - err = usb_8dev_cmd_version(priv, &version); - if (err) { - netdev_err(netdev, "can't get firmware version\n"); - goto cleanup_cmd_msg_buffer; - } else { - netdev_info(netdev, - "firmware: %d.%d, hardware: %d.%d\n", - (version>>24) & 0xff, (version>>16) & 0xff, - (version>>8) & 0xff, version & 0xff); - } - - devm_can_led_init(netdev); - - return 0; - -cleanup_cmd_msg_buffer: - kfree(priv->cmd_msg_buffer); - -cleanup_candev: - free_candev(netdev); - - return err; - -} - -/* Called by the usb core when driver is unloaded or device is removed */ -static void usb_8dev_disconnect(struct usb_interface *intf) -{ - struct usb_8dev_priv *priv = usb_get_intfdata(intf); - - usb_set_intfdata(intf, NULL); - - if (priv) { - netdev_info(priv->netdev, "device disconnected\n"); - - unregister_netdev(priv->netdev); - free_candev(priv->netdev); - - unlink_all_urbs(priv); - } - -} - -static struct usb_driver usb_8dev_driver = { - .name = "usb_8dev", - .probe = usb_8dev_probe, - .disconnect = usb_8dev_disconnect, - .id_table = usb_8dev_table, -}; - -module_usb_driver(usb_8dev_driver); - -MODULE_AUTHOR("Bernd Krumboeck "); -MODULE_DESCRIPTION("CAN driver for 8 devices USB2CAN interfaces"); -MODULE_LICENSE("GPL v2"); diff --git a/trunk/drivers/net/ethernet/intel/e1000e/phy.c b/trunk/drivers/net/ethernet/intel/e1000e/phy.c index 44fb432f3c10..73d7813b98af 100644 --- a/trunk/drivers/net/ethernet/intel/e1000e/phy.c +++ b/trunk/drivers/net/ethernet/intel/e1000e/phy.c @@ -30,7 +30,6 @@ static s32 e1000_get_phy_cfg_done(struct e1000_hw *hw); static s32 e1000_phy_force_speed_duplex(struct e1000_hw *hw); -static s32 e1000_set_d0_lplu_state(struct e1000_hw *hw, bool active); static s32 e1000_wait_autoneg(struct e1000_hw *hw); static s32 e1000_access_phy_wakeup_reg_bm(struct e1000_hw *hw, u32 offset, u16 *data, bool read, bool page_set); @@ -894,10 +893,12 @@ s32 e1000e_copper_link_setup_igp(struct e1000_hw *hw) msleep(100); /* disable lplu d0 during driver init */ - ret_val = e1000_set_d0_lplu_state(hw, false); - if (ret_val) { - e_dbg("Error Disabling LPLU D0\n"); - return ret_val; + if (hw->phy.ops.set_d0_lplu_state) { + ret_val = hw->phy.ops.set_d0_lplu_state(hw, false); + if (ret_val) { + e_dbg("Error Disabling LPLU D0\n"); + return ret_val; + } } /* Configure mdi-mdix settings */ ret_val = e1e_rphy(hw, IGP01E1000_PHY_PORT_CTRL, &data); @@ -2819,28 +2820,6 @@ s32 e1000e_commit_phy(struct e1000_hw *hw) return 0; } -/** - * e1000_set_d0_lplu_state - Sets low power link up state for D0 - * @hw: pointer to the HW structure - * @active: boolean used to enable/disable lplu - * - * Success returns 0, Failure returns 1 - * - * The low power link up (lplu) state is set to the power management level D0 - * and SmartSpeed is disabled when active is true, else clear lplu for D0 - * and enable Smartspeed. LPLU and Smartspeed are mutually exclusive. LPLU - * is used during Dx states where the power conservation is most important. - * During driver activity, SmartSpeed should be enabled so performance is - * maintained. This is a function pointer entry point called by drivers. - **/ -static s32 e1000_set_d0_lplu_state(struct e1000_hw *hw, bool active) -{ - if (hw->phy.ops.set_d0_lplu_state) - return hw->phy.ops.set_d0_lplu_state(hw, active); - - return 0; -} - /** * __e1000_read_phy_reg_hv - Read HV PHY register * @hw: pointer to the HW structure diff --git a/trunk/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/trunk/drivers/net/ethernet/mellanox/mlx4/en_netdev.c index 9c42812d2f6b..b4675138533a 100644 --- a/trunk/drivers/net/ethernet/mellanox/mlx4/en_netdev.c +++ b/trunk/drivers/net/ethernet/mellanox/mlx4/en_netdev.c @@ -767,9 +767,9 @@ static void mlx4_en_do_set_multicast(struct work_struct *work) /* Update multicast list - we cache all addresses so they won't * change while HW is updated holding the command semaphor */ - netif_addr_lock_bh(dev); + netif_tx_lock_bh(dev); mlx4_en_cache_mclist(dev); - netif_addr_unlock_bh(dev); + netif_tx_unlock_bh(dev); list_for_each_entry(mclist, &priv->mc_list, list) { mcast_addr = mlx4_en_mac_to_u64(mclist->addr); mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, @@ -977,12 +977,12 @@ static void mlx4_en_do_get_stats(struct work_struct *work) struct mlx4_en_dev *mdev = priv->mdev; int err; + err = mlx4_en_DUMP_ETH_STATS(mdev, priv->port, 0); + if (err) + en_dbg(HW, priv, "Could not update stats\n"); + mutex_lock(&mdev->state_lock); if (mdev->device_up) { - err = mlx4_en_DUMP_ETH_STATS(mdev, priv->port, 0); - if (err) - en_dbg(HW, priv, "Could not update stats\n"); - if (priv->port_up) mlx4_en_auto_moderation(priv); @@ -1167,6 +1167,15 @@ int mlx4_en_start_port(struct net_device *dev) /* Must redo promiscuous mode setup. */ priv->flags &= ~(MLX4_EN_FLAG_PROMISC | MLX4_EN_FLAG_MC_PROMISC); + if (mdev->dev->caps.steering_mode == + MLX4_STEERING_MODE_DEVICE_MANAGED) { + mlx4_flow_steer_promisc_remove(mdev->dev, + priv->port, + MLX4_FS_PROMISC_UPLINK); + mlx4_flow_steer_promisc_remove(mdev->dev, + priv->port, + MLX4_FS_PROMISC_ALL_MULTI); + } /* Schedule multicast task to populate multicast list */ queue_work(mdev->workqueue, &priv->mcast_task); @@ -1218,32 +1227,6 @@ void mlx4_en_stop_port(struct net_device *dev) /* Set port as not active */ priv->port_up = false; - /* Promsicuous mode */ - if (mdev->dev->caps.steering_mode == - MLX4_STEERING_MODE_DEVICE_MANAGED) { - priv->flags &= ~(MLX4_EN_FLAG_PROMISC | - MLX4_EN_FLAG_MC_PROMISC); - mlx4_flow_steer_promisc_remove(mdev->dev, - priv->port, - MLX4_FS_PROMISC_UPLINK); - mlx4_flow_steer_promisc_remove(mdev->dev, - priv->port, - MLX4_FS_PROMISC_ALL_MULTI); - } else if (priv->flags & MLX4_EN_FLAG_PROMISC) { - priv->flags &= ~MLX4_EN_FLAG_PROMISC; - - /* Disable promiscouos mode */ - mlx4_unicast_promisc_remove(mdev->dev, priv->base_qpn, - priv->port); - - /* Disable Multicast promisc */ - if (priv->flags & MLX4_EN_FLAG_MC_PROMISC) { - mlx4_multicast_promisc_remove(mdev->dev, priv->base_qpn, - priv->port); - priv->flags &= ~MLX4_EN_FLAG_MC_PROMISC; - } - } - /* Detach All multicasts */ memset(&mc_list[10], 0xff, ETH_ALEN); mc_list[5] = priv->port; /* needed for B0 steering support */ @@ -1454,6 +1437,9 @@ int mlx4_en_alloc_resources(struct mlx4_en_priv *priv) priv->dev->rx_cpu_rmap = alloc_irq_cpu_rmap(priv->rx_ring_num); if (!priv->dev->rx_cpu_rmap) goto err; + + INIT_LIST_HEAD(&priv->filters); + spin_lock_init(&priv->filters_lock); #endif return 0; @@ -1648,11 +1634,6 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, if (err) goto out; -#ifdef CONFIG_RFS_ACCEL - INIT_LIST_HEAD(&priv->filters); - spin_lock_init(&priv->filters_lock); -#endif - /* Allocate page for receive rings */ err = mlx4_alloc_hwq_res(mdev->dev, &priv->res, MLX4_EN_PAGE_SIZE, MLX4_EN_PAGE_SIZE); diff --git a/trunk/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/trunk/drivers/net/ethernet/mellanox/mlx4/en_tx.c index 3c5ffd2f5c6f..16af338880c3 100644 --- a/trunk/drivers/net/ethernet/mellanox/mlx4/en_tx.c +++ b/trunk/drivers/net/ethernet/mellanox/mlx4/en_tx.c @@ -588,21 +588,7 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev) netif_tx_stop_queue(ring->tx_queue); priv->port_stats.queue_stopped++; - /* If queue was emptied after the if, and before the - * stop_queue - need to wake the queue, or else it will remain - * stopped forever. - * Need a memory barrier to make sure ring->cons was not - * updated before queue was stopped. - */ - wmb(); - - if (unlikely(((int)(ring->prod - ring->cons)) <= - ring->size - HEADROOM - MAX_DESC_TXBBS)) { - netif_tx_wake_queue(ring->tx_queue); - priv->port_stats.wake_queue++; - } else { - return NETDEV_TX_BUSY; - } + return NETDEV_TX_BUSY; } /* Track current inflight packets for performance analysis */ diff --git a/trunk/drivers/net/ethernet/mellanox/mlx4/main.c b/trunk/drivers/net/ethernet/mellanox/mlx4/main.c index 983fd3d62bce..e1bafffbc3b1 100644 --- a/trunk/drivers/net/ethernet/mellanox/mlx4/main.c +++ b/trunk/drivers/net/ethernet/mellanox/mlx4/main.c @@ -2169,8 +2169,7 @@ static int __mlx4_init_one(struct pci_dev *pdev, int pci_dev_data) dev->num_slaves = MLX4_MAX_NUM_SLAVES; else { dev->num_slaves = 0; - err = mlx4_multi_func_init(dev); - if (err) { + if (mlx4_multi_func_init(dev)) { mlx4_err(dev, "Failed to init slave mfunc" " interface, aborting.\n"); goto err_cmd; @@ -2194,8 +2193,7 @@ static int __mlx4_init_one(struct pci_dev *pdev, int pci_dev_data) /* In master functions, the communication channel must be initialized * after obtaining its address from fw */ if (mlx4_is_master(dev)) { - err = mlx4_multi_func_init(dev); - if (err) { + if (mlx4_multi_func_init(dev)) { mlx4_err(dev, "Failed to init master mfunc" "interface, aborting.\n"); goto err_close; @@ -2212,7 +2210,6 @@ static int __mlx4_init_one(struct pci_dev *pdev, int pci_dev_data) mlx4_enable_msi_x(dev); if ((mlx4_is_mfunc(dev)) && !(dev->flags & MLX4_FLAG_MSI_X)) { - err = -ENOSYS; mlx4_err(dev, "INTx is not supported in multi-function mode." " aborting.\n"); goto err_free_eq; diff --git a/trunk/drivers/net/macvtap.c b/trunk/drivers/net/macvtap.c index b181dfb3d6d6..0f0f9ce3a776 100644 --- a/trunk/drivers/net/macvtap.c +++ b/trunk/drivers/net/macvtap.c @@ -543,7 +543,6 @@ static int zerocopy_sg_from_iovec(struct sk_buff *skb, const struct iovec *from, skb->data_len += len; skb->len += len; skb->truesize += truesize; - skb_shinfo(skb)->gso_type |= SKB_GSO_SHARED_FRAG; atomic_add(truesize, &skb->sk->sk_wmem_alloc); while (len) { int off = base & ~PAGE_MASK; @@ -599,7 +598,7 @@ static int macvtap_skb_from_vnet_hdr(struct sk_buff *skb, if (vnet_hdr->gso_type != VIRTIO_NET_HDR_GSO_NONE) { skb_shinfo(skb)->gso_size = vnet_hdr->gso_size; - skb_shinfo(skb)->gso_type |= gso_type; + skb_shinfo(skb)->gso_type = gso_type; /* Header must be checked, and gso_segs computed. */ skb_shinfo(skb)->gso_type |= SKB_GSO_DODGY; diff --git a/trunk/drivers/net/tun.c b/trunk/drivers/net/tun.c index 293ce8dfc9e6..c81680dc10eb 100644 --- a/trunk/drivers/net/tun.c +++ b/trunk/drivers/net/tun.c @@ -1005,7 +1005,6 @@ static int zerocopy_sg_from_iovec(struct sk_buff *skb, const struct iovec *from, skb->data_len += len; skb->len += len; skb->truesize += truesize; - skb_shinfo(skb)->gso_type |= SKB_GSO_SHARED_FRAG; atomic_add(truesize, &skb->sk->sk_wmem_alloc); while (len) { int off = base & ~PAGE_MASK; @@ -1151,18 +1150,16 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile, } if (gso.gso_type != VIRTIO_NET_HDR_GSO_NONE) { - unsigned short gso_type = 0; - pr_debug("GSO!\n"); switch (gso.gso_type & ~VIRTIO_NET_HDR_GSO_ECN) { case VIRTIO_NET_HDR_GSO_TCPV4: - gso_type = SKB_GSO_TCPV4; + skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4; break; case VIRTIO_NET_HDR_GSO_TCPV6: - gso_type = SKB_GSO_TCPV6; + skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6; break; case VIRTIO_NET_HDR_GSO_UDP: - gso_type = SKB_GSO_UDP; + skb_shinfo(skb)->gso_type = SKB_GSO_UDP; break; default: tun->dev->stats.rx_frame_errors++; @@ -1171,10 +1168,9 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile, } if (gso.gso_type & VIRTIO_NET_HDR_GSO_ECN) - gso_type |= SKB_GSO_TCP_ECN; + skb_shinfo(skb)->gso_type |= SKB_GSO_TCP_ECN; skb_shinfo(skb)->gso_size = gso.gso_size; - skb_shinfo(skb)->gso_type |= gso_type; if (skb_shinfo(skb)->gso_size == 0) { tun->dev->stats.rx_frame_errors++; kfree_skb(skb); diff --git a/trunk/drivers/net/virtio_net.c b/trunk/drivers/net/virtio_net.c index 58914c8ea68f..701408a1ded6 100644 --- a/trunk/drivers/net/virtio_net.c +++ b/trunk/drivers/net/virtio_net.c @@ -220,7 +220,6 @@ static void set_skb_frag(struct sk_buff *skb, struct page *page, skb->len += size; skb->truesize += PAGE_SIZE; skb_shinfo(skb)->nr_frags++; - skb_shinfo(skb)->gso_type |= SKB_GSO_SHARED_FRAG; *len -= size; } @@ -380,18 +379,16 @@ static void receive_buf(struct receive_queue *rq, void *buf, unsigned int len) ntohs(skb->protocol), skb->len, skb->pkt_type); if (hdr->hdr.gso_type != VIRTIO_NET_HDR_GSO_NONE) { - unsigned short gso_type = 0; - pr_debug("GSO!\n"); switch (hdr->hdr.gso_type & ~VIRTIO_NET_HDR_GSO_ECN) { case VIRTIO_NET_HDR_GSO_TCPV4: - gso_type = SKB_GSO_TCPV4; + skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4; break; case VIRTIO_NET_HDR_GSO_UDP: - gso_type = SKB_GSO_UDP; + skb_shinfo(skb)->gso_type = SKB_GSO_UDP; break; case VIRTIO_NET_HDR_GSO_TCPV6: - gso_type = SKB_GSO_TCPV6; + skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6; break; default: net_warn_ratelimited("%s: bad gso type %u.\n", @@ -400,7 +397,7 @@ static void receive_buf(struct receive_queue *rq, void *buf, unsigned int len) } if (hdr->hdr.gso_type & VIRTIO_NET_HDR_GSO_ECN) - gso_type |= SKB_GSO_TCP_ECN; + skb_shinfo(skb)->gso_type |= SKB_GSO_TCP_ECN; skb_shinfo(skb)->gso_size = hdr->hdr.gso_size; if (skb_shinfo(skb)->gso_size == 0) { @@ -408,7 +405,6 @@ static void receive_buf(struct receive_queue *rq, void *buf, unsigned int len) goto frame_err; } - skb_shinfo(skb)->gso_type |= gso_type; /* Header must be checked, and gso_segs computed. */ skb_shinfo(skb)->gso_type |= SKB_GSO_DODGY; skb_shinfo(skb)->gso_segs = 0; diff --git a/trunk/include/linux/can/dev.h b/trunk/include/linux/can/dev.h index fb0ab651a041..2b2fc345afca 100644 --- a/trunk/include/linux/can/dev.h +++ b/trunk/include/linux/can/dev.h @@ -16,7 +16,6 @@ #include #include #include -#include /* * CAN mode @@ -53,13 +52,6 @@ struct can_priv { unsigned int echo_skb_max; struct sk_buff **echo_skb; - -#ifdef CONFIG_CAN_LEDS - struct led_trigger *tx_led_trig; - char tx_led_trig_name[CAN_LED_NAME_SZ]; - struct led_trigger *rx_led_trig; - char rx_led_trig_name[CAN_LED_NAME_SZ]; -#endif }; /* @@ -106,9 +98,6 @@ u8 can_len2dlc(u8 len); struct net_device *alloc_candev(int sizeof_priv, unsigned int echo_skb_max); void free_candev(struct net_device *dev); -/* a candev safe wrapper around netdev_priv */ -struct can_priv *safe_candev_priv(struct net_device *dev); - int open_candev(struct net_device *dev); void close_candev(struct net_device *dev); diff --git a/trunk/include/linux/can/led.h b/trunk/include/linux/can/led.h deleted file mode 100644 index 9c1167baf273..000000000000 --- a/trunk/include/linux/can/led.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2012, Fabio Baltieri - * - * 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. - */ - -#ifndef CAN_LED_H -#define CAN_LED_H - -#include -#include - -enum can_led_event { - CAN_LED_EVENT_OPEN, - CAN_LED_EVENT_STOP, - CAN_LED_EVENT_TX, - CAN_LED_EVENT_RX, -}; - -#ifdef CONFIG_CAN_LEDS - -/* keep space for interface name + "-tx"/"-rx" suffix and null terminator */ -#define CAN_LED_NAME_SZ (IFNAMSIZ + 4) - -void can_led_event(struct net_device *netdev, enum can_led_event event); -void devm_can_led_init(struct net_device *netdev); -int __init can_led_notifier_init(void); -void __exit can_led_notifier_exit(void); - -#else - -static inline void can_led_event(struct net_device *netdev, - enum can_led_event event) -{ -} -static inline void devm_can_led_init(struct net_device *netdev) -{ -} -static inline int can_led_notifier_init(void) -{ - return 0; -} -static inline void can_led_notifier_exit(void) -{ -} - -#endif - -#endif diff --git a/trunk/include/linux/can/skb.h b/trunk/include/linux/can/skb.h deleted file mode 100644 index 2f0543f7510c..000000000000 --- a/trunk/include/linux/can/skb.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * linux/can/skb.h - * - * Definitions for the CAN network socket buffer - * - * Copyright (C) 2012 Oliver Hartkopp - * - */ - -#ifndef CAN_SKB_H -#define CAN_SKB_H - -#include -#include - -/* - * The struct can_skb_priv is used to transport additional information along - * with the stored struct can(fd)_frame that can not be contained in existing - * struct sk_buff elements. - * N.B. that this information must not be modified in cloned CAN sk_buffs. - * To modify the CAN frame content or the struct can_skb_priv content - * skb_copy() needs to be used instead of skb_clone(). - */ - -/** - * struct can_skb_priv - private additional data inside CAN sk_buffs - * @ifindex: ifindex of the first interface the CAN frame appeared on - * @cf: align to the following CAN frame at skb->data - */ -struct can_skb_priv { - int ifindex; - struct can_frame cf[0]; -}; - -static inline struct can_skb_priv *can_skb_prv(struct sk_buff *skb) -{ - return (struct can_skb_priv *)(skb->head); -} - -static inline void can_skb_reserve(struct sk_buff *skb) -{ - skb_reserve(skb, sizeof(struct can_skb_priv)); -} - -#endif /* CAN_SKB_H */ diff --git a/trunk/include/linux/skbuff.h b/trunk/include/linux/skbuff.h index 0259b719bebf..8b2256e880e0 100644 --- a/trunk/include/linux/skbuff.h +++ b/trunk/include/linux/skbuff.h @@ -307,13 +307,6 @@ enum { SKB_GSO_TCPV6 = 1 << 4, SKB_GSO_FCOE = 1 << 5, - - /* This indicates at least one fragment might be overwritten - * (as in vmsplice(), sendfile() ...) - * If we need to compute a TX checksum, we'll need to copy - * all frags to avoid possible bad checksum - */ - SKB_GSO_SHARED_FRAG = 1 << 6, }; #if BITS_PER_LONG > 32 @@ -2207,18 +2200,6 @@ static inline int skb_linearize(struct sk_buff *skb) return skb_is_nonlinear(skb) ? __skb_linearize(skb) : 0; } -/** - * skb_has_shared_frag - can any frag be overwritten - * @skb: buffer to test - * - * Return true if the skb has at least one frag that might be modified - * by an external entity (as in vmsplice()/sendfile()) - */ -static inline bool skb_has_shared_frag(const struct sk_buff *skb) -{ - return skb_shinfo(skb)->gso_type & SKB_GSO_SHARED_FRAG; -} - /** * skb_linearize_cow - make sure skb is linear and writable * @skb: buffer to process diff --git a/trunk/include/net/dn_route.h b/trunk/include/net/dn_route.h index 2e9d317c82dc..4f7d6a182381 100644 --- a/trunk/include/net/dn_route.h +++ b/trunk/include/net/dn_route.h @@ -16,7 +16,7 @@ *******************************************************************************/ extern struct sk_buff *dn_alloc_skb(struct sock *sk, int size, gfp_t pri); -extern int dn_route_output_sock(struct dst_entry __rcu **pprt, struct flowidn *, struct sock *sk, int flags); +extern int dn_route_output_sock(struct dst_entry **pprt, struct flowidn *, struct sock *sk, int flags); extern int dn_cache_dump(struct sk_buff *skb, struct netlink_callback *cb); extern void dn_rt_cache_flush(int delay); diff --git a/trunk/include/net/sock.h b/trunk/include/net/sock.h index a340ab46b41c..581dc6bd7dc6 100644 --- a/trunk/include/net/sock.h +++ b/trunk/include/net/sock.h @@ -340,7 +340,7 @@ struct sock { #endif unsigned long sk_flags; struct dst_entry *sk_rx_dst; - struct dst_entry __rcu *sk_dst_cache; + struct dst_entry *sk_dst_cache; spinlock_t sk_dst_lock; atomic_t sk_wmem_alloc; atomic_t sk_omem_alloc; diff --git a/trunk/include/uapi/linux/can/gw.h b/trunk/include/uapi/linux/can/gw.h index ae07bec74f4b..8e1db18c3cb6 100644 --- a/trunk/include/uapi/linux/can/gw.h +++ b/trunk/include/uapi/linux/can/gw.h @@ -44,7 +44,6 @@ enum { CGW_SRC_IF, /* ifindex of source network interface */ CGW_DST_IF, /* ifindex of destination network interface */ CGW_FILTER, /* specify struct can_filter on source CAN device */ - CGW_DELETED, /* number of deleted CAN frames (see max_hops param) */ __CGW_MAX }; @@ -52,7 +51,6 @@ enum { #define CGW_FLAGS_CAN_ECHO 0x01 #define CGW_FLAGS_CAN_SRC_TSTAMP 0x02 -#define CGW_FLAGS_CAN_IIF_TX_OK 0x04 #define CGW_MOD_FUNCS 4 /* AND OR XOR SET */ diff --git a/trunk/net/can/Kconfig b/trunk/net/can/Kconfig index a15c0e0d1fc7..03200699d274 100644 --- a/trunk/net/can/Kconfig +++ b/trunk/net/can/Kconfig @@ -16,11 +16,10 @@ menuconfig CAN If you want CAN support you should say Y here and also to the specific driver for your controller(s) below. -if CAN - config CAN_RAW tristate "Raw CAN Protocol (raw access with CAN-ID filtering)" - default y + depends on CAN + default N ---help--- The raw CAN protocol option offers access to the CAN bus via the BSD socket API. You probably want to use the raw socket in @@ -30,7 +29,8 @@ config CAN_RAW config CAN_BCM tristate "Broadcast Manager CAN Protocol (with content filtering)" - default y + depends on CAN + default N ---help--- The Broadcast Manager offers content filtering, timeout monitoring, sending of RTR frames, and cyclic CAN messages without permanent user @@ -42,7 +42,8 @@ config CAN_BCM config CAN_GW tristate "CAN Gateway/Router (with netlink configuration)" - default y + depends on CAN + default N ---help--- The CAN Gateway/Router is used to route (and modify) CAN frames. It is based on the PF_CAN core infrastructure for msg filtering and @@ -52,5 +53,3 @@ config CAN_GW by the netlink configuration interface known e.g. from iptables. source "drivers/net/can/Kconfig" - -endif diff --git a/trunk/net/can/bcm.c b/trunk/net/can/bcm.c index 28e12d18f0f1..969b7cdff59d 100644 --- a/trunk/net/can/bcm.c +++ b/trunk/net/can/bcm.c @@ -54,7 +54,6 @@ #include #include #include -#include #include #include #include @@ -257,13 +256,10 @@ static void bcm_can_tx(struct bcm_op *op) return; } - skb = alloc_skb(CFSIZ + sizeof(struct can_skb_priv), gfp_any()); + skb = alloc_skb(CFSIZ, gfp_any()); if (!skb) goto out; - can_skb_reserve(skb); - can_skb_prv(skb)->ifindex = dev->ifindex; - memcpy(skb_put(skb, CFSIZ), cf, CFSIZ); /* send with loopback */ @@ -1203,12 +1199,11 @@ static int bcm_tx_send(struct msghdr *msg, int ifindex, struct sock *sk) if (!ifindex) return -ENODEV; - skb = alloc_skb(CFSIZ + sizeof(struct can_skb_priv), GFP_KERNEL); + skb = alloc_skb(CFSIZ, GFP_KERNEL); + if (!skb) return -ENOMEM; - can_skb_reserve(skb); - err = memcpy_fromiovec(skb_put(skb, CFSIZ), msg->msg_iov, CFSIZ); if (err < 0) { kfree_skb(skb); @@ -1221,7 +1216,6 @@ static int bcm_tx_send(struct msghdr *msg, int ifindex, struct sock *sk) return -ENODEV; } - can_skb_prv(skb)->ifindex = dev->ifindex; skb->dev = dev; skb->sk = sk; err = can_send(skb, 1); /* send with loopback */ diff --git a/trunk/net/can/gw.c b/trunk/net/can/gw.c index c185fcd5e828..574dda78eb0f 100644 --- a/trunk/net/can/gw.c +++ b/trunk/net/can/gw.c @@ -42,7 +42,6 @@ #include #include #include -#include #include #include #include @@ -53,31 +52,19 @@ #include #include #include -#include #include #include #include #include -#define CAN_GW_VERSION "20130117" -#define CAN_GW_NAME "can-gw" +#define CAN_GW_VERSION "20101209" +static __initconst const char banner[] = + KERN_INFO "can: netlink gateway (rev " CAN_GW_VERSION ")\n"; MODULE_DESCRIPTION("PF_CAN netlink gateway"); MODULE_LICENSE("Dual BSD/GPL"); MODULE_AUTHOR("Oliver Hartkopp "); -MODULE_ALIAS(CAN_GW_NAME); - -#define CGW_MIN_HOPS 1 -#define CGW_MAX_HOPS 6 -#define CGW_DEFAULT_HOPS 1 - -static unsigned int max_hops __read_mostly = CGW_DEFAULT_HOPS; -module_param(max_hops, uint, S_IRUGO); -MODULE_PARM_DESC(max_hops, - "maximum " CAN_GW_NAME " routing hops for CAN frames " - "(valid values: " __stringify(CGW_MIN_HOPS) "-" - __stringify(CGW_MAX_HOPS) " hops, " - "default: " __stringify(CGW_DEFAULT_HOPS) ")"); +MODULE_ALIAS("can-gw"); static HLIST_HEAD(cgw_list); static struct notifier_block notifier; @@ -131,7 +118,6 @@ struct cgw_job { struct rcu_head rcu; u32 handled_frames; u32 dropped_frames; - u32 deleted_frames; struct cf_mod mod; union { /* CAN frame data source */ @@ -352,38 +338,15 @@ static void can_can_gw_rcv(struct sk_buff *skb, void *data) struct sk_buff *nskb; int modidx = 0; - /* - * Do not handle CAN frames routed more than 'max_hops' times. - * In general we should never catch this delimiter which is intended - * to cover a misconfiguration protection (e.g. circular CAN routes). - * - * The Controller Area Network controllers only accept CAN frames with - * correct CRCs - which are not visible in the controller registers. - * According to skbuff.h documentation the csum_start element for IP - * checksums is undefined/unsued when ip_summed == CHECKSUM_UNNECESSARY. - * Only CAN skbs can be processed here which already have this property. - */ - -#define cgw_hops(skb) ((skb)->csum_start) - - BUG_ON(skb->ip_summed != CHECKSUM_UNNECESSARY); - - if (cgw_hops(skb) >= max_hops) { - /* indicate deleted frames due to misconfiguration */ - gwj->deleted_frames++; + /* do not handle already routed frames - see comment below */ + if (skb_mac_header_was_set(skb)) return; - } if (!(gwj->dst.dev->flags & IFF_UP)) { gwj->dropped_frames++; return; } - /* is sending the skb back to the incoming interface not allowed? */ - if (!(gwj->flags & CGW_FLAGS_CAN_IIF_TX_OK) && - can_skb_prv(skb)->ifindex == gwj->dst.dev->ifindex) - return; - /* * clone the given skb, which has not been done in can_rcv() * @@ -400,8 +363,15 @@ static void can_can_gw_rcv(struct sk_buff *skb, void *data) return; } - /* put the incremented hop counter in the cloned skb */ - cgw_hops(nskb) = cgw_hops(skb) + 1; + /* + * Mark routed frames by setting some mac header length which is + * not relevant for the CAN frames located in the skb->data section. + * + * As dev->header_ops is not set in CAN netdevices no one is ever + * accessing the various header offsets in the CAN skbuffs anyway. + * E.g. using the packet socket to read CAN frames is still working. + */ + skb_set_mac_header(nskb, 8); nskb->dev = gwj->dst.dev; /* pointer to modifiable CAN frame */ @@ -502,11 +472,6 @@ static int cgw_put_job(struct sk_buff *skb, struct cgw_job *gwj, int type, goto cancel; } - if (gwj->deleted_frames) { - if (nla_put_u32(skb, CGW_DELETED, gwj->deleted_frames) < 0) - goto cancel; - } - /* check non default settings of attributes */ if (gwj->mod.modtype.and) { @@ -806,7 +771,6 @@ static int cgw_create_job(struct sk_buff *skb, struct nlmsghdr *nlh, gwj->handled_frames = 0; gwj->dropped_frames = 0; - gwj->deleted_frames = 0; gwj->flags = r->flags; gwj->gwtype = r->gwtype; @@ -931,11 +895,7 @@ static int cgw_remove_job(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) static __init int cgw_module_init(void) { - /* sanitize given module parameter */ - max_hops = clamp_t(unsigned int, max_hops, CGW_MIN_HOPS, CGW_MAX_HOPS); - - pr_info("can: netlink gateway (rev " CAN_GW_VERSION ") max_hops=%d\n", - max_hops); + printk(banner); cgw_cache = kmem_cache_create("can_gw", sizeof(struct cgw_job), 0, 0, NULL); diff --git a/trunk/net/can/raw.c b/trunk/net/can/raw.c index c1764e41ddaf..5b0e3e330d97 100644 --- a/trunk/net/can/raw.c +++ b/trunk/net/can/raw.c @@ -50,7 +50,6 @@ #include #include #include -#include #include #include #include @@ -700,14 +699,11 @@ static int raw_sendmsg(struct kiocb *iocb, struct socket *sock, if (!dev) return -ENXIO; - skb = sock_alloc_send_skb(sk, size + sizeof(struct can_skb_priv), - msg->msg_flags & MSG_DONTWAIT, &err); + skb = sock_alloc_send_skb(sk, size, msg->msg_flags & MSG_DONTWAIT, + &err); if (!skb) goto put_dev; - can_skb_reserve(skb); - can_skb_prv(skb)->ifindex = dev->ifindex; - err = memcpy_fromiovec(skb_put(skb, size), msg->msg_iov, size); if (err < 0) goto free_skb; diff --git a/trunk/net/core/dev.c b/trunk/net/core/dev.c index a83375d3af72..c69cd8721b28 100644 --- a/trunk/net/core/dev.c +++ b/trunk/net/core/dev.c @@ -2271,15 +2271,6 @@ int skb_checksum_help(struct sk_buff *skb) return -EINVAL; } - /* Before computing a checksum, we should make sure no frag could - * be modified by an external entity : checksum could be wrong. - */ - if (skb_has_shared_frag(skb)) { - ret = __skb_linearize(skb); - if (ret) - goto out; - } - offset = skb_checksum_start_offset(skb); BUG_ON(offset >= skb_headlen(skb)); csum = skb_checksum(skb, offset, skb->len - offset, 0); diff --git a/trunk/net/core/skbuff.c b/trunk/net/core/skbuff.c index bddc1dd2e7f2..2568c449fe36 100644 --- a/trunk/net/core/skbuff.c +++ b/trunk/net/core/skbuff.c @@ -2340,8 +2340,6 @@ void skb_split(struct sk_buff *skb, struct sk_buff *skb1, const u32 len) { int pos = skb_headlen(skb); - skb_shinfo(skb1)->gso_type = skb_shinfo(skb)->gso_type; - if (len < pos) /* Split line is inside header. */ skb_split_inside_header(skb, skb1, len, pos); else /* Second chunk has no header, nothing to copy. */ @@ -2847,8 +2845,6 @@ struct sk_buff *skb_segment(struct sk_buff *skb, netdev_features_t features) skb_copy_from_linear_data_offset(skb, offset, skb_put(nskb, hsize), hsize); - skb_shinfo(nskb)->gso_type = skb_shinfo(skb)->gso_type; - while (pos < offset + len && i < nfrags) { *frag = skb_shinfo(skb)->frags[i]; __skb_frag_ref(frag); diff --git a/trunk/net/decnet/af_decnet.c b/trunk/net/decnet/af_decnet.c index 64d9843f9e04..307c322d53bb 100644 --- a/trunk/net/decnet/af_decnet.c +++ b/trunk/net/decnet/af_decnet.c @@ -909,7 +909,6 @@ static int __dn_connect(struct sock *sk, struct sockaddr_dn *addr, int addrlen, struct dn_scp *scp = DN_SK(sk); int err = -EISCONN; struct flowidn fld; - struct dst_entry *dst; if (sock->state == SS_CONNECTED) goto out; @@ -956,11 +955,10 @@ static int __dn_connect(struct sock *sk, struct sockaddr_dn *addr, int addrlen, fld.flowidn_proto = DNPROTO_NSP; if (dn_route_output_sock(&sk->sk_dst_cache, &fld, sk, flags) < 0) goto out; - dst = __sk_dst_get(sk); - sk->sk_route_caps = dst->dev->features; + sk->sk_route_caps = sk->sk_dst_cache->dev->features; sock->state = SS_CONNECTING; scp->state = DN_CI; - scp->segsize_loc = dst_metric_advmss(dst); + scp->segsize_loc = dst_metric_advmss(sk->sk_dst_cache); dn_nsp_send_conninit(sk, NSP_CI); err = -EINPROGRESS; diff --git a/trunk/net/decnet/dn_nsp_out.c b/trunk/net/decnet/dn_nsp_out.c index 1aaa51ebbda6..8a96047c7c94 100644 --- a/trunk/net/decnet/dn_nsp_out.c +++ b/trunk/net/decnet/dn_nsp_out.c @@ -598,7 +598,7 @@ void dn_nsp_send_disc(struct sock *sk, unsigned char msgflg, if (reason == 0) reason = le16_to_cpu(scp->discdata_out.opt_status); - dn_nsp_do_disc(sk, msgflg, reason, gfp, __sk_dst_get(sk), ddl, + dn_nsp_do_disc(sk, msgflg, reason, gfp, sk->sk_dst_cache, ddl, scp->discdata_out.opt_data, scp->addrrem, scp->addrloc); } diff --git a/trunk/net/decnet/dn_route.c b/trunk/net/decnet/dn_route.c index 1550028fcd8e..b57419cc41a4 100644 --- a/trunk/net/decnet/dn_route.c +++ b/trunk/net/decnet/dn_route.c @@ -1282,7 +1282,7 @@ static int dn_route_output_key(struct dst_entry **pprt, struct flowidn *flp, int return err; } -int dn_route_output_sock(struct dst_entry __rcu **pprt, struct flowidn *fl, struct sock *sk, int flags) +int dn_route_output_sock(struct dst_entry **pprt, struct flowidn *fl, struct sock *sk, int flags) { int err; diff --git a/trunk/net/ipv4/af_inet.c b/trunk/net/ipv4/af_inet.c index 49ddca31c4da..4b7053919976 100644 --- a/trunk/net/ipv4/af_inet.c +++ b/trunk/net/ipv4/af_inet.c @@ -1306,7 +1306,6 @@ static struct sk_buff *inet_gso_segment(struct sk_buff *skb, SKB_GSO_UDP | SKB_GSO_DODGY | SKB_GSO_TCP_ECN | - SKB_GSO_SHARED_FRAG | 0))) goto out; diff --git a/trunk/net/ipv4/ip_gre.c b/trunk/net/ipv4/ip_gre.c index af6be70821c4..303012adf9e6 100644 --- a/trunk/net/ipv4/ip_gre.c +++ b/trunk/net/ipv4/ip_gre.c @@ -738,7 +738,7 @@ static int ipgre_rcv(struct sk_buff *skb) static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) { struct ip_tunnel *tunnel = netdev_priv(dev); - const struct iphdr *old_iph; + const struct iphdr *old_iph = ip_hdr(skb); const struct iphdr *tiph; struct flowi4 fl4; u8 tos; @@ -756,8 +756,6 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev skb_checksum_help(skb)) goto tx_error; - old_iph = ip_hdr(skb); - if (dev->type == ARPHRD_ETHER) IPCB(skb)->flags = 0; diff --git a/trunk/net/ipv4/ipip.c b/trunk/net/ipv4/ipip.c index 8f024d41eefa..191fc24a745a 100644 --- a/trunk/net/ipv4/ipip.c +++ b/trunk/net/ipv4/ipip.c @@ -472,7 +472,7 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) __be16 df = tiph->frag_off; struct rtable *rt; /* Route to the other host */ struct net_device *tdev; /* Device to other host */ - const struct iphdr *old_iph; + const struct iphdr *old_iph = ip_hdr(skb); struct iphdr *iph; /* Our new IP header */ unsigned int max_headroom; /* The extra header space needed */ __be32 dst = tiph->daddr; @@ -486,8 +486,6 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) skb_checksum_help(skb)) goto tx_error; - old_iph = ip_hdr(skb); - if (tos & 1) tos = old_iph->tos; diff --git a/trunk/net/ipv4/tcp.c b/trunk/net/ipv4/tcp.c index 3ec1f69c5ceb..52271947a471 100644 --- a/trunk/net/ipv4/tcp.c +++ b/trunk/net/ipv4/tcp.c @@ -896,8 +896,6 @@ static ssize_t do_tcp_sendpages(struct sock *sk, struct page *page, int offset, skb_fill_page_desc(skb, i, page, offset, copy); } - skb_shinfo(skb)->gso_type |= SKB_GSO_SHARED_FRAG; - skb->len += copy; skb->data_len += copy; skb->truesize += copy; @@ -3034,7 +3032,6 @@ struct sk_buff *tcp_tso_segment(struct sk_buff *skb, SKB_GSO_DODGY | SKB_GSO_TCP_ECN | SKB_GSO_TCPV6 | - SKB_GSO_SHARED_FRAG | 0) || !(type & (SKB_GSO_TCPV4 | SKB_GSO_TCPV6)))) goto out; diff --git a/trunk/net/ipv4/tcp_input.c b/trunk/net/ipv4/tcp_input.c index 492c7cfe1453..0905997e5873 100644 --- a/trunk/net/ipv4/tcp_input.c +++ b/trunk/net/ipv4/tcp_input.c @@ -1240,13 +1240,13 @@ static bool tcp_shifted_skb(struct sock *sk, struct sk_buff *skb, */ if (!skb_shinfo(prev)->gso_size) { skb_shinfo(prev)->gso_size = mss; - skb_shinfo(prev)->gso_type |= sk->sk_gso_type; + skb_shinfo(prev)->gso_type = sk->sk_gso_type; } /* CHECKME: To clear or not to clear? Mimics normal skb currently */ if (skb_shinfo(skb)->gso_segs <= 1) { skb_shinfo(skb)->gso_size = 0; - skb_shinfo(skb)->gso_type &= SKB_GSO_SHARED_FRAG; + skb_shinfo(skb)->gso_type = 0; } /* Difference in this won't matter, both ACKed by the same cumul. ACK */ diff --git a/trunk/net/ipv4/tcp_output.c b/trunk/net/ipv4/tcp_output.c index 367e2ec01da1..667a6adfccf8 100644 --- a/trunk/net/ipv4/tcp_output.c +++ b/trunk/net/ipv4/tcp_output.c @@ -1133,7 +1133,6 @@ static void tcp_queue_skb(struct sock *sk, struct sk_buff *skb) static void tcp_set_skb_tso_segs(const struct sock *sk, struct sk_buff *skb, unsigned int mss_now) { - skb_shinfo(skb)->gso_type &= SKB_GSO_SHARED_FRAG; if (skb->len <= mss_now || !sk_can_gso(sk) || skb->ip_summed == CHECKSUM_NONE) { /* Avoid the costly divide in the normal @@ -1141,10 +1140,11 @@ static void tcp_set_skb_tso_segs(const struct sock *sk, struct sk_buff *skb, */ skb_shinfo(skb)->gso_segs = 1; skb_shinfo(skb)->gso_size = 0; + skb_shinfo(skb)->gso_type = 0; } else { skb_shinfo(skb)->gso_segs = DIV_ROUND_UP(skb->len, mss_now); skb_shinfo(skb)->gso_size = mss_now; - skb_shinfo(skb)->gso_type |= sk->sk_gso_type; + skb_shinfo(skb)->gso_type = sk->sk_gso_type; } } diff --git a/trunk/net/ipv6/ip6_offload.c b/trunk/net/ipv6/ip6_offload.c index d141fc32a2ea..f26f0da7f095 100644 --- a/trunk/net/ipv6/ip6_offload.c +++ b/trunk/net/ipv6/ip6_offload.c @@ -100,7 +100,6 @@ static struct sk_buff *ipv6_gso_segment(struct sk_buff *skb, SKB_GSO_DODGY | SKB_GSO_TCP_ECN | SKB_GSO_TCPV6 | - SKB_GSO_SHARED_FRAG | 0))) goto out;