diff options
author | Ram Amrani <Ram.Amrani@cavium.com> | 2016-10-10 06:15:37 -0400 |
---|---|---|
committer | Doug Ledford <dledford@redhat.com> | 2016-10-14 15:00:10 -0400 |
commit | 1d1424c8f834e4e3b8792d310a94b0e2e8f59b4c (patch) | |
tree | 81908e7dbc43a2862ca65007a4dae5110311e162 | |
parent | afa0e13be754307a9ed7ad31fe42b5ec97948c49 (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.c | 34 | ||||
-rw-r--r-- | drivers/infiniband/hw/qedr/qedr.h | 2 |
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 | ||
727 | static 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) |