aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-02-14 13:33:45 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2014-02-14 13:33:45 -0500
commite847882887ce7f969b3dcb9eeef642ad70d47b3a (patch)
tree663026eb2e99b2b5d58771c65e826473ffd9798d
parent85643586677c877f28891200e0cb9514547af589 (diff)
parentc9459388d8b7da050de173eb85359b17ee575bd3 (diff)
Merge tag 'rdma-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband
Pull RDMA/InfiniBand fixes from Roland Dreier: - Fix some rough edges from the "IP addressing for IBoE" merge - Other misc fixes, mostly to hardware drivers * tag 'rdma-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband: (21 commits) RDMA/ocrdma: Fix load time panic during GID table init RDMA/ocrdma: Fix traffic class shift IB/iser: Fix use after free in iser_snd_completion() IB/iser: Avoid dereferencing iscsi_iser conn object when not bound to iser connection IB/usnic: Fix smatch endianness error IB/mlx5: Remove dependency on X86 mlx5: Add include of <linux/slab.h> because of kzalloc()/kfree() use IB/qib: Add missing serdes init sequence RDMA/cxgb4: Add missing neigh_release in LE-Workaround path IB: Report using RoCE IP based gids in port caps IB/mlx4: Build the port IBoE GID table properly under bonding IB/mlx4: Do IBoE GID table resets per-port IB/mlx4: Do IBoE locking earlier when initializing the GID table IB/mlx4: Move rtnl locking to the right place IB/mlx4: Make sure GID index 0 is always occupied IB/mlx4: Don't allocate range of steerable UD QPs for Ethernet-only device RDMA/amso1100: Fix error return code RDMA/nes: Fix error return code IB/mlx5: Don't set "block multicast loopback" capability IB/mlx5: Fix binary compatibility with libmlx5 ...
-rw-r--r--drivers/infiniband/hw/amso1100/c2.c4
-rw-r--r--drivers/infiniband/hw/amso1100/c2_rnic.c3
-rw-r--r--drivers/infiniband/hw/cxgb4/cm.c1
-rw-r--r--drivers/infiniband/hw/mlx4/main.c185
-rw-r--r--drivers/infiniband/hw/mlx5/Kconfig2
-rw-r--r--drivers/infiniband/hw/mlx5/main.c22
-rw-r--r--drivers/infiniband/hw/mlx5/qp.c18
-rw-r--r--drivers/infiniband/hw/mlx5/user.h7
-rw-r--r--drivers/infiniband/hw/nes/nes.c5
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma_main.c2
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma_verbs.c4
-rw-r--r--drivers/infiniband/hw/qib/qib_iba7322.c5
-rw-r--r--drivers/infiniband/hw/usnic/usnic_ib_qp_grp.c9
-rw-r--r--drivers/infiniband/ulp/iser/iser_initiator.c3
-rw-r--r--drivers/infiniband/ulp/iser/iser_verbs.c10
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/Kconfig2
-rw-r--r--include/linux/mlx5/driver.h3
-rw-r--r--include/rdma/ib_verbs.h3
18 files changed, 214 insertions, 74 deletions
diff --git a/drivers/infiniband/hw/amso1100/c2.c b/drivers/infiniband/hw/amso1100/c2.c
index d53cf519f42a..00400c352c1a 100644
--- a/drivers/infiniband/hw/amso1100/c2.c
+++ b/drivers/infiniband/hw/amso1100/c2.c
@@ -1082,6 +1082,7 @@ static int c2_probe(struct pci_dev *pcidev, const struct pci_device_id *ent)
1082 1082
1083 /* Initialize network device */ 1083 /* Initialize network device */
1084 if ((netdev = c2_devinit(c2dev, mmio_regs)) == NULL) { 1084 if ((netdev = c2_devinit(c2dev, mmio_regs)) == NULL) {
1085 ret = -ENOMEM;
1085 iounmap(mmio_regs); 1086 iounmap(mmio_regs);
1086 goto bail4; 1087 goto bail4;
1087 } 1088 }
@@ -1151,7 +1152,8 @@ static int c2_probe(struct pci_dev *pcidev, const struct pci_device_id *ent)
1151 goto bail10; 1152 goto bail10;
1152 } 1153 }
1153 1154
1154 if (c2_register_device(c2dev)) 1155 ret = c2_register_device(c2dev);
1156 if (ret)
1155 goto bail10; 1157 goto bail10;
1156 1158
1157 return 0; 1159 return 0;
diff --git a/drivers/infiniband/hw/amso1100/c2_rnic.c b/drivers/infiniband/hw/amso1100/c2_rnic.c
index b7c986990053..d2a6d961344b 100644
--- a/drivers/infiniband/hw/amso1100/c2_rnic.c
+++ b/drivers/infiniband/hw/amso1100/c2_rnic.c
@@ -576,7 +576,8 @@ int c2_rnic_init(struct c2_dev *c2dev)
576 goto bail4; 576 goto bail4;
577 577
578 /* Initialize cached the adapter limits */ 578 /* Initialize cached the adapter limits */
579 if (c2_rnic_query(c2dev, &c2dev->props)) 579 err = c2_rnic_query(c2dev, &c2dev->props);
580 if (err)
580 goto bail5; 581 goto bail5;
581 582
582 /* Initialize the PD pool */ 583 /* Initialize the PD pool */
diff --git a/drivers/infiniband/hw/cxgb4/cm.c b/drivers/infiniband/hw/cxgb4/cm.c
index 45126879ad28..d286bdebe2ab 100644
--- a/drivers/infiniband/hw/cxgb4/cm.c
+++ b/drivers/infiniband/hw/cxgb4/cm.c
@@ -3352,6 +3352,7 @@ static int rx_pkt(struct c4iw_dev *dev, struct sk_buff *skb)
3352 goto free_dst; 3352 goto free_dst;
3353 } 3353 }
3354 3354
3355 neigh_release(neigh);
3355 step = dev->rdev.lldi.nrxq / dev->rdev.lldi.nchan; 3356 step = dev->rdev.lldi.nrxq / dev->rdev.lldi.nchan;
3356 rss_qid = dev->rdev.lldi.rxq_ids[pi->port_id * step]; 3357 rss_qid = dev->rdev.lldi.rxq_ids[pi->port_id * step];
3357 window = (__force u16) htons((__force u16)tcph->window); 3358 window = (__force u16) htons((__force u16)tcph->window);
diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c
index c2702f549f10..e81c5547e647 100644
--- a/drivers/infiniband/hw/mlx4/main.c
+++ b/drivers/infiniband/hw/mlx4/main.c
@@ -347,7 +347,7 @@ static int eth_link_query_port(struct ib_device *ibdev, u8 port,
347 props->active_width = (((u8 *)mailbox->buf)[5] == 0x40) ? 347 props->active_width = (((u8 *)mailbox->buf)[5] == 0x40) ?
348 IB_WIDTH_4X : IB_WIDTH_1X; 348 IB_WIDTH_4X : IB_WIDTH_1X;
349 props->active_speed = IB_SPEED_QDR; 349 props->active_speed = IB_SPEED_QDR;
350 props->port_cap_flags = IB_PORT_CM_SUP; 350 props->port_cap_flags = IB_PORT_CM_SUP | IB_PORT_IP_BASED_GIDS;
351 props->gid_tbl_len = mdev->dev->caps.gid_table_len[port]; 351 props->gid_tbl_len = mdev->dev->caps.gid_table_len[port];
352 props->max_msg_sz = mdev->dev->caps.max_msg_sz; 352 props->max_msg_sz = mdev->dev->caps.max_msg_sz;
353 props->pkey_tbl_len = 1; 353 props->pkey_tbl_len = 1;
@@ -1357,6 +1357,21 @@ static struct device_attribute *mlx4_class_attributes[] = {
1357 &dev_attr_board_id 1357 &dev_attr_board_id
1358}; 1358};
1359 1359
1360static void mlx4_addrconf_ifid_eui48(u8 *eui, u16 vlan_id,
1361 struct net_device *dev)
1362{
1363 memcpy(eui, dev->dev_addr, 3);
1364 memcpy(eui + 5, dev->dev_addr + 3, 3);
1365 if (vlan_id < 0x1000) {
1366 eui[3] = vlan_id >> 8;
1367 eui[4] = vlan_id & 0xff;
1368 } else {
1369 eui[3] = 0xff;
1370 eui[4] = 0xfe;
1371 }
1372 eui[0] ^= 2;
1373}
1374
1360static void update_gids_task(struct work_struct *work) 1375static void update_gids_task(struct work_struct *work)
1361{ 1376{
1362 struct update_gid_work *gw = container_of(work, struct update_gid_work, work); 1377 struct update_gid_work *gw = container_of(work, struct update_gid_work, work);
@@ -1393,7 +1408,6 @@ static void reset_gids_task(struct work_struct *work)
1393 struct mlx4_cmd_mailbox *mailbox; 1408 struct mlx4_cmd_mailbox *mailbox;
1394 union ib_gid *gids; 1409 union ib_gid *gids;
1395 int err; 1410 int err;
1396 int i;
1397 struct mlx4_dev *dev = gw->dev->dev; 1411 struct mlx4_dev *dev = gw->dev->dev;
1398 1412
1399 mailbox = mlx4_alloc_cmd_mailbox(dev); 1413 mailbox = mlx4_alloc_cmd_mailbox(dev);
@@ -1405,18 +1419,16 @@ static void reset_gids_task(struct work_struct *work)
1405 gids = mailbox->buf; 1419 gids = mailbox->buf;
1406 memcpy(gids, gw->gids, sizeof(gw->gids)); 1420 memcpy(gids, gw->gids, sizeof(gw->gids));
1407 1421
1408 for (i = 1; i < gw->dev->num_ports + 1; i++) { 1422 if (mlx4_ib_port_link_layer(&gw->dev->ib_dev, gw->port) ==
1409 if (mlx4_ib_port_link_layer(&gw->dev->ib_dev, i) == 1423 IB_LINK_LAYER_ETHERNET) {
1410 IB_LINK_LAYER_ETHERNET) { 1424 err = mlx4_cmd(dev, mailbox->dma,
1411 err = mlx4_cmd(dev, mailbox->dma, 1425 MLX4_SET_PORT_GID_TABLE << 8 | gw->port,
1412 MLX4_SET_PORT_GID_TABLE << 8 | i, 1426 1, MLX4_CMD_SET_PORT,
1413 1, MLX4_CMD_SET_PORT, 1427 MLX4_CMD_TIME_CLASS_B,
1414 MLX4_CMD_TIME_CLASS_B, 1428 MLX4_CMD_WRAPPED);
1415 MLX4_CMD_WRAPPED); 1429 if (err)
1416 if (err) 1430 pr_warn(KERN_WARNING
1417 pr_warn(KERN_WARNING 1431 "set port %d command failed\n", gw->port);
1418 "set port %d command failed\n", i);
1419 }
1420 } 1432 }
1421 1433
1422 mlx4_free_cmd_mailbox(dev, mailbox); 1434 mlx4_free_cmd_mailbox(dev, mailbox);
@@ -1425,7 +1437,8 @@ free:
1425} 1437}
1426 1438
1427static int update_gid_table(struct mlx4_ib_dev *dev, int port, 1439static int update_gid_table(struct mlx4_ib_dev *dev, int port,
1428 union ib_gid *gid, int clear) 1440 union ib_gid *gid, int clear,
1441 int default_gid)
1429{ 1442{
1430 struct update_gid_work *work; 1443 struct update_gid_work *work;
1431 int i; 1444 int i;
@@ -1434,26 +1447,31 @@ static int update_gid_table(struct mlx4_ib_dev *dev, int port,
1434 int found = -1; 1447 int found = -1;
1435 int max_gids; 1448 int max_gids;
1436 1449
1437 max_gids = dev->dev->caps.gid_table_len[port]; 1450 if (default_gid) {
1438 for (i = 0; i < max_gids; ++i) { 1451 free = 0;
1439 if (!memcmp(&dev->iboe.gid_table[port - 1][i], gid, 1452 } else {
1440 sizeof(*gid))) 1453 max_gids = dev->dev->caps.gid_table_len[port];
1441 found = i;