aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRam Amrani <Ram.Amrani@cavium.com>2016-10-10 06:15:37 -0400
committerDoug Ledford <dledford@redhat.com>2016-10-14 15:00:10 -0400
commit1d1424c8f834e4e3b8792d310a94b0e2e8f59b4c (patch)
tree81908e7dbc43a2862ca65007a4dae5110311e162
parentafa0e13be754307a9ed7ad31fe42b5ec97948c49 (diff)
qedr: Add LL2 RoCE interface
Add light L2 interface for RoCE. Signed-off-by: Rajesh Borundia <rajesh.borundia@cavium.com> Signed-off-by: Ram Amrani <Ram.Amrani@cavium.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
-rw-r--r--drivers/infiniband/hw/qedr/main.c34
-rw-r--r--drivers/infiniband/hw/qedr/qedr.h2
2 files changed, 34 insertions, 2 deletions
diff --git a/drivers/infiniband/hw/qedr/main.c b/drivers/infiniband/hw/qedr/main.c
index 858cc354153d..e5a07a2d4c5e 100644
--- a/drivers/infiniband/hw/qedr/main.c
+++ b/drivers/infiniband/hw/qedr/main.c
@@ -724,6 +724,38 @@ static void qedr_shutdown(struct qedr_dev *dev)
724 qedr_remove(dev); 724 qedr_remove(dev);
725} 725}
726 726
727static void qedr_mac_address_change(struct qedr_dev *dev)
728{
729 union ib_gid *sgid = &dev->sgid_tbl[0];
730 u8 guid[8], mac_addr[6];
731 int rc;
732
733 /* Update SGID */
734 ether_addr_copy(&mac_addr[0], dev->ndev->dev_addr);
735 guid[0] = mac_addr[0] ^ 2;
736 guid[1] = mac_addr[1];
737 guid[2] = mac_addr[2];
738 guid[3] = 0xff;
739 guid[4] = 0xfe;
740 guid[5] = mac_addr[3];
741 guid[6] = mac_addr[4];
742 guid[7] = mac_addr[5];
743 sgid->global.subnet_prefix = cpu_to_be64(0xfe80000000000000LL);
744 memcpy(&sgid->raw[8], guid, sizeof(guid));
745
746 /* Update LL2 */
747 rc = dev->ops->roce_ll2_set_mac_filter(dev->cdev,
748 dev->gsi_ll2_mac_address,
749 dev->ndev->dev_addr);
750
751 ether_addr_copy(dev->gsi_ll2_mac_address, dev->ndev->dev_addr);
752
753 qedr_ib_dispatch_event(dev, 1, IB_EVENT_GID_CHANGE);
754
755 if (rc)
756 DP_ERR(dev, "Error updating mac filter\n");
757}
758
727/* event handling via NIC driver ensures that all the NIC specific 759/* event handling via NIC driver ensures that all the NIC specific
728 * initialization done before RoCE driver notifies 760 * initialization done before RoCE driver notifies
729 * event to stack. 761 * event to stack.
@@ -741,7 +773,7 @@ static void qedr_notify(struct qedr_dev *dev, enum qede_roce_event event)
741 qedr_shutdown(dev); 773 qedr_shutdown(dev);
742 break; 774 break;
743 case QEDE_CHANGE_ADDR: 775 case QEDE_CHANGE_ADDR:
744 qedr_ib_dispatch_event(dev, 1, IB_EVENT_GID_CHANGE); 776 qedr_mac_address_change(dev);
745 break; 777 break;
746 default: 778 default:
747 pr_err("Event not supported\n"); 779 pr_err("Event not supported\n");
diff --git a/drivers/infiniband/hw/qedr/qedr.h b/drivers/infiniband/hw/qedr/qedr.h
index 775dbf16fdf2..0b404d87921f 100644
--- a/drivers/infiniband/hw/qedr/qedr.h
+++ b/drivers/infiniband/hw/qedr/qedr.h
@@ -147,7 +147,7 @@ struct qedr_dev {
147 u8 dp_level; 147 u8 dp_level;
148 u8 num_hwfns; 148 u8 num_hwfns;
149 uint wq_multiplier; 149 uint wq_multiplier;
150 150 u8 gsi_ll2_mac_address[ETH_ALEN];
151}; 151};
152 152
153#define QEDR_MAX_SQ_PBL (0x8000) 153#define QEDR_MAX_SQ_PBL (0x8000)