diff --git a/[refs] b/[refs] index 81e7ebf0eba9..1d4fded489e2 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 127a479442790d175811547dd95241dce9812ec5 +refs/heads/master: ae1c07a6b7ced6c0c94c99e3b53f4e7856fa8bff diff --git a/trunk/Documentation/infiniband/ipoib.txt b/trunk/Documentation/infiniband/ipoib.txt index f2cfe265e836..64eeb55d0c09 100644 --- a/trunk/Documentation/infiniband/ipoib.txt +++ b/trunk/Documentation/infiniband/ipoib.txt @@ -24,9 +24,6 @@ Partitions and P_Keys The P_Key for any interface is given by the "pkey" file, and the main interface for a subinterface is in "parent." - Child interface create/delete can also be done using IPoIB's - rtnl_link_ops, where childs created using either way behave the same. - Datagram vs Connected modes The IPoIB driver supports two modes of operation: datagram and diff --git a/trunk/drivers/infiniband/ulp/ipoib/Makefile b/trunk/drivers/infiniband/ulp/ipoib/Makefile index e5430dd50764..3090100f0de7 100644 --- a/trunk/drivers/infiniband/ulp/ipoib/Makefile +++ b/trunk/drivers/infiniband/ulp/ipoib/Makefile @@ -5,8 +5,7 @@ ib_ipoib-y := ipoib_main.o \ ipoib_multicast.o \ ipoib_verbs.o \ ipoib_vlan.o \ - ipoib_ethtool.o \ - ipoib_netlink.o + ipoib_ethtool.o ib_ipoib-$(CONFIG_INFINIBAND_IPOIB_CM) += ipoib_cm.o ib_ipoib-$(CONFIG_INFINIBAND_IPOIB_DEBUG) += ipoib_fs.o diff --git a/trunk/drivers/infiniband/ulp/ipoib/ipoib.h b/trunk/drivers/infiniband/ulp/ipoib/ipoib.h index 381f51b2ed61..ca43901ed861 100644 --- a/trunk/drivers/infiniband/ulp/ipoib/ipoib.h +++ b/trunk/drivers/infiniband/ulp/ipoib/ipoib.h @@ -104,10 +104,6 @@ enum { MAX_SEND_CQE = 16, IPOIB_CM_COPYBREAK = 256, - - IPOIB_NON_CHILD = 0, - IPOIB_LEGACY_CHILD = 1, - IPOIB_RTNL_CHILD = 2, }; #define IPOIB_OP_RECV (1ul << 31) @@ -354,7 +350,6 @@ struct ipoib_dev_priv { struct net_device *parent; struct list_head child_intfs; struct list_head list; - int child_type; #ifdef CONFIG_INFINIBAND_IPOIB_CM struct ipoib_cm_dev_priv cm; @@ -514,14 +509,6 @@ void ipoib_event(struct ib_event_handler *handler, int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey); int ipoib_vlan_delete(struct net_device *pdev, unsigned short pkey); -int __ipoib_vlan_add(struct ipoib_dev_priv *ppriv, struct ipoib_dev_priv *priv, - u16 pkey, int child_type); - -int __init ipoib_netlink_init(void); -void __exit ipoib_netlink_fini(void); - -void ipoib_setup(struct net_device *dev); - void ipoib_pkey_poll(struct work_struct *work); int ipoib_pkey_dev_delay_open(struct net_device *dev); void ipoib_drain_cq(struct net_device *dev); diff --git a/trunk/drivers/infiniband/ulp/ipoib/ipoib_main.c b/trunk/drivers/infiniband/ulp/ipoib/ipoib_main.c index b3e97096c446..3e2085a3ee47 100644 --- a/trunk/drivers/infiniband/ulp/ipoib/ipoib_main.c +++ b/trunk/drivers/infiniband/ulp/ipoib/ipoib_main.c @@ -173,11 +173,6 @@ static int ipoib_stop(struct net_device *dev) return 0; } -static void ipoib_uninit(struct net_device *dev) -{ - ipoib_dev_cleanup(dev); -} - static netdev_features_t ipoib_fix_features(struct net_device *dev, netdev_features_t features) { struct ipoib_dev_priv *priv = netdev_priv(dev); @@ -1267,9 +1262,6 @@ int ipoib_dev_init(struct net_device *dev, struct ib_device *ca, int port) void ipoib_dev_cleanup(struct net_device *dev) { struct ipoib_dev_priv *priv = netdev_priv(dev), *cpriv, *tcpriv; - LIST_HEAD(head); - - ASSERT_RTNL(); ipoib_delete_debug_files(dev); @@ -1278,9 +1270,10 @@ void ipoib_dev_cleanup(struct net_device *dev) /* Stop GC on child */ set_bit(IPOIB_STOP_NEIGH_GC, &cpriv->flags); cancel_delayed_work(&cpriv->neigh_reap_task); - unregister_netdevice_queue(cpriv->dev, &head); + unregister_netdev(cpriv->dev); + ipoib_dev_cleanup(cpriv->dev); + free_netdev(cpriv->dev); } - unregister_netdevice_many(&head); ipoib_ib_dev_cleanup(dev); @@ -1298,7 +1291,6 @@ static const struct header_ops ipoib_header_ops = { }; static const struct net_device_ops ipoib_netdev_ops = { - .ndo_uninit = ipoib_uninit, .ndo_open = ipoib_open, .ndo_stop = ipoib_stop, .ndo_change_mtu = ipoib_change_mtu, @@ -1308,7 +1300,7 @@ static const struct net_device_ops ipoib_netdev_ops = { .ndo_set_rx_mode = ipoib_set_mcast_list, }; -void ipoib_setup(struct net_device *dev) +static void ipoib_setup(struct net_device *dev) { struct ipoib_dev_priv *priv = netdev_priv(dev); @@ -1670,6 +1662,7 @@ static void ipoib_remove_one(struct ib_device *device) flush_workqueue(ipoib_workqueue); unregister_netdev(priv->dev); + ipoib_dev_cleanup(priv->dev); free_netdev(priv->dev); } @@ -1721,15 +1714,8 @@ static int __init ipoib_init_module(void) if (ret) goto err_sa; - ret = ipoib_netlink_init(); - if (ret) - goto err_client; - return 0; -err_client: - ib_unregister_client(&ipoib_client); - err_sa: ib_sa_unregister_client(&ipoib_sa_client); destroy_workqueue(ipoib_workqueue); @@ -1742,7 +1728,6 @@ static int __init ipoib_init_module(void) static void __exit ipoib_cleanup_module(void) { - ipoib_netlink_fini(); ib_unregister_client(&ipoib_client); ib_sa_unregister_client(&ipoib_sa_client); ipoib_unregister_debugfs(); diff --git a/trunk/drivers/infiniband/ulp/ipoib/ipoib_netlink.c b/trunk/drivers/infiniband/ulp/ipoib/ipoib_netlink.c deleted file mode 100644 index a7dc5ea8370e..000000000000 --- a/trunk/drivers/infiniband/ulp/ipoib/ipoib_netlink.c +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (c) 2012 Mellanox Technologies. - All rights reserved. - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#include -#include -#include -#include "ipoib.h" - -static const struct nla_policy ipoib_policy[IFLA_IPOIB_MAX + 1] = { - [IFLA_IPOIB_PKEY] = { .type = NLA_U16 }, -}; - -static int ipoib_new_child_link(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[]) -{ - struct net_device *pdev; - struct ipoib_dev_priv *ppriv; - u16 child_pkey; - int err; - - if (!tb[IFLA_LINK]) - return -EINVAL; - - pdev = __dev_get_by_index(src_net, nla_get_u32(tb[IFLA_LINK])); - if (!pdev) - return -ENODEV; - - ppriv = netdev_priv(pdev); - - if (test_bit(IPOIB_FLAG_SUBINTERFACE, &ppriv->flags)) { - ipoib_warn(ppriv, "child creation disallowed for child devices\n"); - return -EINVAL; - } - - if (!data || !data[IFLA_IPOIB_PKEY]) { - ipoib_dbg(ppriv, "no pkey specified, using parent pkey\n"); - child_pkey = ppriv->pkey; - } else - child_pkey = nla_get_u16(data[IFLA_IPOIB_PKEY]); - - err = __ipoib_vlan_add(ppriv, netdev_priv(dev), child_pkey, IPOIB_RTNL_CHILD); - - return err; -} - -static void ipoib_unregister_child_dev(struct net_device *dev, struct list_head *head) -{ - struct ipoib_dev_priv *priv, *ppriv; - - priv = netdev_priv(dev); - ppriv = netdev_priv(priv->parent); - - mutex_lock(&ppriv->vlan_mutex); - unregister_netdevice_queue(dev, head); - list_del(&priv->list); - mutex_unlock(&ppriv->vlan_mutex); -} - -static size_t ipoib_get_size(const struct net_device *dev) -{ - return nla_total_size(2); /* IFLA_IPOIB_PKEY */ -} - -static struct rtnl_link_ops ipoib_link_ops __read_mostly = { - .kind = "ipoib", - .maxtype = IFLA_IPOIB_MAX, - .policy = ipoib_policy, - .priv_size = sizeof(struct ipoib_dev_priv), - .setup = ipoib_setup, - .newlink = ipoib_new_child_link, - .dellink = ipoib_unregister_child_dev, - .get_size = ipoib_get_size, -}; - -int __init ipoib_netlink_init(void) -{ - return rtnl_link_register(&ipoib_link_ops); -} - -void __exit ipoib_netlink_fini(void) -{ - rtnl_link_unregister(&ipoib_link_ops); -} - -MODULE_ALIAS_RTNL_LINK("ipoib"); diff --git a/trunk/drivers/infiniband/ulp/ipoib/ipoib_vlan.c b/trunk/drivers/infiniband/ulp/ipoib/ipoib_vlan.c index 238bbf9b2bea..d7e9740c7248 100644 --- a/trunk/drivers/infiniband/ulp/ipoib/ipoib_vlan.c +++ b/trunk/drivers/infiniband/ulp/ipoib/ipoib_vlan.c @@ -49,11 +49,47 @@ static ssize_t show_parent(struct device *d, struct device_attribute *attr, } static DEVICE_ATTR(parent, S_IRUGO, show_parent, NULL); -int __ipoib_vlan_add(struct ipoib_dev_priv *ppriv, struct ipoib_dev_priv *priv, - u16 pkey, int type) +int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey) { + struct ipoib_dev_priv *ppriv, *priv; + char intf_name[IFNAMSIZ]; int result; + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + ppriv = netdev_priv(pdev); + + if (!rtnl_trylock()) + return restart_syscall(); + mutex_lock(&ppriv->vlan_mutex); + + /* + * First ensure this isn't a duplicate. We check the parent device and + * then all of the child interfaces to make sure the Pkey doesn't match. + */ + if (ppriv->pkey == pkey) { + result = -ENOTUNIQ; + priv = NULL; + goto err; + } + + list_for_each_entry(priv, &ppriv->child_intfs, list) { + if (priv->pkey == pkey) { + result = -ENOTUNIQ; + priv = NULL; + goto err; + } + } + + snprintf(intf_name, sizeof intf_name, "%s.%04x", + ppriv->dev->name, pkey); + priv = ipoib_intf_alloc(intf_name); + if (!priv) { + result = -ENOMEM; + goto err; + } + priv->max_ib_mtu = ppriv->max_ib_mtu; /* MTU will be reset when mcast join happens */ priv->dev->mtu = IPOIB_UD_MTU(priv->max_ib_mtu); @@ -98,13 +134,14 @@ int __ipoib_vlan_add(struct ipoib_dev_priv *ppriv, struct ipoib_dev_priv *priv, if (device_create_file(&priv->dev->dev, &dev_attr_parent)) goto sysfs_failed; - priv->child_type = type; list_add_tail(&priv->list, &ppriv->child_intfs); + mutex_unlock(&ppriv->vlan_mutex); + rtnl_unlock(); + return 0; sysfs_failed: - result = -ENOMEM; ipoib_delete_debug_files(priv->dev); unregister_netdevice(priv->dev); @@ -112,59 +149,10 @@ int __ipoib_vlan_add(struct ipoib_dev_priv *ppriv, struct ipoib_dev_priv *priv, ipoib_dev_cleanup(priv->dev); err: - return result; -} - -int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey) -{ - struct ipoib_dev_priv *ppriv, *priv; - char intf_name[IFNAMSIZ]; - struct ipoib_dev_priv *tpriv; - int result; - - if (!capable(CAP_NET_ADMIN)) - return -EPERM; - - ppriv = netdev_priv(pdev); - - snprintf(intf_name, sizeof intf_name, "%s.%04x", - ppriv->dev->name, pkey); - priv = ipoib_intf_alloc(intf_name); - if (!priv) - return -ENOMEM; - - if (!rtnl_trylock()) - return restart_syscall(); - - mutex_lock(&ppriv->vlan_mutex); - - /* - * First ensure this isn't a duplicate. We check the parent device and - * then all of the legacy child interfaces to make sure the Pkey - * doesn't match. - */ - if (ppriv->pkey == pkey) { - result = -ENOTUNIQ; - goto out; - } - - list_for_each_entry(tpriv, &ppriv->child_intfs, list) { - if (tpriv->pkey == pkey && - tpriv->child_type == IPOIB_LEGACY_CHILD) { - result = -ENOTUNIQ; - goto out; - } - } - - result = __ipoib_vlan_add(ppriv, priv, pkey, IPOIB_LEGACY_CHILD); - -out: mutex_unlock(&ppriv->vlan_mutex); - - if (result) - free_netdev(priv->dev); - rtnl_unlock(); + if (priv) + free_netdev(priv->dev); return result; } @@ -183,9 +171,9 @@ int ipoib_vlan_delete(struct net_device *pdev, unsigned short pkey) return restart_syscall(); mutex_lock(&ppriv->vlan_mutex); list_for_each_entry_safe(priv, tpriv, &ppriv->child_intfs, list) { - if (priv->pkey == pkey && - priv->child_type == IPOIB_LEGACY_CHILD) { + if (priv->pkey == pkey) { unregister_netdevice(priv->dev); + ipoib_dev_cleanup(priv->dev); list_del(&priv->list); dev = priv->dev; break; diff --git a/trunk/drivers/net/ethernet/intel/igb/igb_main.c b/trunk/drivers/net/ethernet/intel/igb/igb_main.c index 19d7666dfccb..246646b61a1a 100644 --- a/trunk/drivers/net/ethernet/intel/igb/igb_main.c +++ b/trunk/drivers/net/ethernet/intel/igb/igb_main.c @@ -4681,11 +4681,13 @@ void igb_update_stats(struct igb_adapter *adapter, bytes = 0; packets = 0; for (i = 0; i < adapter->num_rx_queues; i++) { - u32 rqdpc_tmp = rd32(E1000_RQDPC(i)) & 0x0FFF; + u32 rqdpc = rd32(E1000_RQDPC(i)); struct igb_ring *ring = adapter->rx_ring[i]; - ring->rx_stats.drops += rqdpc_tmp; - net_stats->rx_fifo_errors += rqdpc_tmp; + if (rqdpc) { + ring->rx_stats.drops += rqdpc; + net_stats->rx_fifo_errors += rqdpc; + } do { start = u64_stats_fetch_begin_bh(&ring->rx_syncp); diff --git a/trunk/drivers/net/ethernet/sfc/Kconfig b/trunk/drivers/net/ethernet/sfc/Kconfig index 25906c1d1b15..fb3cbc27063c 100644 --- a/trunk/drivers/net/ethernet/sfc/Kconfig +++ b/trunk/drivers/net/ethernet/sfc/Kconfig @@ -34,10 +34,3 @@ config SFC_SRIOV This enables support for the SFC9000 I/O Virtualization features, allowing accelerated network performance in virtualized environments. -config SFC_PTP - bool "Solarflare SFC9000-family PTP support" - depends on SFC && PTP_1588_CLOCK && !(SFC=y && PTP_1588_CLOCK=m) - default y - ---help--- - This enables support for the Precision Time Protocol (PTP) - on SFC9000-family NICs diff --git a/trunk/drivers/net/ethernet/sfc/Makefile b/trunk/drivers/net/ethernet/sfc/Makefile index e11f2ecf69d9..ea1f8db57318 100644 --- a/trunk/drivers/net/ethernet/sfc/Makefile +++ b/trunk/drivers/net/ethernet/sfc/Makefile @@ -5,6 +5,5 @@ sfc-y += efx.o nic.o falcon.o siena.o tx.o rx.o filter.o \ mcdi.o mcdi_phy.o mcdi_mon.o sfc-$(CONFIG_SFC_MTD) += mtd.o sfc-$(CONFIG_SFC_SRIOV) += siena_sriov.o -sfc-$(CONFIG_SFC_PTP) += ptp.o obj-$(CONFIG_SFC) += sfc.o diff --git a/trunk/drivers/net/ethernet/sfc/efx.c b/trunk/drivers/net/ethernet/sfc/efx.c index 96bd980e828d..a606db43c5ba 100644 --- a/trunk/drivers/net/ethernet/sfc/efx.c +++ b/trunk/drivers/net/ethernet/sfc/efx.c @@ -734,7 +734,6 @@ static void efx_remove_channel(struct efx_channel *channel) efx_for_each_possible_channel_tx_queue(tx_queue, channel) efx_remove_tx_queue(tx_queue); efx_remove_eventq(channel); - channel->type->post_remove(channel); } static void efx_remove_channels(struct efx_nic *efx) @@ -853,7 +852,6 @@ void efx_schedule_slow_fill(struct efx_rx_queue *rx_queue) static const struct efx_channel_type efx_default_channel_type = { .pre_probe = efx_channel_dummy_op_int, - .post_remove = efx_channel_dummy_op_void, .get_name = efx_get_channel_name, .copy = efx_copy_channel, .keep_eventq = false, @@ -864,10 +862,6 @@ int efx_channel_dummy_op_int(struct efx_channel *channel) return 0; } -void efx_channel_dummy_op_void(struct efx_channel *channel) -{ -} - /************************************************************************** * * Port handling @@ -1457,16 +1451,10 @@ static void efx_set_channels(struct efx_nic *efx) efx->tx_channel_offset = separate_tx_channels ? efx->n_channels - efx->n_tx_channels : 0; - /* We need to mark which channels really have RX and TX - * queues, and adjust the TX queue numbers if we have separate + /* We need to adjust the TX queue numbers if we have separate * RX-only and TX-only channels. */ efx_for_each_channel(channel, efx) { - if (channel->channel < efx->n_rx_channels) - channel->rx_queue.core_index = channel->channel; - else - channel->rx_queue.core_index = -1; - efx_for_each_channel_tx_queue(tx_queue, channel) tx_queue->queue -= (efx->tx_channel_offset * EFX_TXQ_TYPES); @@ -1779,9 +1767,6 @@ static int efx_ioctl(struct net_device *net_dev, struct ifreq *ifr, int cmd) struct efx_nic *efx = netdev_priv(net_dev); struct mii_ioctl_data *data = if_mii(ifr); - if (cmd == SIOCSHWTSTAMP) - return efx_ptp_ioctl(efx, ifr, cmd); - /* Convert phy_id from older PRTAD/DEVAD format */ if ((cmd == SIOCGMIIREG || cmd == SIOCSMIIREG) && (data->phy_id & 0xfc00) == 0x0400) diff --git a/trunk/drivers/net/ethernet/sfc/efx.h b/trunk/drivers/net/ethernet/sfc/efx.h index f11170bc48bf..70755c97251a 100644 --- a/trunk/drivers/net/ethernet/sfc/efx.h +++ b/trunk/drivers/net/ethernet/sfc/efx.h @@ -102,7 +102,6 @@ static inline void efx_filter_rfs_expire(struct efx_channel *channel) {} /* Channels */ extern int efx_channel_dummy_op_int(struct efx_channel *channel); -extern void efx_channel_dummy_op_void(struct efx_channel *channel); extern void efx_process_channel_now(struct efx_channel *channel); extern int efx_realloc_channels(struct efx_nic *efx, u32 rxq_entries, u32 txq_entries); diff --git a/trunk/drivers/net/ethernet/sfc/ethtool.c b/trunk/drivers/net/ethernet/sfc/ethtool.c index 9df556c01b8e..f8e7e204981f 100644 --- a/trunk/drivers/net/ethernet/sfc/ethtool.c +++ b/trunk/drivers/net/ethernet/sfc/ethtool.c @@ -1174,7 +1174,6 @@ const struct ethtool_ops efx_ethtool_ops = { .get_rxfh_indir_size = efx_ethtool_get_rxfh_indir_size, .get_rxfh_indir = efx_ethtool_get_rxfh_indir, .set_rxfh_indir = efx_ethtool_set_rxfh_indir, - .get_ts_info = efx_ptp_get_ts_info, .get_module_info = efx_ethtool_get_module_info, .get_module_eeprom = efx_ethtool_get_module_eeprom, }; diff --git a/trunk/drivers/net/ethernet/sfc/mcdi.c b/trunk/drivers/net/ethernet/sfc/mcdi.c index aea43cbd0520..fc5e7bbcbc9e 100644 --- a/trunk/drivers/net/ethernet/sfc/mcdi.c +++ b/trunk/drivers/net/ethernet/sfc/mcdi.c @@ -320,20 +320,14 @@ static void efx_mcdi_ev_cpl(struct efx_nic *efx, unsigned int seqno, efx_mcdi_complete(mcdi); } +/* Issue the given command by writing the data into the shared memory PDU, + * ring the doorbell and wait for completion. Copyout the result. */ int efx_mcdi_rpc(struct efx_nic *efx, unsigned cmd, const u8 *inbuf, size_t inlen, u8 *outbuf, size_t outlen, size_t *outlen_actual) -{ - efx_mcdi_rpc_start(efx, cmd, inbuf, inlen); - return efx_mcdi_rpc_finish(efx, cmd, inlen, - outbuf, outlen, outlen_actual); -} - -void efx_mcdi_rpc_start(struct efx_nic *efx, unsigned cmd, const u8 *inbuf, - size_t inlen) { struct efx_mcdi_iface *mcdi = efx_mcdi(efx); - + int rc; BUG_ON(efx_nic_rev(efx) < EFX_REV_SIENA_A0); efx_mcdi_acquire(mcdi); @@ -344,15 +338,6 @@ void efx_mcdi_rpc_start(struct efx_nic *efx, unsigned cmd, const u8 *inbuf, spin_unlock_bh(&mcdi->iface_lock); efx_mcdi_copyin(efx, cmd, inbuf, inlen); -} - -int efx_mcdi_rpc_finish(struct efx_nic *efx, unsigned cmd, size_t inlen, - u8 *outbuf, size_t outlen, size_t *outlen_actual) -{ - struct efx_mcdi_iface *mcdi = efx_mcdi(efx); - int rc; - - BUG_ON(efx_nic_rev(efx) < EFX_REV_SIENA_A0); if (mcdi->mode == MCDI_MODE_POLL) rc = efx_mcdi_poll(efx); @@ -578,11 +563,6 @@ void efx_mcdi_process_event(struct efx_channel *channel, case MCDI_EVENT_CODE_FLR: efx_sriov_flr(efx, MCDI_EVENT_FIELD(*event, FLR_VF)); break; - case MCDI_EVENT_CODE_PTP_RX: - case MCDI_EVENT_CODE_PTP_FAULT: - case MCDI_EVENT_CODE_PTP_PPS: - efx_ptp_event(efx, event); - break; default: netif_err(efx, hw, efx->net_dev, "Unknown MCDI event 0x%x\n", @@ -661,8 +641,9 @@ int efx_mcdi_get_board_cfg(struct efx_nic *efx, u8 *mac_address, u16 *fw_subtype_list, u32 *capabilities) { uint8_t outbuf[MC_CMD_GET_BOARD_CFG_OUT_LENMIN]; - size_t outlen, offset, i; + size_t outlen; int port_num = efx_port_num(efx); + int offset; int rc; BUILD_BUG_ON(MC_CMD_GET_BOARD_CFG_IN_LEN != 0); @@ -682,18 +663,11 @@ int efx_mcdi_get_board_cfg(struct efx_nic *efx, u8 *mac_address, : MC_CMD_GET_BOARD_CFG_OUT_MAC_ADDR_BASE_PORT0_OFST; if (mac_address) memcpy(mac_address, outbuf + offset, ETH_ALEN); - if (fw_subtype_list) { - /* Byte-swap and truncate or zero-pad as necessary */ - offset = MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_OFST; - for (i = 0; - i < MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_MAXNUM; - i++) { - fw_subtype_list[i] = - (offset + 2 <= outlen) ? - le16_to_cpup((__le16 *)(outbuf + offset)) : 0; - offset += 2; - } - } + if (fw_subtype_list) + memcpy(fw_subtype_list, + outbuf + MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_OFST, + MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_MINNUM * + sizeof(fw_subtype_list[0])); if (capabilities) { if (port_num) *capabilities = MCDI_DWORD(outbuf, @@ -1195,9 +1169,6 @@ int efx_mcdi_flush_rxqs(struct efx_nic *efx) __le32 *qid; int rc, count; - BUILD_BUG_ON(EFX_MAX_CHANNELS > - MC_CMD_FLUSH_RX_QUEUES_IN_QID_OFST_MAXNUM); - qid = kmalloc(EFX_MAX_CHANNELS * sizeof(*qid), GFP_KERNEL); if (qid == NULL) return -ENOMEM; diff --git a/trunk/drivers/net/ethernet/sfc/mcdi.h b/trunk/drivers/net/ethernet/sfc/mcdi.h index dc25caaa3983..0bdf3e331832 100644 --- a/trunk/drivers/net/ethernet/sfc/mcdi.h +++ b/trunk/drivers/net/ethernet/sfc/mcdi.h @@ -71,12 +71,6 @@ extern int efx_mcdi_rpc(struct efx_nic *efx, unsigned cmd, const u8 *inbuf, size_t inlen, u8 *outbuf, size_t outlen, size_t *outlen_actual); -extern void efx_mcdi_rpc_start(struct efx_nic *efx, unsigned cmd, - const u8 *inbuf, size_t inlen); -extern int efx_mcdi_rpc_finish(struct efx_nic *efx, unsigned cmd, size_t inlen, - u8 *outbuf, size_t outlen, - size_t *outlen_actual); - extern int efx_mcdi_poll_reboot(struct efx_nic *efx); extern void efx_mcdi_mode_poll(struct efx_nic *efx); extern void efx_mcdi_mode_event(struct efx_nic *efx); diff --git a/trunk/drivers/net/ethernet/sfc/mcdi_pcol.h b/trunk/drivers/net/ethernet/sfc/mcdi_pcol.h index 9d426d0457bd..db4beed97669 100644 --- a/trunk/drivers/net/ethernet/sfc/mcdi_pcol.h +++ b/trunk/drivers/net/ethernet/sfc/mcdi_pcol.h @@ -289,7 +289,6 @@ #define MCDI_EVENT_CODE_TX_FLUSH 0xc /* enum */ #define MCDI_EVENT_CODE_PTP_RX 0xd /* enum */ #define MCDI_EVENT_CODE_PTP_FAULT 0xe /* enum */ -#define MCDI_EVENT_CODE_PTP_PPS 0xf /* enum */ #define MCDI_EVENT_CMDDONE_DATA_OFST 0 #define MCDI_EVENT_CMDDONE_DATA_LBN 0 #define MCDI_EVENT_CMDDONE_DATA_WIDTH 32 @@ -492,12 +491,12 @@ /* MC_CMD_GET_FPGAREG_OUT msgresponse */ #define MC_CMD_GET_FPGAREG_OUT_LENMIN 1 -#define MC_CMD_GET_FPGAREG_OUT_LENMAX 252 +#define MC_CMD_GET_FPGAREG_OUT_LENMAX 255 #define MC_CMD_GET_FPGAREG_OUT_LEN(num) (0+1*(num)) #define MC_CMD_GET_FPGAREG_OUT_BUFFER_OFST 0 #define MC_CMD_GET_FPGAREG_OUT_BUFFER_LEN 1 #define MC_CMD_GET_FPGAREG_OUT_BUFFER_MINNUM 1 -#define MC_CMD_GET_FPGAREG_OUT_BUFFER_MAXNUM 252 +#define MC_CMD_GET_FPGAREG_OUT_BUFFER_MAXNUM 255 /***********************************/ @@ -508,13 +507,13 @@ /* MC_CMD_PUT_FPGAREG_IN msgrequest */ #define MC_CMD_PUT_FPGAREG_IN_LENMIN 5 -#define MC_CMD_PUT_FPGAREG_IN_LENMAX 252 +#define MC_CMD_PUT_FPGAREG_IN_LENMAX 255 #define MC_CMD_PUT_FPGAREG_IN_LEN(num) (4+1*(num)) #define MC_CMD_PUT_FPGAREG_IN_ADDR_OFST 0 #define MC_CMD_PUT_FPGAREG_IN_BUFFER_OFST 4 #define MC_CMD_PUT_FPGAREG_IN_BUFFER_LEN 1 #define MC_CMD_PUT_FPGAREG_IN_BUFFER_MINNUM 1 -#define MC_CMD_PUT_FPGAREG_IN_BUFFER_MAXNUM 248 +#define MC_CMD_PUT_FPGAREG_IN_BUFFER_MAXNUM 251 /* MC_CMD_PUT_FPGAREG_OUT msgresponse */ #define MC_CMD_PUT_FPGAREG_OUT_LEN 0 @@ -561,7 +560,7 @@ /* MC_CMD_PTP_IN_TRANSMIT msgrequest */ #define MC_CMD_PTP_IN_TRANSMIT_LENMIN 13 -#define MC_CMD_PTP_IN_TRANSMIT_LENMAX 252 +#define MC_CMD_PTP_IN_TRANSMIT_LENMAX 255 #define MC_CMD_PTP_IN_TRANSMIT_LEN(num) (12+1*(num)) /* MC_CMD_PTP_IN_CMD_OFST 0 */ /* MC_CMD_PTP_IN_PERIPH_ID_OFST 4 */ @@ -569,7 +568,7 @@ #define MC_CMD_PTP_IN_TRANSMIT_PACKET_OFST 12 #define MC_CMD_PTP_IN_TRANSMIT_PACKET_LEN 1 #define MC_CMD_PTP_IN_TRANSMIT_PACKET_MINNUM 1 -#define MC_CMD_PTP_IN_TRANSMIT_PACKET_MAXNUM 240 +#define MC_CMD_PTP_IN_TRANSMIT_PACKET_MAXNUM 243 /* MC_CMD_PTP_IN_READ_NIC_TIME msgrequest */ #define MC_CMD_PTP_IN_READ_NIC_TIME_LEN 8 @@ -1146,7 +1145,7 @@ /* MC_CMD_PUTS_IN msgrequest */ #define MC_CMD_PUTS_IN_LENMIN 13 -#define MC_CMD_PUTS_IN_LENMAX 252 +#define MC_CMD_PUTS_IN_LENMAX 255 #define MC_CMD_PUTS_IN_LEN(num) (12+1*(num)) #define MC_CMD_PUTS_IN_DEST_OFST 0 #define MC_CMD_PUTS_IN_UART_LBN 0 @@ -1158,7 +1157,7 @@ #define MC_CMD_PUTS_IN_STRING_OFST 12 #define MC_CMD_PUTS_IN_STRING_LEN 1 #define MC_CMD_PUTS_IN_STRING_MINNUM 1 -#define MC_CMD_PUTS_IN_STRING_MAXNUM 240 +#define MC_CMD_PUTS_IN_STRING_MAXNUM 243 /* MC_CMD_PUTS_OUT msgresponse */ #define MC_CMD_PUTS_OUT_LEN 0 @@ -1948,12 +1947,12 @@ /* MC_CMD_NVRAM_READ_OUT msgresponse */ #define MC_CMD_NVRAM_READ_OUT_LENMIN 1 -#define MC_CMD_NVRAM_READ_OUT_LENMAX 252 +#define MC_CMD_NVRAM_READ_OUT_LENMAX 255 #define MC_CMD_NVRAM_READ_OUT_LEN(num) (0+1*(num)) #define MC_CMD_NVRAM_READ_OUT_READ_BUFFER_OFST 0 #define MC_CMD_NVRAM_READ_OUT_READ_BUFFER_LEN 1 #define MC_CMD_NVRAM_READ_OUT_READ_BUFFER_MINNUM 1 -#define MC_CMD_NVRAM_READ_OUT_READ_BUFFER_MAXNUM 252 +#define MC_CMD_NVRAM_READ_OUT_READ_BUFFER_MAXNUM 255 /***********************************/ @@ -1964,7 +1963,7 @@ /* MC_CMD_NVRAM_WRITE_IN msgrequest */ #define MC_CMD_NVRAM_WRITE_IN_LENMIN 13 -#define MC_CMD_NVRAM_WRITE_IN_LENMAX 252 +#define MC_CMD_NVRAM_WRITE_IN_LENMAX 255 #define MC_CMD_NVRAM_WRITE_IN_LEN(num) (12+1*(num)) #define MC_CMD_NVRAM_WRITE_IN_TYPE_OFST 0 /* Enum values, see field(s): */ @@ -1974,7 +1973,7 @@ #define MC_CMD_NVRAM_WRITE_IN_WRITE_BUFFER_OFST 12 #define MC_CMD_NVRAM_WRITE_IN_WRITE_BUFFER_LEN 1 #define MC_CMD_NVRAM_WRITE_IN_WRITE_BUFFER_MINNUM 1 -#define MC_CMD_NVRAM_WRITE_IN_WRITE_BUFFER_MAXNUM 240 +#define MC_CMD_NVRAM_WRITE_IN_WRITE_BUFFER_MAXNUM 243 /* MC_CMD_NVRAM_WRITE_OUT msgresponse */ #define MC_CMD_NVRAM_WRITE_OUT_LEN 0 @@ -2306,13 +2305,13 @@ /* MC_CMD_GET_PHY_MEDIA_INFO_OUT msgresponse */ #define MC_CMD_GET_PHY_MEDIA_INFO_OUT_LENMIN 5 -#define MC_CMD_GET_PHY_MEDIA_INFO_OUT_LENMAX 252 +#define MC_CMD_GET_PHY_MEDIA_INFO_OUT_LENMAX 255 #define MC_CMD_GET_PHY_MEDIA_INFO_OUT_LEN(num) (4+1*(num)) #define MC_CMD_GET_PHY_MEDIA_INFO_OUT_DATALEN_OFST 0 #define MC_CMD_GET_PHY_MEDIA_INFO_OUT_DATA_OFST 4 #define MC_CMD_GET_PHY_MEDIA_INFO_OUT_DATA_LEN 1 #define MC_CMD_GET_PHY_MEDIA_INFO_OUT_DATA_MINNUM 1 -#define MC_CMD_GET_PHY_MEDIA_INFO_OUT_DATA_MAXNUM 248 +#define MC_CMD_GET_PHY_MEDIA_INFO_OUT_DATA_MAXNUM 251 /***********************************/ diff --git a/trunk/drivers/net/ethernet/sfc/mtd.c b/trunk/drivers/net/ethernet/sfc/mtd.c index 08f825b71ac8..758148379b0e 100644 --- a/trunk/drivers/net/ethernet/sfc/mtd.c +++ b/trunk/drivers/net/ethernet/sfc/mtd.c @@ -585,7 +585,6 @@ static const struct siena_nvram_type_info siena_nvram_types[] = { [MC_CMD_NVRAM_TYPE_EXP_ROM_CFG_PORT1] = { 1, "sfc_exp_rom_cfg" }, [MC_CMD_NVRAM_TYPE_PHY_PORT0] = { 0, "sfc_phy_fw" }, [MC_CMD_NVRAM_TYPE_PHY_PORT1] = { 1, "sfc_phy_fw" }, - [MC_CMD_NVRAM_TYPE_FPGA] = { 0, "sfc_fpga" }, }; static int siena_mtd_probe_partition(struct efx_nic *efx, @@ -599,8 +598,7 @@ static int siena_mtd_probe_partition(struct efx_nic *efx, bool protected; int rc; - if (type >= ARRAY_SIZE(siena_nvram_types) || - siena_nvram_types[type].name == NULL) + if (type >= ARRAY_SIZE(siena_nvram_types)) return -ENODEV; info = &siena_nvram_types[type]; @@ -629,8 +627,7 @@ static int siena_mtd_get_fw_subtypes(struct efx_nic *efx, struct efx_mtd *efx_mtd) { struct efx_mtd_partition *part; - uint16_t fw_subtype_list[ - MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_MAXNUM]; + uint16_t fw_subtype_list[MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_MINNUM]; int rc; rc = efx_mcdi_get_board_cfg(efx, NULL, fw_subtype_list, NULL); diff --git a/trunk/drivers/net/ethernet/sfc/net_driver.h b/trunk/drivers/net/ethernet/sfc/net_driver.h index c1a010cda89b..7ab1232494ef 100644 --- a/trunk/drivers/net/ethernet/sfc/net_driver.h +++ b/trunk/drivers/net/ethernet/sfc/net_driver.h @@ -37,7 +37,7 @@ * **************************************************************************/ -#define EFX_DRIVER_VERSION "3.2" +#define EFX_DRIVER_VERSION "3.1" #ifdef DEBUG #define EFX_BUG_ON_PARANOID(x) BUG_ON(x) @@ -56,8 +56,7 @@ #define EFX_MAX_CHANNELS 32U #define EFX_MAX_RX_QUEUES EFX_MAX_CHANNELS #define EFX_EXTRA_CHANNEL_IOV 0 -#define EFX_EXTRA_CHANNEL_PTP 1 -#define EFX_MAX_EXTRA_CHANNELS 2U +#define EFX_MAX_EXTRA_CHANNELS 1U /* Checksum generation is a per-queue option in hardware, so each * queue visible to the networking core is backed by two hardware TX @@ -69,9 +68,6 @@ #define EFX_TXQ_TYPES 4 #define EFX_MAX_TX_QUEUES (EFX_TXQ_TYPES * EFX_MAX_CHANNELS) -/* Forward declare Precision Time Protocol (PTP) support structure. */ -struct efx_ptp_data; - struct efx_self_tests; /** @@ -246,8 +242,6 @@ struct efx_rx_page_state { /** * struct efx_rx_queue - An Efx RX queue * @efx: The associated Efx NIC - * @core_index: Index of network core RX queue. Will be >= 0 iff this - * is associated with a real RX queue. * @buffer: The software buffer ring * @rxd: The hardware descriptor ring * @ptr_mask: The size of the ring minus 1. @@ -269,7 +263,6 @@ struct efx_rx_page_state { */ struct efx_rx_queue { struct efx_nic *efx; - int core_index; struct efx_rx_buffer *buffer; struct efx_special_buffer rxd; unsigned int ptr_mask; @@ -397,17 +390,14 @@ struct efx_channel { * @get_name: Generate the channel's name (used for its IRQ handler) * @copy: Copy the channel state prior to reallocation. May be %NULL if * reallocation is not supported. - * @receive_skb: Handle an skb ready to be passed to netif_receive_skb() * @keep_eventq: Flag for whether event queue should be kept initialised * while the device is stopped */ struct efx_channel_type { void (*handle_no_channel)(struct efx_nic *); int (*pre_probe)(struct efx_channel *); - void (*post_remove)(struct efx_channel *); void (*get_name)(struct efx_channel *, char *buf, size_t len); struct efx_channel *(*copy)(const struct efx_channel *); - void (*receive_skb)(struct efx_channel *, struct sk_buff *); bool keep_eventq; }; @@ -740,7 +730,6 @@ struct vfdi_status; * %local_addr_list. Protected by %local_lock. * @local_lock: Mutex protecting %local_addr_list and %local_page_list. * @peer_work: Work item to broadcast peer addresses to VMs. - * @ptp_data: PTP state data * @monitor_work: Hardware monitor workitem * @biu_lock: BIU (bus interface unit) lock * @last_irq_cpu: Last CPU to handle a possible test interrupt. This @@ -868,10 +857,6 @@ struct efx_nic { struct work_struct peer_work; #endif -#ifdef CONFIG_SFC_PTP - struct efx_ptp_data *ptp_data; -#endif - /* The following fields may be written more often */ struct delayed_work monitor_work ____cacheline_aligned_in_smp; @@ -1062,7 +1047,7 @@ static inline bool efx_tx_queue_used(struct efx_tx_queue *tx_queue) static inline bool efx_channel_has_rx_queue(struct efx_channel *channel) { - return channel->rx_queue.core_index >= 0; + return channel->channel < channel->efx->n_rx_channels; } static inline struct efx_rx_queue * @@ -1134,13 +1119,5 @@ static inline void clear_bit_le(unsigned nr, unsigned char *addr) #define EFX_MAX_FRAME_LEN(mtu) \ ((((mtu) + ETH_HLEN + VLAN_HLEN + 4/* FCS */ + 7) & ~7) + 16) -static inline bool efx_xmit_with_hwtstamp(struct sk_buff *skb) -{ - return skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP; -} -static inline void efx_xmit_hwtstamp_pending(struct sk_buff *skb) -{ - skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; -} #endif /* EFX_NET_DRIVER_H */ diff --git a/trunk/drivers/net/ethernet/sfc/nic.h b/trunk/drivers/net/ethernet/sfc/nic.h index 438cef11f727..bab5cd9f5740 100644 --- a/trunk/drivers/net/ethernet/sfc/nic.h +++ b/trunk/drivers/net/ethernet/sfc/nic.h @@ -11,7 +11,6 @@ #ifndef EFX_NIC_H #define EFX_NIC_H -#include #include #include "net_driver.h" #include "efx.h" @@ -251,41 +250,6 @@ extern int efx_sriov_get_vf_config(struct net_device *dev, int vf, extern int efx_sriov_set_vf_spoofchk(struct net_device *net_dev, int vf, bool spoofchk); -struct ethtool_ts_info; -#ifdef CONFIG_SFC_PTP -extern void efx_ptp_probe(struct efx_nic *efx); -extern int efx_ptp_ioctl(struct efx_nic *efx, struct ifreq *ifr, int cmd); -extern int efx_ptp_get_ts_info(struct net_device *net_dev, - struct ethtool_ts_info *ts_info); -extern bool efx_ptp_is_ptp_tx(struct efx_nic *efx, struct sk_buff *skb); -extern int efx_ptp_tx(struct efx_nic *efx, struct sk_buff *skb); -extern void efx_ptp_event(struct efx_nic *efx, efx_qword_t *ev); -#else -static inline void efx_ptp_probe(struct efx_nic *efx) {} -static inline int efx_ptp_ioctl(struct efx_nic *efx, struct ifreq *ifr, int cmd) -{ - return -EOPNOTSUPP; -} -static inline int efx_ptp_get_ts_info(struct net_device *net_dev, - struct ethtool_ts_info *ts_info) -{ - ts_info->so_timestamping = (SOF_TIMESTAMPING_SOFTWARE | - SOF_TIMESTAMPING_RX_SOFTWARE); - ts_info->phc_index = -1; - - return 0; -} -static inline bool efx_ptp_is_ptp_tx(struct efx_nic *efx, struct sk_buff *skb) -{ - return false; -} -static inline int efx_ptp_tx(struct efx_nic *efx, struct sk_buff *skb) -{ - return NETDEV_TX_OK; -} -static inline void efx_ptp_event(struct efx_nic *efx, efx_qword_t *ev) {} -#endif - extern const struct efx_nic_type falcon_a1_nic_type; extern const struct efx_nic_type falcon_b0_nic_type; extern const struct efx_nic_type siena_a0_nic_type; diff --git a/trunk/drivers/net/ethernet/sfc/ptp.c b/trunk/drivers/net/ethernet/sfc/ptp.c deleted file mode 100644 index 2b07a4eae07e..000000000000 --- a/trunk/drivers/net/ethernet/sfc/ptp.c +++ /dev/null @@ -1,1483 +0,0 @@ -/**************************************************************************** - * Driver for Solarflare Solarstorm network controllers and boards - * Copyright 2011 Solarflare Communications Inc. - * - * 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, incorporated herein by reference. - */ - -/* Theory of operation: - * - * PTP support is assisted by firmware running on the MC, which provides - * the hardware timestamping capabilities. Both transmitted and received - * PTP event packets are queued onto internal queues for subsequent processing; - * this is because the MC operations are relatively long and would block - * block NAPI/interrupt operation. - * - * Receive event processing: - * The event contains the packet's UUID and sequence number, together - * with the hardware timestamp. The PTP receive packet queue is searched - * for this UUID/sequence number and, if found, put on a pending queue. - * Packets not matching are delivered without timestamps (MCDI events will - * always arrive after the actual packet). - * It is important for the operation of the PTP protocol that the ordering - * of packets between the event and general port is maintained. - * - * Work queue processing: - * If work waiting, synchronise host/hardware time - * - * Transmit: send packet through MC, which returns the transmission time - * that is converted to an appropriate timestamp. - * - * Receive: the packet's reception time is converted to an appropriate - * timestamp. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include "net_driver.h" -#include "efx.h" -#include "mcdi.h" -#include "mcdi_pcol.h" -#include "io.h" -#include "regs.h" -#include "nic.h" - -/* Maximum number of events expected to make up a PTP event */ -#define MAX_EVENT_FRAGS 3 - -/* Maximum delay, ms, to begin synchronisation */ -#define MAX_SYNCHRONISE_WAIT_MS 2 - -/* How long, at most, to spend synchronising */ -#define SYNCHRONISE_PERIOD_NS 250000 - -/* How often to update the shared memory time */ -#define SYNCHRONISATION_GRANULARITY_NS 200 - -/* Minimum permitted length of a (corrected) synchronisation time */ -#define MIN_SYNCHRONISATION_NS 120 - -/* Maximum permitted length of a (corrected) synchronisation time */ -#define MAX_SYNCHRONISATION_NS 1000 - -/* How many (MC) receive events that can be queued */ -#define MAX_RECEIVE_EVENTS 8 - -/* Length of (modified) moving average. */ -#define AVERAGE_LENGTH 16 - -/* How long an unmatched event or packet can be held */ -#define PKT_EVENT_LIFETIME_MS 10 - -/* Offsets into PTP packet for identification. These offsets are from the - * start of the IP header, not the MAC header. Note that neither PTP V1 nor - * PTP V2 permit the use of IPV4 options. - */ -#define PTP_DPORT_OFFSET 22 - -#define PTP_V1_VERSION_LENGTH 2 -#define PTP_V1_VERSION_OFFSET 28 - -#define PTP_V1_UUID_LENGTH 6 -#define PTP_V1_UUID_OFFSET 50 - -#define PTP_V1_SEQUENCE_LENGTH 2 -#define PTP_V1_SEQUENCE_OFFSET 58 - -/* The minimum length of a PTP V1 packet for offsets, etc. to be valid: - * includes IP header. - */ -#define PTP_V1_MIN_LENGTH 64 - -#define PTP_V2_VERSION_LENGTH 1 -#define PTP_V2_VERSION_OFFSET 29 - -/* Although PTP V2 UUIDs are comprised a ClockIdentity (8) and PortNumber (2), - * the MC only captures the last six bytes of the clock identity. These values - * reflect those, not the ones used in the standard. The standard permits - * mapping of V1 UUIDs to V2 UUIDs with these same values. - */ -#define PTP_V2_MC_UUID_LENGTH 6 -#define PTP_V2_MC_UUID_OFFSET 50 - -#define PTP_V2_SEQUENCE_LENGTH 2 -#define PTP_V2_SEQUENCE_OFFSET 58 - -/* The minimum length of a PTP V2 packet for offsets, etc. to be valid: - * includes IP header. - */ -#define PTP_V2_MIN_LENGTH 63 - -#define PTP_MIN_LENGTH 63 - -#define PTP_ADDRESS 0xe0000181 /* 224.0.1.129 */ -#define PTP_EVENT_PORT 319 -#define PTP_GENERAL_PORT 320 - -/* Annoyingly the format of the version numbers are different between - * versions 1 and 2 so it isn't possible to simply look for 1 or 2. - */ -#define PTP_VERSION_V1 1 - -#define PTP_VERSION_V2 2 -#define PTP_VERSION_V2_MASK 0x0f - -enum ptp_packet_state { - PTP_PACKET_STATE_UNMATCHED = 0, - PTP_PACKET_STATE_MATCHED, - PTP_PACKET_STATE_TIMED_OUT, - PTP_PACKET_STATE_MATCH_UNWANTED -}; - -/* NIC synchronised with single word of time only comprising - * partial seconds and full nanoseconds: 10^9 ~ 2^30 so 2 bits for seconds. - */ -#define MC_NANOSECOND_BITS 30 -#define MC_NANOSECOND_MASK ((1 << MC_NANOSECOND_BITS) - 1) -#define MC_SECOND_MASK ((1 << (32 - MC_NANOSECOND_BITS)) - 1) - -/* Maximum parts-per-billion adjustment that is acceptable */ -#define MAX_PPB 1000000 - -/* Number of bits required to hold the above */ -#define MAX_PPB_BITS 20 - -/* Number of extra bits allowed when calculating fractional ns. - * EXTRA_BITS + MC_CMD_PTP_IN_ADJUST_BITS + MAX_PPB_BITS should - * be less than 63. - */ -#define PPB_EXTRA_BITS 2 - -/* Precalculate scale word to avoid long long division at runtime */ -#define PPB_SCALE_WORD ((1LL << (PPB_EXTRA_BITS + MC_CMD_PTP_IN_ADJUST_BITS +\ - MAX_PPB_BITS)) / 1000000000LL) - -#define PTP_SYNC_ATTEMPTS 4 - -/** - * struct efx_ptp_match - Matching structure, stored in sk_buff's cb area. - * @words: UUID and (partial) sequence number - * @expiry: Time after which the packet should be delivered irrespective of - * event arrival. - * @state: The state of the packet - whether it is ready for processing or - * whether that is of no interest. - */ -struct efx_ptp_match { - u32 words[DIV_ROUND_UP(PTP_V1_UUID_LENGTH, 4)]; - unsigned long expiry; - enum ptp_packet_state state; -}; - -/** - * struct efx_ptp_event_rx - A PTP receive event (from MC) - * @seq0: First part of (PTP) UUID - * @seq1: Second part of (PTP) UUID and sequence number - * @hwtimestamp: Event timestamp - */ -struct efx_ptp_event_rx { - struct list_head link; - u32 seq0; - u32 seq1; - ktime_t hwtimestamp; - unsigned long expiry; -}; - -/** - * struct efx_ptp_timeset - Synchronisation between host and MC - * @host_start: Host time immediately before hardware timestamp taken - * @seconds: Hardware timestamp, seconds - * @nanoseconds: Hardware timestamp, nanoseconds - * @host_end: Host time immediately after hardware timestamp taken - * @waitns: Number of nanoseconds between hardware timestamp being read and - * host end time being seen - * @window: Difference of host_end and host_start - * @valid: Whether this timeset is valid - */ -struct efx_ptp_timeset { - u32 host_start; - u32 seconds; - u32 nanoseconds; - u32 host_end; - u32 waitns; - u32 window; /* Derived: end - start, allowing for wrap */ -}; - -/** - * struct efx_ptp_data - Precision Time Protocol (PTP) state - * @channel: The PTP channel - * @rxq: Receive queue (awaiting timestamps) - * @txq: Transmit queue - * @evt_list: List of MC receive events awaiting packets - * @evt_free_list: List of free events - * @evt_lock: Lock for manipulating evt_list and evt_free_list - * @rx_evts: Instantiated events (on evt_list and evt_free_list) - * @workwq: Work queue for processing pending PTP operations - * @work: Work task - * @reset_required: A serious error has occurred and the PTP task needs to be - * reset (disable, enable). - * @rxfilter_event: Receive filter when operating - * @rxfilter_general: Receive filter when operating - * @config: Current timestamp configuration - * @enabled: PTP operation enabled - * @mode: Mode in which PTP operating (PTP version) - * @evt_frags: Partly assembled PTP events - * @evt_frag_idx: Current fragment number - * @evt_code: Last event code - * @start: Address at which MC indicates ready for synchronisation - * @host_time_pps: Host time at last PPS - * @last_sync_ns: Last number of nanoseconds between readings when synchronising - * @base_sync_ns: Number of nanoseconds for last synchronisation. - * @base_sync_valid: Whether base_sync_time is valid. - * @current_adjfreq: Current ppb adjustment. - * @phc_clock: Pointer to registered phc device - * @phc_clock_info: Registration structure for phc device - * @pps_work: pps work task for handling pps events - * @pps_workwq: pps work queue - * @nic_ts_enabled: Flag indicating if NIC generated TS events are handled - * @txbuf: Buffer for use when transmitting (PTP) packets to MC (avoids - * allocations in main data path). - * @debug_ptp_dir: PTP debugfs directory - * @missed_rx_sync: Number of packets received without syncrhonisation. - * @good_syncs: Number of successful synchronisations. - * @no_time_syncs: Number of synchronisations with no good times. - * @bad_sync_durations: Number of synchronisations with bad durations. - * @bad_syncs: Number of failed synchronisations. - * @last_sync_time: Number of nanoseconds for last synchronisation. - * @sync_timeouts: Number of synchronisation timeouts - * @fast_syncs: Number of synchronisations requiring short delay - * @min_sync_delta: Minimum time between event and synchronisation - * @max_sync_delta: Maximum time between event and synchronisation - * @average_sync_delta: Average time between event and synchronisation. - * Modified moving average. - * @last_sync_delta: Last time between event and synchronisation - * @mc_stats: Context value for MC statistics - * @timeset: Last set of synchronisation statistics. - */ -struct efx_ptp_data { - struct efx_channel *channel; - struct sk_buff_head rxq; - struct sk_buff_head txq; - struct list_head evt_list; - struct list_head evt_free_list; - spinlock_t evt_lock; - struct efx_ptp_event_rx rx_evts[MAX_RECEIVE_EVENTS]; - struct workqueue_struct *workwq; - struct work_struct work; - bool reset_required; - u32 rxfilter_event; - u32 rxfilter_general; - bool rxfilter_installed; - struct hwtstamp_config config; - bool enabled; - unsigned int mode; - efx_qword_t evt_frags[MAX_EVENT_FRAGS]; - int evt_frag_idx; - int evt_code; - struct efx_buffer start; - struct pps_event_time host_time_pps; - unsigned last_sync_ns; - unsigned base_sync_ns; - bool base_sync_valid; - s64 current_adjfreq; - struct ptp_clock *phc_clock; - struct ptp_clock_info phc_clock_info; - struct work_struct pps_work; - struct workqueue_struct *pps_workwq; - bool nic_ts_enabled; - u8 txbuf[ALIGN(MC_CMD_PTP_IN_TRANSMIT_LEN( - MC_CMD_PTP_IN_TRANSMIT_PACKET_MAXNUM), 4)]; - struct efx_ptp_timeset - timeset[MC_CMD_PTP_OUT_SYNCHRONIZE_TIMESET_MAXNUM]; -}; - -static int efx_phc_adjfreq(struct ptp_clock_info *ptp, s32 delta); -static int efx_phc_adjtime(struct ptp_clock_info *ptp, s64 delta); -static int efx_phc_gettime(struct ptp_clock_info *ptp, struct timespec *ts); -static int efx_phc_settime(struct ptp_clock_info *ptp, - const struct timespec *e_ts); -static int efx_phc_enable(struct ptp_clock_info *ptp, - struct ptp_clock_request *request, int on); - -/* Enable MCDI PTP support. */ -static int efx_ptp_enable(struct efx_nic *efx) -{ - u8 inbuf[MC_CMD_PTP_IN_ENABLE_LEN]; - - MCDI_SET_DWORD(inbuf, PTP_IN_OP, MC_CMD_PTP_OP_ENABLE); - MCDI_SET_DWORD(inbuf, PTP_IN_ENABLE_QUEUE, - efx->ptp_data->channel->channel); - MCDI_SET_DWORD(inbuf, PTP_IN_ENABLE_MODE, efx->ptp_data->mode); - - return efx_mcdi_rpc(efx, MC_CMD_PTP, inbuf, sizeof(inbuf), - NULL, 0, NULL); -} - -/* Disable MCDI PTP support. - * - * Note that this function should never rely on the presence of ptp_data - - * may be called before that exists. - */ -static int efx_ptp_disable(struct efx_nic *efx) -{ - u8 inbuf[MC_CMD_PTP_IN_DISABLE_LEN]; - - MCDI_SET_DWORD(inbuf, PTP_IN_OP, MC_CMD_PTP_OP_DISABLE); - return efx_mcdi_rpc(efx, MC_CMD_PTP, inbuf, sizeof(inbuf), - NULL, 0, NULL); -} - -static void efx_ptp_deliver_rx_queue(struct sk_buff_head *q) -{ - struct sk_buff *skb; - - while ((skb = skb_dequeue(q))) { - local_bh_disable(); - netif_receive_skb(skb); - local_bh_enable(); - } -} - -static void efx_ptp_handle_no_channel(struct efx_nic *efx) -{ - netif_err(efx, drv, efx->net_dev, - "ERROR: PTP requires MSI-X and 1 additional interrupt" - "vector. PTP disabled\n"); -} - -/* Repeatedly send the host time to the MC which will capture the hardware - * time. - */ -static void efx_ptp_send_times(struct efx_nic *efx, - struct pps_event_time *last_time) -{ - struct pps_event_time now; - struct timespec limit; - struct efx_ptp_data *ptp = efx->ptp_data; - struct timespec start; - int *mc_running = ptp->start.addr; - - pps_get_ts(&now); - start = now.ts_real; - limit = now.ts_real; - timespec_add_ns(&limit, SYNCHRONISE_PERIOD_NS); - - /* Write host time for specified period or until MC is done */ - while ((timespec_compare(&now.ts_real, &limit) < 0) && - ACCESS_ONCE(*mc_running)) { - struct timespec update_time; - unsigned int host_time; - - /* Don't update continuously to avoid saturating the PCIe bus */ - update_time = now.ts_real; - timespec_add_ns(&update_time, SYNCHRONISATION_GRANULARITY_NS); - do { - pps_get_ts(&now); - } while ((timespec_compare(&now.ts_real, &update_time) < 0) && - ACCESS_ONCE(*mc_running)); - - /* Synchronise NIC with single word of time only */ - host_time = (now.ts_real.tv_sec << MC_NANOSECOND_BITS | - now.ts_real.tv_nsec); - /* Update host time in NIC memory */ - _efx_writed(efx, cpu_to_le32(host_time), - FR_CZ_MC_TREG_SMEM + MC_SMEM_P0_PTP_TIME_OFST); - } - *last_time = now; -} - -/* Read a timeset from the MC's results and partial process. */ -static void efx_ptp_read_timeset(u8 *data, struct efx_ptp_timeset *timeset) -{ - unsigned start_ns, end_ns; - - timeset->host_start = MCDI_DWORD(data, PTP_OUT_SYNCHRONIZE_HOSTSTART); - timeset->seconds = MCDI_DWORD(data, PTP_OUT_SYNCHRONIZE_SECONDS); - timeset->nanoseconds = MCDI_DWORD(data, - PTP_OUT_SYNCHRONIZE_NANOSECONDS); - timeset->host_end = MCDI_DWORD(data, PTP_OUT_SYNCHRONIZE_HOSTEND), - timeset->waitns = MCDI_DWORD(data, PTP_OUT_SYNCHRONIZE_WAITNS); - - /* Ignore seconds */ - start_ns = timeset->host_start & MC_NANOSECOND_MASK; - end_ns = timeset->host_end & MC_NANOSECOND_MASK; - /* Allow for rollover */ - if (end_ns < start_ns) - end_ns += NSEC_PER_SEC; - /* Determine duration of operation */ - timeset->window = end_ns - start_ns; -} - -/* Process times received from MC. - * - * Extract times from returned results, and establish the minimum value - * seen. The minimum value represents the "best" possible time and events - * too much greater than this are rejected - the machine is, perhaps, too - * busy. A number of readings are taken so that, hopefully, at least one good - * synchronisation will be seen in the results. - */ -static int efx_ptp_process_times(struct efx_nic *efx, u8 *synch_buf, - size_t response_length, - const struct pps_event_time *last_time) -{ - unsigned number_readings = (response_length / - MC_CMD_PTP_OUT_SYNCHRONIZE_TIMESET_LEN); - unsigned i; - unsigned min; - unsigned min_set = 0; - unsigned total; - unsigned ngood = 0; - unsigned last_good = 0; - struct efx_ptp_data *ptp = efx->ptp_data; - bool min_valid = false; - u32 last_sec; - u32 start_sec; - struct timespec delta; - - if (number_readings == 0) - return -EAGAIN; - - /* Find minimum value in this set of results, discarding clearly - * erroneous results. - */ - for (i = 0; i < number_readings; i++) { - efx_ptp_read_timeset(synch_buf, &ptp->timeset[i]); - synch_buf += MC_CMD_PTP_OUT_SYNCHRONIZE_TIMESET_LEN; - if (ptp->timeset[i].window > SYNCHRONISATION_GRANULARITY_NS) { - if (min_valid) { - if (ptp->timeset[i].window < min_set) - min_set = ptp->timeset[i].window; - } else { - min_valid = true; - min_set = ptp->timeset[i].window; - } - } - } - - if (min_valid) { - if (ptp->base_sync_valid && (min_set > ptp->base_sync_ns)) - min = ptp->base_sync_ns; - else - min = min_set; - } else { - min = SYNCHRONISATION_GRANULARITY_NS; - } - - /* Discard excessively long synchronise durations. The MC times - * when it finishes reading the host time so the corrected window - * time should be fairly constant for a given platform. - */ - total = 0; - for (i = 0; i < number_readings; i++) - if (ptp->timeset[i].window > ptp->timeset[i].waitns) { - unsigned win; - - win = ptp->timeset[i].window - ptp->timeset[i].waitns; - if (win >= MIN_SYNCHRONISATION_NS && - win < MAX_SYNCHRONISATION_NS) { - total += ptp->timeset[i].window; - ngood++; - last_good = i; - } - } - - if (ngood == 0) { - netif_warn(efx, drv, efx->net_dev, - "PTP no suitable synchronisations %dns %dns\n", - ptp->base_sync_ns, min_set); - return -EAGAIN; - } - - /* Average minimum this synchronisation */ - ptp->last_sync_ns = DIV_ROUND_UP(total, ngood); - if (!ptp->base_sync_valid || (ptp->last_sync_ns < ptp->base_sync_ns)) { - ptp->base_sync_valid = true; - ptp->base_sync_ns = ptp->last_sync_ns; - } - - /* Calculate delay from actual PPS to last_time */ - delta.tv_nsec = - ptp->timeset[last_good].nanoseconds + - last_time->ts_real.tv_nsec - - (ptp->timeset[last_good].host_start & MC_NANOSECOND_MASK); - - /* It is possible that the seconds rolled over between taking - * the start reading and the last value written by the host. The - * timescales are such that a gap of more than one second is never - * expected. - */ - start_sec = ptp->timeset[last_good].host_start >> MC_NANOSECOND_BITS; - last_sec = last_time->ts_real.tv_sec & MC_SECOND_MASK; - if (start_sec != last_sec) { - if (((start_sec + 1) & MC_SECOND_MASK) != last_sec) { - netif_warn(efx, hw, efx->net_dev, - "PTP bad synchronisation seconds\n"); - return -EAGAIN; - } else { - delta.tv_sec = 1; - } - } else { - delta.tv_sec = 0; - } - - ptp->host_time_pps = *last_time; - pps_sub_ts(&ptp->host_time_pps, delta); - - return 0; -} - -/* Synchronize times between the host and the MC */ -static int efx_ptp_synchronize(struct efx_nic *efx, unsigned int num_readings) -{ - struct efx_ptp_data *ptp = efx->ptp_data; - u8 synch_buf[MC_CMD_PTP_OUT_SYNCHRONIZE_LENMAX]; - size_t response_length; - int rc; - unsigned long timeout; - struct pps_event_time last_time = {}; - unsigned int loops = 0; - int *start = ptp->start.addr; - - MCDI_SET_DWORD(synch_buf, PTP_IN_OP, MC_CMD_PTP_OP_SYNCHRONIZE); - MCDI_SET_DWORD(synch_buf, PTP_IN_SYNCHRONIZE_NUMTIMESETS, - num_readings); - MCDI_SET_DWORD(synch_buf, PTP_IN_SYNCHRONIZE_START_ADDR_LO, - (u32)ptp->start.dma_addr); - MCDI_SET_DWORD(synch_buf, PTP_IN_SYNCHRONIZE_START_ADDR_HI, - (u32)((u64)ptp->start.dma_addr >> 32)); - - /* Clear flag that signals MC ready */ - ACCESS_ONCE(*start) = 0; - efx_mcdi_rpc_start(efx, MC_CMD_PTP, synch_buf, - MC_CMD_PTP_IN_SYNCHRONIZE_LEN); - - /* Wait for start from MCDI (or timeout) */ - timeout = jiffies + msecs_to_jiffies(MAX_SYNCHRONISE_WAIT_MS); - while (!ACCESS_ONCE(*start) && (time_before(jiffies, timeout))) { - udelay(20); /* Usually start MCDI execution quickly */ - loops++; - } - - if (ACCESS_ONCE(*start)) - efx_ptp_send_times(efx, &last_time); - - /* Collect results */ - rc = efx_mcdi_rpc_finish(efx, MC_CMD_PTP, - MC_CMD_PTP_IN_SYNCHRONIZE_LEN, - synch_buf, sizeof(synch_buf), - &response_length); - if (rc == 0) - rc = efx_ptp_process_times(efx, synch_buf, response_length, - &last_time); - - return rc; -} - -/* Transmit a PTP packet, via the MCDI interface, to the wire. */ -static int efx_ptp_xmit_skb(struct efx_nic *efx, struct sk_buff *skb) -{ - u8 *txbuf = efx->ptp_data->txbuf; - struct skb_shared_hwtstamps timestamps; - int rc = -EIO; - /* MCDI driver requires word aligned lengths */ - size_t len = ALIGN(MC_CMD_PTP_IN_TRANSMIT_LEN(skb->len), 4); - u8 txtime[MC_CMD_PTP_OUT_TRANSMIT_LEN]; - - MCDI_SET_DWORD(txbuf, PTP_IN_OP, MC_CMD_PTP_OP_TRANSMIT); - MCDI_SET_DWORD(txbuf, PTP_IN_TRANSMIT_LENGTH, skb->len); - if (skb_shinfo(skb)->nr_frags != 0) { - rc = skb_linearize(skb); - if (rc != 0) - goto fail; - } - - if (skb->ip_summed == CHECKSUM_PARTIAL) { - rc = skb_checksum_help(skb); - if (rc != 0) - goto fail; - } - skb_copy_from_linear_data(skb, - &txbuf[MC_CMD_PTP_IN_TRANSMIT_PACKET_OFST], - len); - rc = efx_mcdi_rpc(efx, MC_CMD_PTP, txbuf, len, txtime, - sizeof(txtime), &len); - if (rc != 0) - goto fail; - - memset(×tamps, 0, sizeof(timestamps)); - timestamps.hwtstamp = ktime_set( - MCDI_DWORD(txtime, PTP_OUT_TRANSMIT_SECONDS), - MCDI_DWORD(txtime, PTP_OUT_TRANSMIT_NANOSECONDS)); - - skb_tstamp_tx(skb, ×tamps); - - rc = 0; - -fail: - dev_kfree_skb(skb); - - return rc; -} - -static void efx_ptp_drop_time_expired_events(struct efx_nic *efx) -{ - struct efx_ptp_data *ptp = efx->ptp_data; - struct list_head *cursor; - struct list_head *next; - - /* Drop time-expired events */ - spin_lock_bh(&ptp->evt_lock); - if (!list_empty(&ptp->evt_list)) { - list_for_each_safe(cursor, next, &ptp->evt_list) { - struct efx_ptp_event_rx *evt; - - evt = list_entry(cursor, struct efx_ptp_event_rx, - link); - if (time_after(jiffies, evt->expiry)) { - list_del(&evt->link); - list_add(&evt->link, &ptp->evt_free_list); - netif_warn(efx, hw, efx->net_dev, - "PTP rx event dropped\n"); - } - } - } - spin_unlock_bh(&ptp->evt_lock); -} - -static enum ptp_packet_state efx_ptp_match_rx(struct efx_nic *efx, - struct sk_buff *skb) -{ - struct efx_ptp_data *ptp = efx->ptp_data; - bool evts_waiting; - struct list_head *cursor; - struct list_head *next; - struct efx_ptp_match *match; - enum ptp_packet_state rc = PTP_PACKET_STATE_UNMATCHED; - - spin_lock_bh(&ptp->evt_lock); - evts_waiting = !list_empty(&ptp->evt_list); - spin_unlock_bh(&ptp->evt_lock); - - if (!evts_waiting) - return PTP_PACKET_STATE_UNMATCHED; - - match = (struct efx_ptp_match *)skb->cb; - /* Look for a matching timestamp in the event queue */ - spin_lock_bh(&ptp->evt_lock); - list_for_each_safe(cursor, next, &ptp->evt_list) { - struct efx_ptp_event_rx *evt; - - evt = list_entry(cursor, struct efx_ptp_event_rx, link); - if ((evt->seq0 == match->words[0]) && - (evt->seq1 == match->words[1])) { - struct skb_shared_hwtstamps *timestamps; - - /* Match - add in hardware timestamp */ - timestamps = skb_hwtstamps(skb); - timestamps->hwtstamp = evt->hwtimestamp; - - match->state = PTP_PACKET_STATE_MATCHED; - rc = PTP_PACKET_STATE_MATCHED; - list_del(&evt->link); - list_add(&evt->link, &ptp->evt_free_list); - break; - } - } - spin_unlock_bh(&ptp->evt_lock); - - return rc; -} - -/* Process any queued receive events and corresponding packets - * - * q is returned with all the packets that are ready for delivery. - * true is returned if at least one of those packets requires - * synchronisation. - */ -static bool efx_ptp_process_events(struct efx_nic *efx, struct sk_buff_head *q) -{ - struct efx_ptp_data *ptp = efx->ptp_data; - bool rc = false; - struct sk_buff *skb; - - while ((skb = skb_dequeue(&ptp->rxq))) { - struct efx_ptp_match *match; - - match = (struct efx_ptp_match *)skb->cb; - if (match->state == PTP_PACKET_STATE_MATCH_UNWANTED) { - __skb_queue_tail(q, skb); - } else if (efx_ptp_match_rx(efx, skb) == - PTP_PACKET_STATE_MATCHED) { - rc = true; - __skb_queue_tail(q, skb); - } else if (time_after(jiffies, match->expiry)) { - match->state = PTP_PACKET_STATE_TIMED_OUT; - netif_warn(efx, rx_err, efx->net_dev, - "PTP packet - no timestamp seen\n"); - __skb_queue_tail(q, skb); - } else { - /* Replace unprocessed entry and stop */ - skb_queue_head(&ptp->rxq, skb); - break; - } - } - - return rc; -} - -/* Complete processing of a received packet */ -static inline void efx_ptp_process_rx(struct efx_nic *efx, struct sk_buff *skb) -{ - local_bh_disable(); - netif_receive_skb(skb); - local_bh_enable(); -} - -static int efx_ptp_start(struct efx_nic *efx) -{ - struct efx_ptp_data *ptp = efx->ptp_data; - struct efx_filter_spec rxfilter; - int rc; - - ptp->reset_required = false; - - /* Must filter on both event and general ports to ensure - * that there is no packet re-ordering. - */ - efx_filter_init_rx(&rxfilter, EFX_FILTER_PRI_REQUIRED, 0, - efx_rx_queue_index( - efx_channel_get_rx_queue(ptp->channel))); - rc = efx_filter_set_ipv4_local(&rxfilter, IPPROTO_UDP, - htonl(PTP_ADDRESS), - htons(PTP_EVENT_PORT)); - if (rc != 0) - return rc; - - rc = efx_filter_insert_filter(efx, &rxfilter, true); - if (rc < 0) - return rc; - ptp->rxfilter_event = rc; - - efx_filter_init_rx(&rxfilter, EFX_FILTER_PRI_REQUIRED, 0, - efx_rx_queue_index( - efx_channel_get_rx_queue(ptp->channel))); - rc = efx_filter_set_ipv4_local(&rxfilter, IPPROTO_UDP, - htonl(PTP_ADDRESS), - htons(PTP_GENERAL_PORT)); - if (rc != 0) - goto fail; - - rc = efx_filter_insert_filter(efx, &rxfilter, true); - if (rc < 0) - goto fail; - ptp->rxfilter_general = rc; - - rc = efx_ptp_enable(efx); - if (rc != 0) - goto fail2; - - ptp->evt_frag_idx = 0; - ptp->current_adjfreq = 0; - ptp->rxfilter_installed = true; - - return 0; - -fail2: - efx_filter_remove_id_safe(efx, EFX_FILTER_PRI_REQUIRED, - ptp->rxfilter_general); -fail: - efx_filter_remove_id_safe(efx, EFX_FILTER_PRI_REQUIRED, - ptp->rxfilter_event); - - return rc; -} - -static int efx_ptp_stop(struct efx_nic *efx) -{ - struct efx_ptp_data *ptp = efx->ptp_data; - int rc = efx_ptp_disable(efx); - struct list_head *cursor; - struct list_head *next; - - if (ptp->rxfilter_installed) { - efx_filter_remove_id_safe(efx, EFX_FILTER_PRI_REQUIRED, - ptp->rxfilter_general); - efx_filter_remove_id_safe(efx, EFX_FILTER_PRI_REQUIRED, - ptp->rxfilter_event); - ptp->rxfilter_installed = false; - } - - /* Make sure RX packets are really delivered */ - efx_ptp_deliver_rx_queue(&efx->ptp_data->rxq); - skb_queue_purge(&efx->ptp_data->txq); - - /* Drop any pending receive events */ - spin_lock_bh(&efx->ptp_data->evt_lock); - list_for_each_safe(cursor, next, &efx->ptp_data->evt_list) { - list_del(cursor); - list_add(cursor, &efx->ptp_data->evt_free_list); - } - spin_unlock_bh(&efx->ptp_data->evt_lock); - - return rc; -} - -static void efx_ptp_pps_worker(struct work_struct *work) -{ - struct efx_ptp_data *ptp = - container_of(work, struct efx_ptp_data, pps_work); - struct efx_nic *efx = ptp->channel->efx; - struct ptp_clock_event ptp_evt; - - if (efx_ptp_synchronize(efx, PTP_SYNC_ATTEMPTS)) - return; - - ptp_evt.type = PTP_CLOCK_PPSUSR; - ptp_evt.pps_times = ptp->host_time_pps; - ptp_clock_event(ptp->phc_clock, &ptp_evt); -} - -/* Process any pending transmissions and timestamp any received packets. - */ -static void efx_ptp_worker(struct work_struct *work) -{ - struct efx_ptp_data *ptp_data = - container_of(work, struct efx_ptp_data, work); - struct efx_nic *efx = ptp_data->channel->efx; - struct sk_buff *skb; - struct sk_buff_head tempq; - - if (ptp_data->reset_required) { - efx_ptp_stop(efx); - efx_ptp_start(efx); - return; - } - - efx_ptp_drop_time_expired_events(efx); - - __skb_queue_head_init(&tempq); - if (efx_ptp_process_events(efx, &tempq) || - !skb_queue_empty(&ptp_data->txq)) { - - while ((skb = skb_dequeue(&ptp_data->txq))) - efx_ptp_xmit_skb(efx, skb); - } - - while ((skb = __skb_dequeue(&tempq))) - efx_ptp_process_rx(efx, skb); -} - -/* Initialise PTP channel and state. - * - * Setting core_index to zero causes the queue to be initialised and doesn't - * overlap with 'rxq0' because ptp.c doesn't use skb_record_rx_queue. - */ -static int efx_ptp_probe_channel(struct efx_channel *channel) -{ - struct efx_nic *efx = channel->efx; - struct efx_ptp_data *ptp; - int rc = 0; - unsigned int pos; - - channel->irq_moderation = 0; - channel->rx_queue.core_index = 0; - - ptp = kzalloc(sizeof(struct efx_ptp_data), GFP_KERNEL); - efx->ptp_data = ptp; - if (!efx->ptp_data) - return -ENOMEM; - - rc = efx_nic_alloc_buffer(efx, &ptp->start, sizeof(int)); - if (rc != 0) - goto fail1; - - ptp->channel = channel; - skb_queue_head_init(&ptp->rxq); - skb_queue_head_init(&ptp->txq); - ptp->workwq = create_singlethread_workqueue("sfc_ptp"); - if (!ptp->workwq) { - rc = -ENOMEM; - goto fail2; - } - - INIT_WORK(&ptp->work, efx_ptp_worker); - ptp->config.flags = 0; - ptp->config.tx_type = HWTSTAMP_TX_OFF; - ptp->config.rx_filter = HWTSTAMP_FILTER_NONE; - INIT_LIST_HEAD(&ptp->evt_list); - INIT_LIST_HEAD(&ptp->evt_free_list); - spin_lock_init(&ptp->evt_lock); - for (pos = 0; pos < MAX_RECEIVE_EVENTS; pos++) - list_add(&ptp->rx_evts[pos].link, &ptp->evt_free_list); - - ptp->phc_clock_info.owner = THIS_MODULE; - snprintf(ptp->phc_clock_info.name, - sizeof(ptp->phc_clock_info.name), - "%pm", efx->net_dev->perm_addr); - ptp->phc_clock_info.max_adj = MAX_PPB; - ptp->phc_clock_info.n_alarm = 0; - ptp->phc_clock_info.n_ext_ts = 0; - ptp->phc_clock_info.n_per_out = 0; - ptp->phc_clock_info.pps = 1; - ptp->phc_clock_info.adjfreq = efx_phc_adjfreq; - ptp->phc_clock_info.adjtime = efx_phc_adjtime; - ptp->phc_clock_info.gettime = efx_phc_gettime; - ptp->phc_clock_info.settime = efx_phc_settime; - ptp->phc_clock_info.enable = efx_phc_enable; - - ptp->phc_clock = ptp_clock_register(&ptp->phc_clock_info); - if (!ptp->phc_clock) - goto fail3; - - INIT_WORK(&ptp->pps_work, efx_ptp_pps_worker); - ptp->pps_workwq = create_singlethread_workqueue("sfc_pps"); - if (!ptp->pps_workwq) { - rc = -ENOMEM; - goto fail4; - } - ptp->nic_ts_enabled = false; - - return 0; -fail4: - ptp_clock_unregister(efx->ptp_data->phc_clock); - -fail3: - destroy_workqueue(efx->ptp_data->workwq); - -fail2: - efx_nic_free_buffer(efx, &ptp->start); - -fail1: - kfree(efx->ptp_data); - efx->ptp_data = NULL; - - return rc; -} - -static void efx_ptp_remove_channel(struct efx_channel *channel) -{ - struct efx_nic *efx = channel->efx; - - if (!efx->ptp_data) - return; - - (void)efx_ptp_disable(channel->efx); - - cancel_work_sync(&efx->ptp_data->work); - cancel_work_sync(&efx->ptp_data->pps_work); - - skb_queue_purge(&efx->ptp_data->rxq); - skb_queue_purge(&efx->ptp_data->txq); - - ptp_clock_unregister(efx->ptp_data->phc_clock); - - destroy_workqueue(efx->ptp_data->workwq); - destroy_workqueue(efx->ptp_data->pps_workwq); - - efx_nic_free_buffer(efx, &efx->ptp_data->start); - kfree(efx->ptp_data); -} - -static void efx_ptp_get_channel_name(struct efx_channel *channel, - char *buf, size_t len) -{ - snprintf(buf, len, "%s-ptp", channel->efx->name); -} - -/* Determine whether this packet should be processed by the PTP module - * or transmitted conventionally. - */ -bool efx_ptp_is_ptp_tx(struct efx_nic *efx, struct sk_buff *skb) -{ - return efx->ptp_data && - efx->ptp_data->enabled && - skb->len >= PTP_MIN_LENGTH && - skb->len <= MC_CMD_PTP_IN_TRANSMIT_PACKET_MAXNUM && - likely(skb->protocol == htons(ETH_P_IP)) && - ip_hdr(skb)->protocol == IPPROTO_UDP && - udp_hdr(skb)->dest == htons(PTP_EVENT_PORT); -} - -/* Receive a PTP packet. Packets are queued until the arrival of - * the receive timestamp from the MC - this will probably occur after the - * packet arrival because of the processing in the MC. - */ -static void efx_ptp_rx(struct efx_channel *channel, struct sk_buff *skb) -{ - struct efx_nic *efx = channel->efx; - struct efx_ptp_data *ptp = efx->ptp_data; - struct efx_ptp_match *match = (struct efx_ptp_match *)skb->cb; - u8 *data; - unsigned int version; - - match->expiry = jiffies + msecs_to_jiffies(PKT_EVENT_LIFETIME_MS); - - /* Correct version? */ - if (ptp->mode == MC_CMD_PTP_MODE_V1) { - if (skb->len < PTP_V1_MIN_LENGTH) { - netif_receive_skb(skb); - return; - } - version = ntohs(*(__be16 *)&skb->data[PTP_V1_VERSION_OFFSET]); - if (version != PTP_VERSION_V1) { - netif_receive_skb(skb); - return; - } - } else { - if (skb->len < PTP_V2_MIN_LENGTH) { - netif_receive_skb(skb); - return; - } - version = skb->data[PTP_V2_VERSION_OFFSET]; - - BUG_ON(ptp->mode != MC_CMD_PTP_MODE_V2); - BUILD_BUG_ON(PTP_V1_UUID_OFFSET != PTP_V2_MC_UUID_OFFSET); - BUILD_BUG_ON(PTP_V1_UUID_LENGTH != PTP_V2_MC_UUID_LENGTH); - BUILD_BUG_ON(PTP_V1_SEQUENCE_OFFSET != PTP_V2_SEQUENCE_OFFSET); - BUILD_BUG_ON(PTP_V1_SEQUENCE_LENGTH != PTP_V2_SEQUENCE_LENGTH); - - if ((version & PTP_VERSION_V2_MASK) != PTP_VERSION_V2) { - netif_receive_skb(skb); - return; - } - } - - /* Does this packet require timestamping? */ - if (ntohs(*(__be16 *)&skb->data[PTP_DPORT_OFFSET]) == PTP_EVENT_PORT) { - struct skb_shared_hwtstamps *timestamps; - - match->state = PTP_PACKET_STATE_UNMATCHED; - - /* Clear all timestamps held: filled in later */ - timestamps = skb_hwtstamps(skb); - memset(timestamps, 0, sizeof(*timestamps)); - - /* Extract UUID/Sequence information */ - data = skb->data + PTP_V1_UUID_OFFSET; - match->words[0] = (data[0] | - (data[1] << 8) | - (data[2] << 16) | - (data[3] << 24)); - match->words[1] = (data[4] | - (data[5] << 8) | - (skb->data[PTP_V1_SEQUENCE_OFFSET + - PTP_V1_SEQUENCE_LENGTH - 1] << - 16)); - } else { - match->state = PTP_PACKET_STATE_MATCH_UNWANTED; - } - - skb_queue_tail(&ptp->rxq, skb); - queue_work(ptp->workwq, &ptp->work); -} - -/* Transmit a PTP packet. This has to be transmitted by the MC - * itself, through an MCDI call. MCDI calls aren't permitted - * in the transmit path so defer the actual transmission to a suitable worker. - */ -int efx_ptp_tx(struct efx_nic *efx, struct sk_buff *skb) -{ - struct efx_ptp_data *ptp = efx->ptp_data; - - skb_queue_tail(&ptp->txq, skb); - - if ((udp_hdr(skb)->dest == htons(PTP_EVENT_PORT)) && - (skb->len <= MC_CMD_PTP_IN_TRANSMIT_PACKET_MAXNUM)) - efx_xmit_hwtstamp_pending(skb); - queue_work(ptp->workwq, &ptp->work); - - return NETDEV_TX_OK; -} - -static int efx_ptp_change_mode(struct efx_nic *efx, bool enable_wanted, - unsigned int new_mode) -{ - if ((enable_wanted != efx->ptp_data->enabled) || - (enable_wanted && (efx->ptp_data->mode != new_mode))) { - int rc; - - if (enable_wanted) { - /* Change of mode requires disable */ - if (efx->ptp_data->enabled && - (efx->ptp_data->mode != new_mode)) { - efx->ptp_data->enabled = false; - rc = efx_ptp_stop(efx); - if (rc != 0) - return rc; - } - - /* Set new operating mode and establish - * baseline synchronisation, which must - * succeed. - */ - efx->ptp_data->mode = new_mode; - rc = efx_ptp_start(efx); - if (rc == 0) { - rc = efx_ptp_synchronize(efx, - PTP_SYNC_ATTEMPTS * 2); - if (rc != 0) - efx_ptp_stop(efx); - } - } else { - rc = efx_ptp_stop(efx); - } - - if (rc != 0) - return rc; - - efx->ptp_data->enabled = enable_wanted; - } - - return 0; -} - -static int efx_ptp_ts_init(struct efx_nic *efx, struct hwtstamp_config *init) -{ - bool enable_wanted = false; - unsigned int new_mode; - int rc; - - if (init->flags) - return -EINVAL; - - if ((init->tx_type != HWTSTAMP_TX_OFF) && - (init->tx_type != HWTSTAMP_TX_ON)) - return -ERANGE; - - new_mode = efx->ptp_data->mode; - /* Determine whether any PTP HW operations are required */ - switch (init->rx_filter) { - case HWTSTAMP_FILTER_NONE: - break; - case HWTSTAMP_FILTER_PTP_V1_L4_EVENT: - case HWTSTAMP_FILTER_PTP_V1_L4_SYNC: - case HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ: - init->rx_filter = HWTSTAMP_FILTER_PTP_V1_L4_EVENT; - new_mode = MC_CMD_PTP_MODE_V1; - enable_wanted = true; - break; - case HWTSTAMP_FILTER_PTP_V2_L4_EVENT: - case HWTSTAMP_FILTER_PTP_V2_L4_SYNC: - case HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ: - /* Although these three are accepted only IPV4 packets will be - * timestamped - */ - init->rx_filter = HWTSTAMP_FILTER_PTP_V2_L4_EVENT; - new_mode = MC_CMD_PTP_MODE_V2; - enable_wanted = true; - break; - case HWTSTAMP_FILTER_PTP_V2_EVENT: - case HWTSTAMP_FILTER_PTP_V2_SYNC: - case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ: - case HWTSTAMP_FILTER_PTP_V2_L2_EVENT: - case HWTSTAMP_FILTER_PTP_V2_L2_SYNC: - case HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ: - /* Non-IP + IPv6 timestamping not supported */ - return -ERANGE; - break; - default: - return -ERANGE; - } - - if (init->tx_type != HWTSTAMP_TX_OFF) - enable_wanted = true; - - rc = efx_ptp_change_mode(efx, enable_wanted, new_mode); - if (rc != 0) - return rc; - - efx->ptp_data->config = *init; - - return 0; -} - -int -efx_ptp_get_ts_info(struct net_device *net_dev, struct ethtool_ts_info *ts_info) -{ - struct efx_nic *efx = netdev_priv(net_dev); - struct efx_ptp_data *ptp = efx->ptp_data; - - if (!ptp) - return -EOPNOTSUPP; - - ts_info->so_timestamping = (SOF_TIMESTAMPING_TX_HARDWARE | - SOF_TIMESTAMPING_RX_HARDWARE | - SOF_TIMESTAMPING_RAW_HARDWARE); - ts_info->phc_index = ptp_clock_index(ptp->phc_clock); - ts_info->tx_types = 1 << HWTSTAMP_TX_OFF | 1 << HWTSTAMP_TX_ON; - ts_info->rx_filters = (1 << HWTSTAMP_FILTER_NONE | - 1 << HWTSTAMP_FILTER_PTP_V1_L4_EVENT | - 1 << HWTSTAMP_FILTER_PTP_V1_L4_SYNC | - 1 << HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ | - 1 << HWTSTAMP_FILTER_PTP_V2_L4_EVENT | - 1 << HWTSTAMP_FILTER_PTP_V2_L4_SYNC | - 1 << HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ); - return 0; -} - -int efx_ptp_ioctl(struct efx_nic *efx, struct ifreq *ifr, int cmd) -{ - struct hwtstamp_config config; - int rc; - - /* Not a PTP enabled port */ - if (!efx->ptp_data) - return -EOPNOTSUPP; - - if (copy_from_user(&config, ifr->ifr_data, sizeof(config))) - return -EFAULT; - - rc = efx_ptp_ts_init(efx, &config); - if (rc != 0) - return rc; - - return copy_to_user(ifr->ifr_data, &config, sizeof(config)) - ? -EFAULT : 0; -} - -static void ptp_event_failure(struct efx_nic *efx, int expected_frag_len) -{ - struct efx_ptp_data *ptp = efx->ptp_data; - - netif_err(efx, hw, efx->net_dev, - "PTP unexpected event length: got %d expected %d\n", - ptp->evt_frag_idx, expected_frag_len); - ptp->reset_required = true; - queue_work(ptp->workwq, &ptp->work); -} - -/* Process a completed receive event. Put it on the event queue and - * start worker thread. This is required because event and their - * correspoding packets may come in either order. - */ -static void ptp_event_rx(struct efx_nic *efx, struct efx_ptp_data *ptp) -{ - struct efx_ptp_event_rx *evt = NULL; - - if (ptp->evt_frag_idx != 3) { - ptp_event_failure(efx, 3); - return; - } - - spin_lock_bh(&ptp->evt_lock); - if (!list_empty(&ptp->evt_free_list)) { - evt = list_first_entry(&ptp->evt_free_list, - struct efx_ptp_event_rx, link); - list_del(&evt->link); - - evt->seq0 = EFX_QWORD_FIELD(ptp->evt_frags[2], MCDI_EVENT_DATA); - evt->seq1 = (EFX_QWORD_FIELD(ptp->evt_frags[2], - MCDI_EVENT_SRC) | - (EFX_QWORD_FIELD(ptp->evt_frags[1], - MCDI_EVENT_SRC) << 8) | - (EFX_QWORD_FIELD(ptp->evt_frags[0], - MCDI_EVENT_SRC) << 16)); - evt->hwtimestamp = ktime_set( - EFX_QWORD_FIELD(ptp->evt_frags[0], MCDI_EVENT_DATA), - EFX_QWORD_FIELD(ptp->evt_frags[1], MCDI_EVENT_DATA)); - evt->expiry = jiffies + msecs_to_jiffies(PKT_EVENT_LIFETIME_MS); - list_add_tail(&evt->link, &ptp->evt_list); - - queue_work(ptp->workwq, &ptp->work); - } else { - netif_err(efx, rx_err, efx->net_dev, "No free PTP event"); - } - spin_unlock_bh(&ptp->evt_lock); -} - -static void ptp_event_fault(struct efx_nic *efx, struct efx_ptp_data *ptp) -{ - int code = EFX_QWORD_FIELD(ptp->evt_frags[0], MCDI_EVENT_DATA); - if (ptp->evt_frag_idx != 1) { - ptp_event_failure(efx, 1); - return; - } - - netif_err(efx, hw, efx->net_dev, "PTP error %d\n", code); -} - -static void ptp_event_pps(struct efx_nic *efx, struct efx_ptp_data *ptp) -{ - if (ptp->nic_ts_enabled) - queue_work(ptp->pps_workwq, &ptp->pps_work); -} - -void efx_ptp_event(struct efx_nic *efx, efx_qword_t *ev) -{ - struct efx_ptp_data *ptp = efx->ptp_data; - int code = EFX_QWORD_FIELD(*ev, MCDI_EVENT_CODE); - - if (!ptp->enabled) - return; - - if (ptp->evt_frag_idx == 0) { - ptp->evt_code = code; - } else if (ptp->evt_code != code) { - netif_err(efx, hw, efx->net_dev, - "PTP out of sequence event %d\n", code); - ptp->evt_frag_idx = 0; - } - - ptp->evt_frags[ptp->evt_frag_idx++] = *ev; - if (!MCDI_EVENT_FIELD(*ev, CONT)) { - /* Process resulting event */ - switch (code) { - case MCDI_EVENT_CODE_PTP_RX: - ptp_event_rx(efx, ptp); - break; - case MCDI_EVENT_CODE_PTP_FAULT: - ptp_event_fault(efx, ptp); - break; - case MCDI_EVENT_CODE_PTP_PPS: - ptp_event_pps(efx, ptp); - break; - default: - netif_err(efx, hw, efx->net_dev, - "PTP unknown event %d\n", code); - break; - } - ptp->evt_frag_idx = 0; - } else if (MAX_EVENT_FRAGS == ptp->evt_frag_idx) { - netif_err(efx, hw, efx->net_dev, - "PTP too many event fragments\n"); - ptp->evt_frag_idx = 0; - } -} - -static int efx_phc_adjfreq(struct ptp_clock_info *ptp, s32 delta) -{ - struct efx_ptp_data *ptp_data = container_of(ptp, - struct efx_ptp_data, - phc_clock_info); - struct efx_nic *efx = ptp_data->channel->efx; - u8 inadj[MC_CMD_PTP_IN_ADJUST_LEN]; - s64 adjustment_ns; - int rc; - - if (delta > MAX_PPB) - delta = MAX_PPB; - else if (delta < -MAX_PPB) - delta = -MAX_PPB; - - /* Convert ppb to fixed point ns. */ - adjustment_ns = (((s64)delta * PPB_SCALE_WORD) >> - (PPB_EXTRA_BITS + MAX_PPB_BITS)); - - MCDI_SET_DWORD(inadj, PTP_IN_OP, MC_CMD_PTP_OP_ADJUST); - MCDI_SET_DWORD(inadj, PTP_IN_ADJUST_FREQ_LO, (u32)adjustment_ns); - MCDI_SET_DWORD(inadj, PTP_IN_ADJUST_FREQ_HI, - (u32)(adjustment_ns >> 32)); - MCDI_SET_DWORD(inadj, PTP_IN_ADJUST_SECONDS, 0); - MCDI_SET_DWORD(inadj, PTP_IN_ADJUST_NANOSECONDS, 0); - rc = efx_mcdi_rpc(efx, MC_CMD_PTP, inadj, sizeof(inadj), - NULL, 0, NULL); - if (rc != 0) - return rc; - - ptp_data->current_adjfreq = delta; - return 0; -} - -static int efx_phc_adjtime(struct ptp_clock_info *ptp, s64 delta) -{ - struct efx_ptp_data *ptp_data = container_of(ptp, - struct efx_ptp_data, - phc_clock_info); - struct efx_nic *efx = ptp_data->channel->efx; - struct timespec delta_ts = ns_to_timespec(delta); - u8 inbuf[MC_CMD_PTP_IN_ADJUST_LEN]; - - MCDI_SET_DWORD(inbuf, PTP_IN_OP, MC_CMD_PTP_OP_ADJUST); - MCDI_SET_DWORD(inbuf, PTP_IN_ADJUST_FREQ_LO, 0); - MCDI_SET_DWORD(inbuf, PTP_IN_ADJUST_FREQ_HI, 0); - MCDI_SET_DWORD(inbuf, PTP_IN_ADJUST_SECONDS, (u32)delta_ts.tv_sec); - MCDI_SET_DWORD(inbuf, PTP_IN_ADJUST_NANOSECONDS, (u32)delta_ts.tv_nsec); - return efx_mcdi_rpc(efx, MC_CMD_PTP, inbuf, sizeof(inbuf), - NULL, 0, NULL); -} - -static int efx_phc_gettime(struct ptp_clock_info *ptp, struct timespec *ts) -{ - struct efx_ptp_data *ptp_data = container_of(ptp, - struct efx_ptp_data, - phc_clock_info); - struct efx_nic *efx = ptp_data->channel->efx; - u8 inbuf[MC_CMD_PTP_IN_READ_NIC_TIME_LEN]; - u8 outbuf[MC_CMD_PTP_OUT_READ_NIC_TIME_LEN]; - int rc; - - MCDI_SET_DWORD(inbuf, PTP_IN_OP, MC_CMD_PTP_OP_READ_NIC_TIME); - - rc = efx_mcdi_rpc(efx, MC_CMD_PTP, inbuf, sizeof(inbuf), - outbuf, sizeof(outbuf), NULL); - if (rc != 0) - return rc; - - ts->tv_sec = MCDI_DWORD(outbuf, PTP_OUT_READ_NIC_TIME_SECONDS); - ts->tv_nsec = MCDI_DWORD(outbuf, PTP_OUT_READ_NIC_TIME_NANOSECONDS); - return 0; -} - -static int efx_phc_settime(struct ptp_clock_info *ptp, - const struct timespec *e_ts) -{ - /* Get the current NIC time, efx_phc_gettime. - * Subtract from the desired time to get the offset - * call efx_phc_adjtime with the offset - */ - int rc; - struct timespec time_now; - struct timespec delta; - - rc = efx_phc_gettime(ptp, &time_now); - if (rc != 0) - return rc; - - delta = timespec_sub(*e_ts, time_now); - - efx_phc_adjtime(ptp, timespec_to_ns(&delta)); - if (rc != 0) - return rc; - - return 0; -} - -static int efx_phc_enable(struct ptp_clock_info *ptp, - struct ptp_clock_request *request, - int enable) -{ - struct efx_ptp_data *ptp_data = container_of(ptp, - struct efx_ptp_data, - phc_clock_info); - if (request->type != PTP_CLK_REQ_PPS) - return -EOPNOTSUPP; - - ptp_data->nic_ts_enabled = !!enable; - return 0; -} - -static const struct efx_channel_type efx_ptp_channel_type = { - .handle_no_channel = efx_ptp_handle_no_channel, - .pre_probe = efx_ptp_probe_channel, - .post_remove = efx_ptp_remove_channel, - .get_name = efx_ptp_get_channel_name, - /* no copy operation; there is no need to reallocate this channel */ - .receive_skb = efx_ptp_rx, - .keep_eventq = false, -}; - -void efx_ptp_probe(struct efx_nic *efx) -{ - /* Check whether PTP is implemented on this NIC. The DISABLE - * operation will succeed if and only if it is implemented. - */ - if (efx_ptp_disable(efx) == 0) - efx->extra_channel_type[EFX_EXTRA_CHANNEL_PTP] = - &efx_ptp_channel_type; -} diff --git a/trunk/drivers/net/ethernet/sfc/rx.c b/trunk/drivers/net/ethernet/sfc/rx.c index 9e0ad1b75c33..719319b89d7a 100644 --- a/trunk/drivers/net/ethernet/sfc/rx.c +++ b/trunk/drivers/net/ethernet/sfc/rx.c @@ -479,7 +479,7 @@ static void efx_rx_packet_gro(struct efx_channel *channel, skb->ip_summed = ((rx_buf->flags & EFX_RX_PKT_CSUMMED) ? CHECKSUM_UNNECESSARY : CHECKSUM_NONE); - skb_record_rx_queue(skb, channel->rx_queue.core_index); + skb_record_rx_queue(skb, channel->channel); gro_result = napi_gro_frags(napi); } else { @@ -571,14 +571,8 @@ static void efx_rx_deliver(struct efx_channel *channel, /* Set the SKB flags */ skb_checksum_none_assert(skb); - /* Record the rx_queue */ - skb_record_rx_queue(skb, channel->rx_queue.core_index); - /* Pass the packet up */ - if (channel->type->receive_skb) - channel->type->receive_skb(channel, skb); - else - netif_receive_skb(skb); + netif_receive_skb(skb); /* Update allocation strategy method */ channel->rx_alloc_level += RX_ALLOC_FACTOR_SKB; @@ -614,14 +608,13 @@ void __efx_rx_packet(struct efx_channel *channel, struct efx_rx_buffer *rx_buf) * at the ethernet header */ skb->protocol = eth_type_trans(skb, efx->net_dev); - skb_record_rx_queue(skb, channel->rx_queue.core_index); + skb_record_rx_queue(skb, channel->channel); } if (unlikely(!(efx->net_dev->features & NETIF_F_RXCSUM))) rx_buf->flags &= ~EFX_RX_PKT_CSUMMED; - if (likely(rx_buf->flags & (EFX_RX_BUF_PAGE | EFX_RX_PKT_CSUMMED)) && - !channel->type->receive_skb) + if (likely(rx_buf->flags & (EFX_RX_BUF_PAGE | EFX_RX_PKT_CSUMMED))) efx_rx_packet_gro(channel, rx_buf, eh); else efx_rx_deliver(channel, rx_buf); @@ -631,11 +624,6 @@ void efx_rx_strategy(struct efx_channel *channel) { enum efx_rx_alloc_method method = rx_alloc_method; - if (channel->type->receive_skb) { - channel->rx_alloc_push_pages = false; - return; - } - /* Only makes sense to use page based allocation if GRO is enabled */ if (!(channel->efx->net_dev->features & NETIF_F_GRO)) { method = RX_ALLOC_METHOD_SKB; diff --git a/trunk/drivers/net/ethernet/sfc/siena.c b/trunk/drivers/net/ethernet/sfc/siena.c index 84b41bf08a38..6bafd216e55e 100644 --- a/trunk/drivers/net/ethernet/sfc/siena.c +++ b/trunk/drivers/net/ethernet/sfc/siena.c @@ -335,7 +335,6 @@ static int siena_probe_nic(struct efx_nic *efx) goto fail5; efx_sriov_probe(efx); - efx_ptp_probe(efx); return 0; diff --git a/trunk/drivers/net/ethernet/sfc/siena_sriov.c b/trunk/drivers/net/ethernet/sfc/siena_sriov.c index a8f48a455849..9cb3b84ecae9 100644 --- a/trunk/drivers/net/ethernet/sfc/siena_sriov.c +++ b/trunk/drivers/net/ethernet/sfc/siena_sriov.c @@ -21,9 +21,6 @@ /* Number of longs required to track all the VIs in a VF */ #define VI_MASK_LENGTH BITS_TO_LONGS(1 << EFX_VI_SCALE_MAX) -/* Maximum number of RX queues supported */ -#define VF_MAX_RX_QUEUES 63 - /** * enum efx_vf_tx_filter_mode - TX MAC filtering behaviour * @VF_TX_FILTER_OFF: Disabled @@ -581,7 +578,6 @@ static int efx_vfdi_init_rxq(struct efx_vf *vf) efx_oword_t reg; if (bad_vf_index(efx, vf_evq) || bad_vf_index(efx, vf_rxq) || - vf_rxq >= VF_MAX_RX_QUEUES || bad_buf_count(buf_count, EFX_MAX_DMAQ_SIZE)) { if (net_ratelimit()) netif_err(efx, hw, efx->net_dev, @@ -687,9 +683,6 @@ static int efx_vfdi_fini_all_queues(struct efx_vf *vf) __le32 *rxqs; int rc; - BUILD_BUG_ON(VF_MAX_RX_QUEUES > - MC_CMD_FLUSH_RX_QUEUES_IN_QID_OFST_MAXNUM); - rxqs = kmalloc(count * sizeof(*rxqs), GFP_KERNEL); if (rxqs == NULL) return VFDI_RC_ENOMEM; diff --git a/trunk/drivers/net/ethernet/sfc/tx.c b/trunk/drivers/net/ethernet/sfc/tx.c index 5e090e54298e..ebca75ed78dc 100644 --- a/trunk/drivers/net/ethernet/sfc/tx.c +++ b/trunk/drivers/net/ethernet/sfc/tx.c @@ -339,12 +339,6 @@ netdev_tx_t efx_hard_start_xmit(struct sk_buff *skb, EFX_WARN_ON_PARANOID(!netif_device_present(net_dev)); - /* PTP "event" packet */ - if (unlikely(efx_xmit_with_hwtstamp(skb)) && - unlikely(efx_ptp_is_ptp_tx(efx, skb))) { - return efx_ptp_tx(efx, skb); - } - index = skb_get_queue_mapping(skb); type = skb->ip_summed == CHECKSUM_PARTIAL ? EFX_TXQ_TYPE_OFFLOAD : 0; if (index >= efx->n_tx_channels) { diff --git a/trunk/drivers/net/usb/asix_devices.c b/trunk/drivers/net/usb/asix_devices.c index 8d5fdf103bcd..4fd48df6b989 100644 --- a/trunk/drivers/net/usb/asix_devices.c +++ b/trunk/drivers/net/usb/asix_devices.c @@ -221,8 +221,7 @@ static int ax88172_bind(struct usbnet *dev, struct usb_interface *intf) /* Get the MAC address */ ret = asix_read_cmd(dev, AX88172_CMD_READ_NODE_ID, 0, 0, ETH_ALEN, buf); if (ret < 0) { - netdev_dbg(dev->net, "read AX_CMD_READ_NODE_ID failed: %d\n", - ret); + dbg("read AX_CMD_READ_NODE_ID failed: %d", ret); goto out; } memcpy(dev->net->dev_addr, buf, ETH_ALEN); @@ -304,7 +303,7 @@ static int ax88772_reset(struct usbnet *dev) ret = asix_write_cmd(dev, AX_CMD_SW_PHY_SELECT, embd_phy, 0, 0, NULL); if (ret < 0) { - netdev_dbg(dev->net, "Select PHY #1 failed: %d\n", ret); + dbg("Select PHY #1 failed: %d", ret); goto out; } @@ -332,13 +331,13 @@ static int ax88772_reset(struct usbnet *dev) msleep(150); rx_ctl = asix_read_rx_ctl(dev); - netdev_dbg(dev->net, "RX_CTL is 0x%04x after software reset\n", rx_ctl); + dbg("RX_CTL is 0x%04x after software reset", rx_ctl); ret = asix_write_rx_ctl(dev, 0x0000); if (ret < 0) goto out; rx_ctl = asix_read_rx_ctl(dev); - netdev_dbg(dev->net, "RX_CTL is 0x%04x setting to 0x0000\n", rx_ctl); + dbg("RX_CTL is 0x%04x setting to 0x0000", rx_ctl); ret = asix_sw_reset(dev, AX_SWRESET_PRL); if (ret < 0) @@ -365,7 +364,7 @@ static int ax88772_reset(struct usbnet *dev) AX88772_IPG0_DEFAULT | AX88772_IPG1_DEFAULT, AX88772_IPG2_DEFAULT, 0, NULL); if (ret < 0) { - netdev_dbg(dev->net, "Write IPG,IPG1,IPG2 failed: %d\n", ret); + dbg("Write IPG,IPG1,IPG2 failed: %d", ret); goto out; } @@ -382,13 +381,10 @@ static int ax88772_reset(struct usbnet *dev) goto out; rx_ctl = asix_read_rx_ctl(dev); - netdev_dbg(dev->net, "RX_CTL is 0x%04x after all initializations\n", - rx_ctl); + dbg("RX_CTL is 0x%04x after all initializations", rx_ctl); rx_ctl = asix_read_medium_status(dev); - netdev_dbg(dev->net, - "Medium Status is 0x%04x after all initializations\n", - rx_ctl); + dbg("Medium Status is 0x%04x after all initializations", rx_ctl); return 0; @@ -420,7 +416,7 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf) /* Get the MAC address */ ret = asix_read_cmd(dev, AX_CMD_READ_NODE_ID, 0, 0, ETH_ALEN, buf); if (ret < 0) { - netdev_dbg(dev->net, "Failed to read MAC address: %d\n", ret); + dbg("Failed to read MAC address: %d", ret); return ret; } memcpy(dev->net->dev_addr, buf, ETH_ALEN); @@ -443,7 +439,7 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf) /* Reset the PHY to normal operation mode */ ret = asix_write_cmd(dev, AX_CMD_SW_PHY_SELECT, embd_phy, 0, 0, NULL); if (ret < 0) { - netdev_dbg(dev->net, "Select PHY #1 failed: %d\n", ret); + dbg("Select PHY #1 failed: %d", ret); return ret; } @@ -463,7 +459,7 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf) /* Read PHYID register *AFTER* the PHY was reset properly */ phyid = asix_get_phyid(dev); - netdev_dbg(dev->net, "PHYID=0x%08x\n", phyid); + dbg("PHYID=0x%08x", phyid); /* Asix framing packs multiple eth frames into a 2K usb bulk transfer */ if (dev->driver_info->flags & FLAG_FRAMING_AX) { @@ -579,13 +575,13 @@ static int ax88178_reset(struct usbnet *dev) u32 phyid; asix_read_cmd(dev, AX_CMD_READ_GPIOS, 0, 0, 1, &status); - netdev_dbg(dev->net, "GPIO Status: 0x%04x\n", status); + dbg("GPIO Status: 0x%04x", status); asix_write_cmd(dev, AX_CMD_WRITE_ENABLE, 0, 0, 0, NULL); asix_read_cmd(dev, AX_CMD_READ_EEPROM, 0x0017, 0, 2, &eeprom); asix_write_cmd(dev, AX_CMD_WRITE_DISABLE, 0, 0, 0, NULL); - netdev_dbg(dev->net, "EEPROM index 0x17 is 0x%04x\n", eeprom); + dbg("EEPROM index 0x17 is 0x%04x", eeprom); if (eeprom == cpu_to_le16(0xffff)) { data->phymode = PHY_MODE_MARVELL; @@ -596,7 +592,7 @@ static int ax88178_reset(struct usbnet *dev) data->ledmode = le16_to_cpu(eeprom) >> 8; gpio0 = (le16_to_cpu(eeprom) & 0x80) ? 0 : 1; } - netdev_dbg(dev->net, "GPIO0: %d, PhyMode: %d\n", gpio0, data->phymode); + dbg("GPIO0: %d, PhyMode: %d", gpio0, data->phymode); /* Power up external GigaPHY through AX88178 GPIO pin */ asix_write_gpio(dev, AX_GPIO_RSE | AX_GPIO_GPO_1 | AX_GPIO_GPO1EN, 40); @@ -605,14 +601,14 @@ static int ax88178_reset(struct usbnet *dev) asix_write_gpio(dev, 0x001c, 300); asix_write_gpio(dev, 0x003c, 30); } else { - netdev_dbg(dev->net, "gpio phymode == 1 path\n"); + dbg("gpio phymode == 1 path"); asix_write_gpio(dev, AX_GPIO_GPO1EN, 30); asix_write_gpio(dev, AX_GPIO_GPO1EN | AX_GPIO_GPO_1, 30); } /* Read PHYID register *AFTER* powering up PHY */ phyid = asix_get_phyid(dev); - netdev_dbg(dev->net, "PHYID=0x%08x\n", phyid); + dbg("PHYID=0x%08x", phyid); /* Set AX88178 to enable MII/GMII/RGMII interface for external PHY */ asix_write_cmd(dev, AX_CMD_SW_PHY_SELECT, 0, 0, 0, NULL); @@ -774,7 +770,7 @@ static int ax88178_bind(struct usbnet *dev, struct usb_interface *intf) /* Get the MAC address */ ret = asix_read_cmd(dev, AX_CMD_READ_NODE_ID, 0, 0, ETH_ALEN, buf); if (ret < 0) { - netdev_dbg(dev->net, "Failed to read MAC address: %d\n", ret); + dbg("Failed to read MAC address: %d", ret); return ret; } memcpy(dev->net->dev_addr, buf, ETH_ALEN); diff --git a/trunk/drivers/net/usb/catc.c b/trunk/drivers/net/usb/catc.c index 18d9579123ea..26c5bebd9eca 100644 --- a/trunk/drivers/net/usb/catc.c +++ b/trunk/drivers/net/usb/catc.c @@ -236,8 +236,7 @@ static void catc_rx_done(struct urb *urb) } if (status) { - dev_dbg(&urb->dev->dev, "rx_done, status %d, length %d\n", - status, urb->actual_length); + dbg("rx_done, status %d, length %d", status, urb->actual_length); return; } @@ -276,11 +275,10 @@ static void catc_rx_done(struct urb *urb) if (atomic_read(&catc->recq_sz)) { int state; atomic_dec(&catc->recq_sz); - netdev_dbg(catc->netdev, "getting extra packet\n"); + dbg("getting extra packet"); urb->dev = catc->usbdev; if ((state = usb_submit_urb(urb, GFP_ATOMIC)) < 0) { - netdev_dbg(catc->netdev, - "submit(rx_urb) status %d\n", state); + dbg("submit(rx_urb) status %d", state); } } else { clear_bit(RX_RUNNING, &catc->flags); @@ -319,20 +317,18 @@ static void catc_irq_done(struct urb *urb) return; /* -EPIPE: should clear the halt */ default: /* error */ - dev_dbg(&urb->dev->dev, - "irq_done, status %d, data %02x %02x.\n", - status, data[0], data[1]); + dbg("irq_done, status %d, data %02x %02x.", status, data[0], data[1]); goto resubmit; } if (linksts == LinkGood) { netif_carrier_on(catc->netdev); - netdev_dbg(catc->netdev, "link ok\n"); + dbg("link ok"); } if (linksts == LinkBad) { netif_carrier_off(catc->netdev); - netdev_dbg(catc->netdev, "link bad\n"); + dbg("link bad"); } if (hasdata) { @@ -389,7 +385,7 @@ static void catc_tx_done(struct urb *urb) int r, status = urb->status; if (status == -ECONNRESET) { - dev_dbg(&urb->dev->dev, "Tx Reset.\n"); + dbg("Tx Reset."); urb->status = 0; catc->netdev->trans_start = jiffies; catc->netdev->stats.tx_errors++; @@ -399,8 +395,7 @@ static void catc_tx_done(struct urb *urb) } if (status) { - dev_dbg(&urb->dev->dev, "tx_done, status %d, length %d\n", - status, urb->actual_length); + dbg("tx_done, status %d, length %d", status, urb->actual_length); return; } @@ -516,8 +511,7 @@ static void catc_ctrl_done(struct urb *urb) int status = urb->status; if (status) - dev_dbg(&urb->dev->dev, "ctrl_done, status %d, len %d.\n", - status, urb->actual_length); + dbg("ctrl_done, status %d, len %d.", status, urb->actual_length); spin_lock_irqsave(&catc->ctrl_lock, flags); @@ -673,9 +667,7 @@ static void catc_set_multicast_list(struct net_device *netdev) f5u011_mchash_async(catc, catc->multicast); if (catc->rxmode[0] != rx) { catc->rxmode[0] = rx; - netdev_dbg(catc->netdev, - "Setting RX mode to %2.2X %2.2X\n", - catc->rxmode[0], catc->rxmode[1]); + dbg("Setting RX mode to %2.2X %2.2X", catc->rxmode[0], catc->rxmode[1]); f5u011_rxmode_async(catc, catc->rxmode); } } @@ -774,7 +766,6 @@ static const struct net_device_ops catc_netdev_ops = { static int catc_probe(struct usb_interface *intf, const struct usb_device_id *id) { - struct device *dev = &intf->dev; struct usb_device *usbdev = interface_to_usbdev(intf); struct net_device *netdev; struct catc *catc; @@ -783,7 +774,7 @@ static int catc_probe(struct usb_interface *intf, const struct usb_device_id *id if (usb_set_interface(usbdev, intf->altsetting->desc.bInterfaceNumber, 1)) { - dev_err(dev, "Can't set altsetting 1.\n"); + dev_err(&intf->dev, "Can't set altsetting 1.\n"); return -EIO; } @@ -826,7 +817,7 @@ static int catc_probe(struct usb_interface *intf, const struct usb_device_id *id if (le16_to_cpu(usbdev->descriptor.idVendor) == 0x0423 && le16_to_cpu(usbdev->descriptor.idProduct) == 0xa && le16_to_cpu(catc->usbdev->descriptor.bcdDevice) == 0x0130) { - dev_dbg(dev, "Testing for f5u011\n"); + dbg("Testing for f5u011"); catc->is_f5u011 = 1; atomic_set(&catc->recq_sz, 0); pktsz = RX_PKT_SZ; @@ -847,7 +838,7 @@ static int catc_probe(struct usb_interface *intf, const struct usb_device_id *id catc->irq_buf, 2, catc_irq_done, catc, 1); if (!catc->is_f5u011) { - dev_dbg(dev, "Checking memory size\n"); + dbg("Checking memory size\n"); i = 0x12345678; catc_write_mem(catc, 0x7a80, &i, 4); @@ -859,7 +850,7 @@ static int catc_probe(struct usb_interface *intf, const struct usb_device_id *id case 0x12345678: catc_set_reg(catc, TxBufCount, 8); catc_set_reg(catc, RxBufCount, 32); - dev_dbg(dev, "64k Memory\n"); + dbg("64k Memory\n"); break; default: dev_warn(&intf->dev, @@ -867,49 +858,49 @@ static int catc_probe(struct usb_interface *intf, const struct usb_device_id *id case 0x87654321: catc_set_reg(catc, TxBufCount, 4); catc_set_reg(catc, RxBufCount, 16); - dev_dbg(dev, "32k Memory\n"); + dbg("32k Memory\n"); break; } - dev_dbg(dev, "Getting MAC from SEEROM.\n"); + dbg("Getting MAC from SEEROM."); catc_get_mac(catc, netdev->dev_addr); - dev_dbg(dev, "Setting MAC into registers.\n"); + dbg("Setting MAC into registers."); for (i = 0; i < 6; i++) catc_set_reg(catc, StationAddr0 - i, netdev->dev_addr[i]); - dev_dbg(dev, "Filling the multicast list.\n"); + dbg("Filling the multicast list."); memset(broadcast, 0xff, 6); catc_multicast(broadcast, catc->multicast); catc_multicast(netdev->dev_addr, catc->multicast); catc_write_mem(catc, 0xfa80, catc->multicast, 64); - dev_dbg(dev, "Clearing error counters.\n"); + dbg("Clearing error counters."); for (i = 0; i < 8; i++) catc_set_reg(catc, EthStats + i, 0); catc->last_stats = jiffies; - dev_dbg(dev, "Enabling.\n"); + dbg("Enabling."); catc_set_reg(catc, MaxBurst, RX_MAX_BURST); catc_set_reg(catc, OpModes, OpTxMerge | OpRxMerge | OpLenInclude | Op3MemWaits); catc_set_reg(catc, LEDCtrl, LEDLink); catc_set_reg(catc, RxUnit, RxEnable | RxPolarity | RxMultiCast); } else { - dev_dbg(dev, "Performing reset\n"); + dbg("Performing reset\n"); catc_reset(catc); catc_get_mac(catc, netdev->dev_addr); - dev_dbg(dev, "Setting RX Mode\n"); + dbg("Setting RX Mode"); catc->rxmode[0] = RxEnable | RxPolarity | RxMultiCast; catc->rxmode[1] = 0; f5u011_rxmode(catc, catc->rxmode); } - dev_dbg(dev, "Init done.\n"); + dbg("Init done."); printk(KERN_INFO "%s: %s USB Ethernet at usb-%s-%s, %pM.\n", netdev->name, (catc->is_f5u011) ? "Belkin F5U011" : "CATC EL1210A NetMate", usbdev->bus->bus_name, usbdev->devpath, netdev->dev_addr); diff --git a/trunk/drivers/net/usb/gl620a.c b/trunk/drivers/net/usb/gl620a.c index a7e3f4e55bf3..db3c8021f2a3 100644 --- a/trunk/drivers/net/usb/gl620a.c +++ b/trunk/drivers/net/usb/gl620a.c @@ -91,9 +91,7 @@ static int genelink_rx_fixup(struct usbnet *dev, struct sk_buff *skb) // get the packet count of the received skb count = le32_to_cpu(header->packet_count); if (count > GL_MAX_TRANSMIT_PACKETS) { - netdev_dbg(dev->net, - "genelink: invalid received packet count %u\n", - count); + dbg("genelink: invalid received packet count %u", count); return 0; } @@ -109,8 +107,7 @@ static int genelink_rx_fixup(struct usbnet *dev, struct sk_buff *skb) // this may be a broken packet if (size > GL_MAX_PACKET_LEN) { - netdev_dbg(dev->net, "genelink: invalid rx length %d\n", - size); + dbg("genelink: invalid rx length %d", size); return 0; } @@ -136,8 +133,7 @@ static int genelink_rx_fixup(struct usbnet *dev, struct sk_buff *skb) skb_pull(skb, 4); if (skb->len > GL_MAX_PACKET_LEN) { - netdev_dbg(dev->net, "genelink: invalid rx length %d\n", - skb->len); + dbg("genelink: invalid rx length %d", skb->len); return 0; } return 1; diff --git a/trunk/drivers/net/usb/kaweth.c b/trunk/drivers/net/usb/kaweth.c index c75e11e1b385..c3d03490c97d 100644 --- a/trunk/drivers/net/usb/kaweth.c +++ b/trunk/drivers/net/usb/kaweth.c @@ -267,16 +267,19 @@ static int kaweth_control(struct kaweth_device *kaweth, struct usb_ctrlrequest *dr; int retval; - netdev_dbg(kaweth->net, "kaweth_control()\n"); + dbg("kaweth_control()"); if(in_interrupt()) { - netdev_dbg(kaweth->net, "in_interrupt()\n"); + dbg("in_interrupt()"); return -EBUSY; } dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_ATOMIC); - if (!dr) + + if (!dr) { + dbg("kmalloc() failed"); return -ENOMEM; + } dr->bRequestType = requesttype; dr->bRequest = request; @@ -302,7 +305,7 @@ static int kaweth_read_configuration(struct kaweth_device *kaweth) { int retval; - netdev_dbg(kaweth->net, "Reading kaweth configuration\n"); + dbg("Reading kaweth configuration"); retval = kaweth_control(kaweth, usb_rcvctrlpipe(kaweth->dev, 0), @@ -324,7 +327,7 @@ static int kaweth_set_urb_size(struct kaweth_device *kaweth, __u16 urb_size) { int retval; - netdev_dbg(kaweth->net, "Setting URB size to %d\n", (unsigned)urb_size); + dbg("Setting URB size to %d", (unsigned)urb_size); retval = kaweth_control(kaweth, usb_sndctrlpipe(kaweth->dev, 0), @@ -346,7 +349,7 @@ static int kaweth_set_sofs_wait(struct kaweth_device *kaweth, __u16 sofs_wait) { int retval; - netdev_dbg(kaweth->net, "Set SOFS wait to %d\n", (unsigned)sofs_wait); + dbg("Set SOFS wait to %d", (unsigned)sofs_wait); retval = kaweth_control(kaweth, usb_sndctrlpipe(kaweth->dev, 0), @@ -369,8 +372,7 @@ static int kaweth_set_receive_filter(struct kaweth_device *kaweth, { int retval; - netdev_dbg(kaweth->net, "Set receive filter to %d\n", - (unsigned)receive_filter); + dbg("Set receive filter to %d", (unsigned)receive_filter); retval = kaweth_control(kaweth, usb_sndctrlpipe(kaweth->dev, 0), @@ -419,13 +421,12 @@ static int kaweth_download_firmware(struct kaweth_device *kaweth, kaweth->firmware_buf[4] = type; kaweth->firmware_buf[5] = interrupt; - netdev_dbg(kaweth->net, "High: %i, Low:%i\n", kaweth->firmware_buf[3], + dbg("High: %i, Low:%i", kaweth->firmware_buf[3], kaweth->firmware_buf[2]); - netdev_dbg(kaweth->net, - "Downloading firmware at %p to kaweth device at %p\n", - fw->data, kaweth); - netdev_dbg(kaweth->net, "Firmware length: %d\n", data_len); + dbg("Downloading firmware at %p to kaweth device at %p", + fw->data, kaweth); + dbg("Firmware length: %d", data_len); return kaweth_control(kaweth, usb_sndctrlpipe(kaweth->dev, 0), @@ -453,7 +454,7 @@ static int kaweth_trigger_firmware(struct kaweth_device *kaweth, kaweth->firmware_buf[6] = 0x00; kaweth->firmware_buf[7] = 0x00; - netdev_dbg(kaweth->net, "Triggering firmware\n"); + dbg("Triggering firmware"); return kaweth_control(kaweth, usb_sndctrlpipe(kaweth->dev, 0), @@ -473,11 +474,11 @@ static int kaweth_reset(struct kaweth_device *kaweth) { int result; - netdev_dbg(kaweth->net, "kaweth_reset(%p)\n", kaweth); + dbg("kaweth_reset(%p)", kaweth); result = usb_reset_configuration(kaweth->dev); mdelay(10); - netdev_dbg(kaweth->net, "kaweth_reset() returns %d.\n", result); + dbg("kaweth_reset() returns %d.",result); return result; } @@ -594,7 +595,6 @@ static void kaweth_async_set_rx_mode(struct kaweth_device *kaweth); ****************************************************************/ static void kaweth_usb_receive(struct urb *urb) { - struct device *dev = &urb->dev->dev; struct kaweth_device *kaweth = urb->context; struct net_device *net = kaweth->net; int status = urb->status; @@ -610,25 +610,25 @@ static void kaweth_usb_receive(struct urb *urb) kaweth->stats.rx_errors++; kaweth->end = 1; wake_up(&kaweth->term_wait); - dev_dbg(dev, "Status was -EPIPE.\n"); + dbg("Status was -EPIPE."); return; } if (unlikely(status == -ECONNRESET || status == -ESHUTDOWN)) { /* we are killed - set a flag and wake the disconnect handler */ kaweth->end = 1; wake_up(&kaweth->term_wait); - dev_dbg(dev, "Status was -ECONNRESET or -ESHUTDOWN.\n"); + dbg("Status was -ECONNRESET or -ESHUTDOWN."); return; } if (unlikely(status == -EPROTO || status == -ETIME || status == -EILSEQ)) { kaweth->stats.rx_errors++; - dev_dbg(dev, "Status was -EPROTO, -ETIME, or -EILSEQ.\n"); + dbg("Status was -EPROTO, -ETIME, or -EILSEQ."); return; } if (unlikely(status == -EOVERFLOW)) { kaweth->stats.rx_errors++; - dev_dbg(dev, "Status was -EOVERFLOW.\n"); + dbg("Status was -EOVERFLOW."); } spin_lock(&kaweth->device_lock); if (IS_BLOCKED(kaweth->status)) { @@ -687,7 +687,7 @@ static int kaweth_open(struct net_device *net) struct kaweth_device *kaweth = netdev_priv(net); int res; - netdev_dbg(kaweth->net, "Opening network device.\n"); + dbg("Opening network device."); res = usb_autopm_get_interface(kaweth->intf); if (res) { @@ -787,8 +787,7 @@ static void kaweth_usb_transmit_complete(struct urb *urb) if (unlikely(status != 0)) if (status != -ENOENT) - dev_dbg(&urb->dev->dev, "%s: TX status %d.\n", - kaweth->net->name, status); + dbg("%s: TX status %d.", kaweth->net->name, status); netif_wake_queue(kaweth->net); dev_kfree_skb_irq(skb); @@ -872,7 +871,7 @@ static void kaweth_set_rx_mode(struct net_device *net) KAWETH_PACKET_FILTER_BROADCAST | KAWETH_PACKET_FILTER_MULTICAST; - netdev_dbg(net, "Setting Rx mode to %d\n", packet_filter_bitmap); + dbg("Setting Rx mode to %d", packet_filter_bitmap); netif_stop_queue(net); @@ -917,8 +916,7 @@ static void kaweth_async_set_rx_mode(struct kaweth_device *kaweth) result); } else { - netdev_dbg(kaweth->net, "Set Rx mode to %d\n", - packet_filter_bitmap); + dbg("Set Rx mode to %d", packet_filter_bitmap); } } @@ -953,7 +951,7 @@ static int kaweth_suspend(struct usb_interface *intf, pm_message_t message) struct kaweth_device *kaweth = usb_get_intfdata(intf); unsigned long flags; - dev_dbg(&intf->dev, "Suspending device\n"); + dbg("Suspending device"); spin_lock_irqsave(&kaweth->device_lock, flags); kaweth->status |= KAWETH_STATUS_SUSPENDING; spin_unlock_irqrestore(&kaweth->device_lock, flags); @@ -970,7 +968,7 @@ static int kaweth_resume(struct usb_interface *intf) struct kaweth_device *kaweth = usb_get_intfdata(intf); unsigned long flags; - dev_dbg(&intf->dev, "Resuming device\n"); + dbg("Resuming device"); spin_lock_irqsave(&kaweth->device_lock, flags); kaweth->status &= ~KAWETH_STATUS_SUSPENDING; spin_unlock_irqrestore(&kaweth->device_lock, flags); @@ -1005,37 +1003,36 @@ static int kaweth_probe( const struct usb_device_id *id /* from id_table */ ) { - struct device *dev = &intf->dev; - struct usb_device *udev = interface_to_usbdev(intf); + struct usb_device *dev = interface_to_usbdev(intf); struct kaweth_device *kaweth; struct net_device *netdev; const eth_addr_t bcast_addr = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; int result = 0; - dev_dbg(dev, - "Kawasaki Device Probe (Device number:%d): 0x%4.4x:0x%4.4x:0x%4.4x\n", - udev->devnum, le16_to_cpu(udev->descriptor.idVendor), - le16_to_cpu(udev->descriptor.idProduct), - le16_to_cpu(udev->descriptor.bcdDevice)); + dbg("Kawasaki Device Probe (Device number:%d): 0x%4.4x:0x%4.4x:0x%4.4x", + dev->devnum, + le16_to_cpu(dev->descriptor.idVendor), + le16_to_cpu(dev->descriptor.idProduct), + le16_to_cpu(dev->descriptor.bcdDevice)); - dev_dbg(dev, "Device at %p\n", udev); + dbg("Device at %p", dev); - dev_dbg(dev, "Descriptor length: %x type: %x\n", - (int)udev->descriptor.bLength, - (int)udev->descriptor.bDescriptorType); + dbg("Descriptor length: %x type: %x", + (int)dev->descriptor.bLength, + (int)dev->descriptor.bDescriptorType); netdev = alloc_etherdev(sizeof(*kaweth)); if (!netdev) return -ENOMEM; kaweth = netdev_priv(netdev); - kaweth->dev = udev; + kaweth->dev = dev; kaweth->net = netdev; spin_lock_init(&kaweth->device_lock); init_waitqueue_head(&kaweth->term_wait); - dev_dbg(dev, "Resetting.\n"); + dbg("Resetting."); kaweth_reset(kaweth); @@ -1044,17 +1041,17 @@ static int kaweth_probe( * downloaded. Don't try to do it again, or we'll hang the device. */ - if (le16_to_cpu(udev->descriptor.bcdDevice) >> 8) { - dev_info(dev, "Firmware present in device.\n"); + if (le16_to_cpu(dev->descriptor.bcdDevice) >> 8) { + dev_info(&intf->dev, "Firmware present in device.\n"); } else { /* Download the firmware */ - dev_info(dev, "Downloading firmware...\n"); + dev_info(&intf->dev, "Downloading firmware...\n"); kaweth->firmware_buf = (__u8 *)__get_free_page(GFP_KERNEL); if ((result = kaweth_download_firmware(kaweth, "kaweth/new_code.bin", 100, 2)) < 0) { - dev_err(dev, "Error downloading firmware (%d)\n", + dev_err(&intf->dev, "Error downloading firmware (%d)\n", result); goto err_fw; } @@ -1063,7 +1060,8 @@ static int kaweth_probe( "kaweth/new_code_fix.bin", 100, 3)) < 0) { - dev_err(dev, "Error downloading firmware fix (%d)\n", + dev_err(&intf->dev, + "Error downloading firmware fix (%d)\n", result); goto err_fw; } @@ -1072,7 +1070,8 @@ static int kaweth_probe( "kaweth/trigger_code.bin", 126, 2)) < 0) { - dev_err(dev, "Error downloading trigger code (%d)\n", + dev_err(&intf->dev, + "Error downloading trigger code (%d)\n", result); goto err_fw; @@ -1082,18 +1081,19 @@ static int kaweth_probe( "kaweth/trigger_code_fix.bin", 126, 3)) < 0) { - dev_err(dev, "Error downloading trigger code fix (%d)\n", result); + dev_err(&intf->dev, "Error downloading trigger code fix (%d)\n", result); goto err_fw; } if ((result = kaweth_trigger_firmware(kaweth, 126)) < 0) { - dev_err(dev, "Error triggering firmware (%d)\n", result); + dev_err(&intf->dev, "Error triggering firmware (%d)\n", + result); goto err_fw; } /* Device will now disappear for a moment... */ - dev_info(dev, "Firmware loaded. I'll be back...\n"); + dev_info(&intf->dev, "Firmware loaded. I'll be back...\n"); err_fw: free_page((unsigned long)kaweth->firmware_buf); free_netdev(netdev); @@ -1103,29 +1103,29 @@ static int kaweth_probe( result = kaweth_read_configuration(kaweth); if(result < 0) { - dev_err(dev, "Error reading configuration (%d), no net device created\n", result); + dev_err(&intf->dev, "Error reading configuration (%d), no net device created\n", result); goto err_free_netdev; } - dev_info(dev, "Statistics collection: %x\n", kaweth->configuration.statistics_mask); - dev_info(dev, "Multicast filter limit: %x\n", kaweth->configuration.max_multicast_filters & ((1 << 15) - 1)); - dev_info(dev, "MTU: %d\n", le16_to_cpu(kaweth->configuration.segment_size)); - dev_info(dev, "Read MAC address %pM\n", kaweth->configuration.hw_addr); + dev_info(&intf->dev, "Statistics collection: %x\n", kaweth->configuration.statistics_mask); + dev_info(&intf->dev, "Multicast filter limit: %x\n", kaweth->configuration.max_multicast_filters & ((1 << 15) - 1)); + dev_info(&intf->dev, "MTU: %d\n", le16_to_cpu(kaweth->configuration.segment_size)); + dev_info(&intf->dev, "Read MAC address %pM\n", kaweth->configuration.hw_addr); if(!memcmp(&kaweth->configuration.hw_addr, &bcast_addr, sizeof(bcast_addr))) { - dev_err(dev, "Firmware not functioning properly, no net device created\n"); + dev_err(&intf->dev, "Firmware not functioning properly, no net device created\n"); goto err_free_netdev; } if(kaweth_set_urb_size(kaweth, KAWETH_BUF_SIZE) < 0) { - dev_dbg(dev, "Error setting URB size\n"); + dbg("Error setting URB size"); goto err_free_netdev; } if(kaweth_set_sofs_wait(kaweth, KAWETH_SOFS_TO_WAIT) < 0) { - dev_err(dev, "Error setting SOFS wait\n"); + dev_err(&intf->dev, "Error setting SOFS wait\n"); goto err_free_netdev; } @@ -1135,11 +1135,11 @@ static int kaweth_probe( KAWETH_PACKET_FILTER_MULTICAST); if(result < 0) { - dev_err(dev, "Error setting receive filter\n"); + dev_err(&intf->dev, "Error setting receive filter\n"); goto err_free_netdev; } - dev_dbg(dev, "Initializing net device.\n"); + dbg("Initializing net device."); kaweth->intf = intf; @@ -1181,20 +1181,20 @@ static int kaweth_probe( #if 0 // dma_supported() is deeply broken on almost all architectures - if (dma_supported (dev, 0xffffffffffffffffULL)) + if (dma_supported (&intf->dev, 0xffffffffffffffffULL)) kaweth->net->features |= NETIF_F_HIGHDMA; #endif - SET_NETDEV_DEV(netdev, dev); + SET_NETDEV_DEV(netdev, &intf->dev); if (register_netdev(netdev) != 0) { - dev_err(dev, "Error registering netdev.\n"); + dev_err(&intf->dev, "Error registering netdev.\n"); goto err_intfdata; } - dev_info(dev, "kaweth interface created at %s\n", + dev_info(&intf->dev, "kaweth interface created at %s\n", kaweth->net->name); - dev_dbg(dev, "Kaweth probe returning.\n"); + dbg("Kaweth probe returning."); return 0; @@ -1232,7 +1232,7 @@ static void kaweth_disconnect(struct usb_interface *intf) } netdev = kaweth->net; - netdev_dbg(kaweth->net, "Unregistering net device\n"); + dbg("Unregistering net device"); unregister_netdev(netdev); usb_free_urb(kaweth->rx_urb); diff --git a/trunk/drivers/net/usb/net1080.c b/trunk/drivers/net/usb/net1080.c index c062a3e8295c..28c4d513ba85 100644 --- a/trunk/drivers/net/usb/net1080.c +++ b/trunk/drivers/net/usb/net1080.c @@ -155,10 +155,12 @@ static void nc_dump_registers(struct usbnet *dev) u8 reg; u16 *vp = kmalloc(sizeof (u16)); - if (!vp) + if (!vp) { + dbg("no memory?"); return; + } - netdev_dbg(dev->net, "registers:\n"); + dbg("%s registers:", dev->net->name); for (reg = 0; reg < 0x20; reg++) { int retval; @@ -170,10 +172,11 @@ static void nc_dump_registers(struct usbnet *dev) retval = nc_register_read(dev, reg, vp); if (retval < 0) - netdev_dbg(dev->net, "reg [0x%x] ==> error %d\n", - reg, retval); + dbg("%s reg [0x%x] ==> error %d", + dev->net->name, reg, retval); else - netdev_dbg(dev->net, "reg [0x%x] = 0x%x\n", reg, *vp); + dbg("%s reg [0x%x] = 0x%x", + dev->net->name, reg, *vp); } kfree(vp); } @@ -297,15 +300,15 @@ static int net1080_reset(struct usbnet *dev) // nc_dump_registers(dev); if ((retval = nc_register_read(dev, REG_STATUS, vp)) < 0) { - netdev_dbg(dev->net, "can't read %s-%s status: %d\n", - dev->udev->bus->bus_name, dev->udev->devpath, retval); + dbg("can't read %s-%s status: %d", + dev->udev->bus->bus_name, dev->udev->devpath, retval); goto done; } status = *vp; nc_dump_status(dev, status); if ((retval = nc_register_read(dev, REG_USBCTL, vp)) < 0) { - netdev_dbg(dev->net, "can't read USBCTL, %d\n", retval); + dbg("can't read USBCTL, %d", retval); goto done; } usbctl = *vp; @@ -315,7 +318,7 @@ static int net1080_reset(struct usbnet *dev) USBCTL_FLUSH_THIS | USBCTL_FLUSH_OTHER); if ((retval = nc_register_read(dev, REG_TTL, vp)) < 0) { - netdev_dbg(dev->net, "can't read TTL, %d\n", retval); + dbg("can't read TTL, %d", retval); goto done; } ttl = *vp; @@ -323,7 +326,7 @@ static int net1080_reset(struct usbnet *dev) nc_register_write(dev, REG_TTL, MK_TTL(NC_READ_TTL_MS, TTL_OTHER(ttl)) ); - netdev_dbg(dev->net, "assigned TTL, %d ms\n", NC_READ_TTL_MS); + dbg("%s: assigned TTL, %d ms", dev->net->name, NC_READ_TTL_MS); netif_info(dev, link, dev->net, "port %c, peer %sconnected\n", (status & STATUS_PORT_A) ? 'A' : 'B', @@ -347,7 +350,7 @@ static int net1080_check_connect(struct usbnet *dev) status = *vp; kfree(vp); if (retval != 0) { - netdev_dbg(dev->net, "net1080_check_conn read - %d\n", retval); + dbg("%s net1080_check_conn read - %d", dev->net->name, retval); return retval; } if ((status & STATUS_CONN_OTHER) != STATUS_CONN_OTHER) @@ -417,9 +420,11 @@ static int net1080_rx_fixup(struct usbnet *dev, struct sk_buff *skb) u16 hdr_len, packet_len; if (!(skb->len & 0x01)) { - netdev_dbg(dev->net, "rx framesize %d range %d..%d mtu %d\n", - skb->len, dev->net->hard_header_len, dev->hard_mtu, - dev->net->mtu); +#ifdef DEBUG + struct net_device *net = dev->net; + dbg("rx framesize %d range %d..%d mtu %d", skb->len, + net->hard_header_len, dev->hard_mtu, net->mtu); +#endif dev->net->stats.rx_frame_errors++; nc_ensure_sync(dev); return 0; @@ -430,17 +435,17 @@ static int net1080_rx_fixup(struct usbnet *dev, struct sk_buff *skb) packet_len = le16_to_cpup(&header->packet_len); if (FRAMED_SIZE(packet_len) > NC_MAX_PACKET) { dev->net->stats.rx_frame_errors++; - netdev_dbg(dev->net, "packet too big, %d\n", packet_len); + dbg("packet too big, %d", packet_len); nc_ensure_sync(dev); return 0; } else if (hdr_len < MIN_HEADER) { dev->net->stats.rx_frame_errors++; - netdev_dbg(dev->net, "header too short, %d\n", hdr_len); + dbg("header too short, %d", hdr_len); nc_ensure_sync(dev); return 0; } else if (hdr_len > MIN_HEADER) { // out of band data for us? - netdev_dbg(dev->net, "header OOB, %d bytes\n", hdr_len - MIN_HEADER); + dbg("header OOB, %d bytes", hdr_len - MIN_HEADER); nc_ensure_sync(dev); // switch (vendor/product ids) { ... } } @@ -453,23 +458,23 @@ static int net1080_rx_fixup(struct usbnet *dev, struct sk_buff *skb) if ((packet_len & 0x01) == 0) { if (skb->data [packet_len] != PAD_BYTE) { dev->net->stats.rx_frame_errors++; - netdev_dbg(dev->net, "bad pad\n"); + dbg("bad pad"); return 0; } skb_trim(skb, skb->len - 1); } if (skb->len != packet_len) { dev->net->stats.rx_frame_errors++; - netdev_dbg(dev->net, "bad packet len %d (expected %d)\n", - skb->len, packet_len); + dbg("bad packet len %d (expected %d)", + skb->len, packet_len); nc_ensure_sync(dev); return 0; } if (header->packet_id != get_unaligned(&trailer->packet_id)) { dev->net->stats.rx_fifo_errors++; - netdev_dbg(dev->net, "(2+ dropped) rx packet_id mismatch 0x%x 0x%x\n", - le16_to_cpu(header->packet_id), - le16_to_cpu(trailer->packet_id)); + dbg("(2+ dropped) rx packet_id mismatch 0x%x 0x%x", + le16_to_cpu(header->packet_id), + le16_to_cpu(trailer->packet_id)); return 0; } #if 0 diff --git a/trunk/drivers/net/usb/rtl8150.c b/trunk/drivers/net/usb/rtl8150.c index 5f39a3b225ef..0e2c92e0e532 100644 --- a/trunk/drivers/net/usb/rtl8150.c +++ b/trunk/drivers/net/usb/rtl8150.c @@ -275,7 +275,7 @@ static int rtl8150_set_mac_address(struct net_device *netdev, void *p) return -EBUSY; memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); - netdev_dbg(netdev, "Setting MAC address to %pM\n", netdev->dev_addr); + dbg("%s: Setting MAC address to %pM\n", netdev->name, netdev->dev_addr); /* Set the IDR registers. */ set_registers(dev, IDR, netdev->addr_len, netdev->dev_addr); #ifdef EEPROM_WRITE @@ -503,12 +503,12 @@ static void intr_callback(struct urb *urb) if ((d[INT_MSR] & MSR_LINK) == 0) { if (netif_carrier_ok(dev->netdev)) { netif_carrier_off(dev->netdev); - netdev_dbg(dev->netdev, "%s: LINK LOST\n", __func__); + dbg("%s: LINK LOST\n", __func__); } } else { if (!netif_carrier_ok(dev->netdev)) { netif_carrier_on(dev->netdev); - netdev_dbg(dev->netdev, "%s: LINK CAME BACK\n", __func__); + dbg("%s: LINK CAME BACK\n", __func__); } } diff --git a/trunk/drivers/ptp/ptp_clock.c b/trunk/drivers/ptp/ptp_clock.c index 966875dcda56..1e528b539a07 100644 --- a/trunk/drivers/ptp/ptp_clock.c +++ b/trunk/drivers/ptp/ptp_clock.c @@ -300,11 +300,6 @@ void ptp_clock_event(struct ptp_clock *ptp, struct ptp_clock_event *event) pps_get_ts(&evt); pps_event(ptp->pps_source, &evt, PTP_PPS_EVENT, NULL); break; - - case PTP_CLOCK_PPSUSR: - pps_event(ptp->pps_source, &event->pps_times, - PTP_PPS_EVENT, NULL); - break; } } EXPORT_SYMBOL(ptp_clock_event); diff --git a/trunk/include/linux/if_link.h b/trunk/include/linux/if_link.h index 24c0dd09af54..ac173bd2ab65 100644 --- a/trunk/include/linux/if_link.h +++ b/trunk/include/linux/if_link.h @@ -398,15 +398,4 @@ struct ifla_port_vsi { __u8 pad[3]; }; - -/* IPoIB section */ - -enum { - IFLA_IPOIB_UNSPEC, - IFLA_IPOIB_PKEY, - __IFLA_IPOIB_MAX -}; - -#define IFLA_IPOIB_MAX (__IFLA_IPOIB_MAX - 1) - #endif /* _LINUX_IF_LINK_H */ diff --git a/trunk/include/linux/pps_kernel.h b/trunk/include/linux/pps_kernel.h index 0cc45ae1afd5..94048547f29a 100644 --- a/trunk/include/linux/pps_kernel.h +++ b/trunk/include/linux/pps_kernel.h @@ -116,14 +116,5 @@ static inline void pps_get_ts(struct pps_event_time *ts) #endif /* CONFIG_NTP_PPS */ -/* Subtract known time delay from PPS event time(s) */ -static inline void pps_sub_ts(struct pps_event_time *ts, struct timespec delta) -{ - ts->ts_real = timespec_sub(ts->ts_real, delta); -#ifdef CONFIG_NTP_PPS - ts->ts_raw = timespec_sub(ts->ts_raw, delta); -#endif -} - #endif /* LINUX_PPS_KERNEL_H */ diff --git a/trunk/include/linux/ptp_clock_kernel.h b/trunk/include/linux/ptp_clock_kernel.h index a644b29f1161..945704c2ed65 100644 --- a/trunk/include/linux/ptp_clock_kernel.h +++ b/trunk/include/linux/ptp_clock_kernel.h @@ -21,7 +21,6 @@ #ifndef _PTP_CLOCK_KERNEL_H_ #define _PTP_CLOCK_KERNEL_H_ -#include #include @@ -111,7 +110,6 @@ enum ptp_clock_events { PTP_CLOCK_ALARM, PTP_CLOCK_EXTTS, PTP_CLOCK_PPS, - PTP_CLOCK_PPSUSR, }; /** @@ -119,17 +117,13 @@ enum ptp_clock_events { * * @type: One of the ptp_clock_events enumeration values. * @index: Identifies the source of the event. - * @timestamp: When the event occurred (%PTP_CLOCK_EXTTS only). - * @pps_times: When the event occurred (%PTP_CLOCK_PPSUSR only). + * @timestamp: When the event occured. */ struct ptp_clock_event { int type; int index; - union { - u64 timestamp; - struct pps_event_time pps_times; - }; + u64 timestamp; }; /** diff --git a/trunk/include/linux/tcp.h b/trunk/include/linux/tcp.h index 67c789ae719c..ae46df590629 100644 --- a/trunk/include/linux/tcp.h +++ b/trunk/include/linux/tcp.h @@ -574,8 +574,6 @@ static inline bool fastopen_cookie_present(struct tcp_fastopen_cookie *foc) return foc->len != -1; } -extern void tcp_sock_destruct(struct sock *sk); - static inline int fastopen_init_queue(struct sock *sk, int backlog) { struct request_sock_queue *queue = @@ -587,8 +585,6 @@ static inline int fastopen_init_queue(struct sock *sk, int backlog) sk->sk_allocation); if (queue->fastopenq == NULL) return -ENOMEM; - - sk->sk_destruct = tcp_sock_destruct; spin_lock_init(&queue->fastopenq->lock); } queue->fastopenq->max_qlen = backlog; diff --git a/trunk/net/ipv4/af_inet.c b/trunk/net/ipv4/af_inet.c index 766c59658563..845372b025f6 100644 --- a/trunk/net/ipv4/af_inet.c +++ b/trunk/net/ipv4/af_inet.c @@ -149,6 +149,8 @@ void inet_sock_destruct(struct sock *sk) pr_err("Attempt to release alive inet socket %p\n", sk); return; } + if (sk->sk_protocol == IPPROTO_TCP) + kfree(inet_csk(sk)->icsk_accept_queue.fastopenq); WARN_ON(atomic_read(&sk->sk_rmem_alloc)); WARN_ON(atomic_read(&sk->sk_wmem_alloc)); diff --git a/trunk/net/ipv4/tcp.c b/trunk/net/ipv4/tcp.c index 7b1e940393cf..df83d744e380 100644 --- a/trunk/net/ipv4/tcp.c +++ b/trunk/net/ipv4/tcp.c @@ -2325,13 +2325,6 @@ int tcp_disconnect(struct sock *sk, int flags) } EXPORT_SYMBOL(tcp_disconnect); -void tcp_sock_destruct(struct sock *sk) -{ - inet_sock_destruct(sk); - - kfree(inet_csk(sk)->icsk_accept_queue.fastopenq); -} - static inline bool tcp_can_repair_sock(const struct sock *sk) { return capable(CAP_NET_ADMIN) && diff --git a/trunk/net/ipv4/tcp_minisocks.c b/trunk/net/ipv4/tcp_minisocks.c index 5792577b5bc5..e965319d610b 100644 --- a/trunk/net/ipv4/tcp_minisocks.c +++ b/trunk/net/ipv4/tcp_minisocks.c @@ -85,8 +85,6 @@ static bool tcp_in_window(u32 seq, u32 end_seq, u32 s_win, u32 e_win) * spinlock it. I do not want! Well, probability of misbehaviour * is ridiculously low and, seems, we could use some mb() tricks * to avoid misread sequence numbers, states etc. --ANK - * - * We don't need to initialize tmp_out.sack_ok as we don't use the results */ enum tcp_tw_status tcp_timewait_state_process(struct inet_timewait_sock *tw, struct sk_buff *skb, @@ -524,8 +522,6 @@ EXPORT_SYMBOL(tcp_create_openreq_child); * * XXX (TFO) - The current impl contains a special check for ack * validation and inside tcp_v4_reqsk_send_ack(). Can we do better? - * - * We don't need to initialize tmp_opt.sack_ok as we don't use the results */ struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb,