Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband: IB/ehca: Reject dynamic memory add/remove when ehca adapter is present IB/ehca: Fix reported max number of QPs and CQs in systems with >1 adapter IPoIB: Set netdev offload features properly for child (VLAN) interfaces IPoIB: Clean up ethtool support mlx4_core: Add Ethernet PCI device IDs mlx4_en: Add driver for Mellanox ConnectX 10GbE NIC mlx4_core: Multiple port type support mlx4_core: Ethernet MAC/VLAN management mlx4_core: Get ethernet MTU and default address from firmware mlx4_core: Support multiple pre-reserved QP regions Update NetEffect maintainer emails to Intel emails RDMA/cxgb3: Remove cmid reference on tid allocation failures IB/mad: Use krealloc() to resize snoop table IPoIB: Always initialize poll_timer to avoid crash on unload IB/ehca: Don't allow creating UC QP with SRQ mlx4_core: Add QP range reservation support RDMA/ucma: Test ucma_alloc_multicast() return against NULL, not with IS_ERR()
这个提交包含在:
@@ -507,6 +507,7 @@ int ipoib_pkey_dev_delay_open(struct net_device *dev);
|
||||
void ipoib_drain_cq(struct net_device *dev);
|
||||
|
||||
void ipoib_set_ethtool_ops(struct net_device *dev);
|
||||
int ipoib_set_dev_features(struct ipoib_dev_priv *priv, struct ib_device *hca);
|
||||
|
||||
#ifdef CONFIG_INFINIBAND_IPOIB_CM
|
||||
|
||||
|
@@ -42,6 +42,13 @@ static void ipoib_get_drvinfo(struct net_device *netdev,
|
||||
strncpy(drvinfo->driver, "ipoib", sizeof(drvinfo->driver) - 1);
|
||||
}
|
||||
|
||||
static u32 ipoib_get_rx_csum(struct net_device *dev)
|
||||
{
|
||||
struct ipoib_dev_priv *priv = netdev_priv(dev);
|
||||
return test_bit(IPOIB_FLAG_CSUM, &priv->flags) &&
|
||||
!test_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags);
|
||||
}
|
||||
|
||||
static int ipoib_get_coalesce(struct net_device *dev,
|
||||
struct ethtool_coalesce *coal)
|
||||
{
|
||||
@@ -129,7 +136,7 @@ static void ipoib_get_ethtool_stats(struct net_device *dev,
|
||||
|
||||
static const struct ethtool_ops ipoib_ethtool_ops = {
|
||||
.get_drvinfo = ipoib_get_drvinfo,
|
||||
.get_tso = ethtool_op_get_tso,
|
||||
.get_rx_csum = ipoib_get_rx_csum,
|
||||
.get_coalesce = ipoib_get_coalesce,
|
||||
.set_coalesce = ipoib_set_coalesce,
|
||||
.get_flags = ethtool_op_get_flags,
|
||||
|
@@ -685,10 +685,6 @@ int ipoib_ib_dev_open(struct net_device *dev)
|
||||
queue_delayed_work(ipoib_workqueue, &priv->ah_reap_task,
|
||||
round_jiffies_relative(HZ));
|
||||
|
||||
init_timer(&priv->poll_timer);
|
||||
priv->poll_timer.function = ipoib_ib_tx_timer_func;
|
||||
priv->poll_timer.data = (unsigned long)dev;
|
||||
|
||||
set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
|
||||
|
||||
return 0;
|
||||
@@ -906,6 +902,9 @@ int ipoib_ib_dev_init(struct net_device *dev, struct ib_device *ca, int port)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
setup_timer(&priv->poll_timer, ipoib_ib_tx_timer_func,
|
||||
(unsigned long) dev);
|
||||
|
||||
if (dev->flags & IFF_UP) {
|
||||
if (ipoib_ib_dev_open(dev)) {
|
||||
ipoib_transport_dev_cleanup(dev);
|
||||
|
@@ -1173,11 +1173,48 @@ int ipoib_add_pkey_attr(struct net_device *dev)
|
||||
return device_create_file(&dev->dev, &dev_attr_pkey);
|
||||
}
|
||||
|
||||
int ipoib_set_dev_features(struct ipoib_dev_priv *priv, struct ib_device *hca)
|
||||
{
|
||||
struct ib_device_attr *device_attr;
|
||||
int result = -ENOMEM;
|
||||
|
||||
device_attr = kmalloc(sizeof *device_attr, GFP_KERNEL);
|
||||
if (!device_attr) {
|
||||
printk(KERN_WARNING "%s: allocation of %zu bytes failed\n",
|
||||
hca->name, sizeof *device_attr);
|
||||
return result;
|
||||
}
|
||||
|
||||
result = ib_query_device(hca, device_attr);
|
||||
if (result) {
|
||||
printk(KERN_WARNING "%s: ib_query_device failed (ret = %d)\n",
|
||||
hca->name, result);
|
||||
kfree(device_attr);
|
||||
return result;
|
||||
}
|
||||
priv->hca_caps = device_attr->device_cap_flags;
|
||||
|
||||
kfree(device_attr);
|
||||
|
||||
if (priv->hca_caps & IB_DEVICE_UD_IP_CSUM) {
|
||||
set_bit(IPOIB_FLAG_CSUM, &priv->flags);
|
||||
priv->dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM;
|
||||
}
|
||||
|
||||
if (lro)
|
||||
priv->dev->features |= NETIF_F_LRO;
|
||||
|
||||
if (priv->dev->features & NETIF_F_SG && priv->hca_caps & IB_DEVICE_UD_TSO)
|
||||
priv->dev->features |= NETIF_F_TSO;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static struct net_device *ipoib_add_port(const char *format,
|
||||
struct ib_device *hca, u8 port)
|
||||
{
|
||||
struct ipoib_dev_priv *priv;
|
||||
struct ib_device_attr *device_attr;
|
||||
struct ib_port_attr attr;
|
||||
int result = -ENOMEM;
|
||||
|
||||
@@ -1206,31 +1243,8 @@ static struct net_device *ipoib_add_port(const char *format,
|
||||
goto device_init_failed;
|
||||
}
|
||||
|
||||
device_attr = kmalloc(sizeof *device_attr, GFP_KERNEL);
|
||||
if (!device_attr) {
|
||||
printk(KERN_WARNING "%s: allocation of %zu bytes failed\n",
|
||||
hca->name, sizeof *device_attr);
|
||||
if (ipoib_set_dev_features(priv, hca))
|
||||
goto device_init_failed;
|
||||
}
|
||||
|
||||
result = ib_query_device(hca, device_attr);
|
||||
if (result) {
|
||||
printk(KERN_WARNING "%s: ib_query_device failed (ret = %d)\n",
|
||||
hca->name, result);
|
||||
kfree(device_attr);
|
||||
goto device_init_failed;
|
||||
}
|
||||
priv->hca_caps = device_attr->device_cap_flags;
|
||||
|
||||
kfree(device_attr);
|
||||
|
||||
if (priv->hca_caps & IB_DEVICE_UD_IP_CSUM) {
|
||||
set_bit(IPOIB_FLAG_CSUM, &priv->flags);
|
||||
priv->dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM;
|
||||
}
|
||||
|
||||
if (lro)
|
||||
priv->dev->features |= NETIF_F_LRO;
|
||||
|
||||
/*
|
||||
* Set the full membership bit, so that we join the right
|
||||
@@ -1266,9 +1280,6 @@ static struct net_device *ipoib_add_port(const char *format,
|
||||
goto event_failed;
|
||||
}
|
||||
|
||||
if (priv->dev->features & NETIF_F_SG && priv->hca_caps & IB_DEVICE_UD_TSO)
|
||||
priv->dev->features |= NETIF_F_TSO;
|
||||
|
||||
result = register_netdev(priv->dev);
|
||||
if (result) {
|
||||
printk(KERN_WARNING "%s: couldn't register ipoib port %d; error %d\n",
|
||||
|
@@ -93,6 +93,10 @@ int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey)
|
||||
priv->mcast_mtu = priv->admin_mtu = priv->dev->mtu;
|
||||
set_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags);
|
||||
|
||||
result = ipoib_set_dev_features(priv, ppriv->ca);
|
||||
if (result)
|
||||
goto device_init_failed;
|
||||
|
||||
priv->pkey = pkey;
|
||||
|
||||
memcpy(priv->dev->dev_addr, ppriv->dev->dev_addr, INFINIBAND_ALEN);
|
||||
|
在新工单中引用
屏蔽一个用户