Skip to content

Commit

Permalink
RDMA/qedr: Dispatch port active event from qedr_add
Browse files Browse the repository at this point in the history
Relying on qede to trigger qedr on startup is problematic. When probing
both if qedr loads slowly then qede can assume qedr is missing and not
trigger it. This patch adds a triggering from qedr and protects against
a race via an atomic bit.

Signed-off-by: Ram Amrani <Ram.Amrani@cavium.com>
Signed-off-by: Ariel Elior <Ariel.Elior@cavium.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
  • Loading branch information
Ram Amrani authored and Doug Ledford committed Jan 24, 2017
1 parent 9c1e022 commit f449c7a
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 6 deletions.
20 changes: 14 additions & 6 deletions drivers/infiniband/hw/qedr/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -791,6 +791,9 @@ static struct qedr_dev *qedr_add(struct qed_dev *cdev, struct pci_dev *pdev,
if (device_create_file(&dev->ibdev.dev, qedr_attributes[i]))
goto sysfs_err;

if (!test_and_set_bit(QEDR_ENET_STATE_BIT, &dev->enet_state))
qedr_ib_dispatch_event(dev, QEDR_PORT, IB_EVENT_PORT_ACTIVE);

DP_DEBUG(dev, QEDR_MSG_INIT, "qedr driver loaded successfully\n");
return dev;

Expand Down Expand Up @@ -823,11 +826,10 @@ static void qedr_remove(struct qedr_dev *dev)
ib_dealloc_device(&dev->ibdev);
}

static int qedr_close(struct qedr_dev *dev)
static void qedr_close(struct qedr_dev *dev)
{
qedr_ib_dispatch_event(dev, 1, IB_EVENT_PORT_ERR);

return 0;
if (test_and_clear_bit(QEDR_ENET_STATE_BIT, &dev->enet_state))
qedr_ib_dispatch_event(dev, QEDR_PORT, IB_EVENT_PORT_ERR);
}

static void qedr_shutdown(struct qedr_dev *dev)
Expand All @@ -836,6 +838,12 @@ static void qedr_shutdown(struct qedr_dev *dev)
qedr_remove(dev);
}

static void qedr_open(struct qedr_dev *dev)
{
if (!test_and_set_bit(QEDR_ENET_STATE_BIT, &dev->enet_state))
qedr_ib_dispatch_event(dev, QEDR_PORT, IB_EVENT_PORT_ACTIVE);
}

static void qedr_mac_address_change(struct qedr_dev *dev)
{
union ib_gid *sgid = &dev->sgid_tbl[0];
Expand All @@ -862,7 +870,7 @@ static void qedr_mac_address_change(struct qedr_dev *dev)

ether_addr_copy(dev->gsi_ll2_mac_address, dev->ndev->dev_addr);

qedr_ib_dispatch_event(dev, 1, IB_EVENT_GID_CHANGE);
qedr_ib_dispatch_event(dev, QEDR_PORT, IB_EVENT_GID_CHANGE);

if (rc)
DP_ERR(dev, "Error updating mac filter\n");
Expand All @@ -876,7 +884,7 @@ static void qedr_notify(struct qedr_dev *dev, enum qede_roce_event event)
{
switch (event) {
case QEDE_UP:
qedr_ib_dispatch_event(dev, 1, IB_EVENT_PORT_ACTIVE);
qedr_open(dev);
break;
case QEDE_DOWN:
qedr_close(dev);
Expand Down
5 changes: 5 additions & 0 deletions drivers/infiniband/hw/qedr/qedr.h
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,8 @@ struct qedr_device_attr {
struct qed_rdma_events events;
};

#define QEDR_ENET_STATE_BIT (0)

struct qedr_dev {
struct ib_device ibdev;
struct qed_dev *cdev;
Expand Down Expand Up @@ -153,6 +155,8 @@ struct qedr_dev {
struct qedr_cq *gsi_sqcq;
struct qedr_cq *gsi_rqcq;
struct qedr_qp *gsi_qp;

unsigned long enet_state;
};

#define QEDR_MAX_SQ_PBL (0x8000)
Expand Down Expand Up @@ -188,6 +192,7 @@ struct qedr_dev {
#define QEDR_ROCE_MAX_CNQ_SIZE (0x4000)

#define QEDR_MAX_PORT (1)
#define QEDR_PORT (1)

#define QEDR_UVERBS(CMD_NAME) (1ull << IB_USER_VERBS_CMD_##CMD_NAME)

Expand Down

0 comments on commit f449c7a

Please sign in to comment.