[ofa-general] [PATCH] mthca: Create sysfs entries for MSI-X interrupts if enabled

Vincent Rizza vinnie at sgi.com
Sun Oct 19 21:16:29 PDT 2008


Creates a sysfs entry for each MSI-X vector containing the IRQ value. This
patch applies to the mthca driver.

Signed-off-by: Vincent Rizza <vinnie at sgi.com>
Signed-off-by: Brett Grandbois <brettg at sgi.com>
Signed-off-by: Greg Banks <gnb at sgi.com>
Signed-off-by: Max Matveev <makc at sgi.com>
Signed-off-by: Ken Sandars <ksandars at sgi.com>
---
 drivers/infiniband/hw/mthca/mthca_provider.c |   62 +++++++++++++++++++++++---
 1 files changed, 55 insertions(+), 7 deletions(-)

diff --git a/drivers/infiniband/hw/mthca/mthca_provider.c b/drivers/infiniband/hw/mthca/mthca_provider.c
index 87ad889..70fc686 100644
--- a/drivers/infiniband/hw/mthca/mthca_provider.c
+++ b/drivers/infiniband/hw/mthca/mthca_provider.c
@@ -1232,10 +1232,40 @@ static ssize_t show_board(struct device *device, struct device_attribute *attr,
 	return sprintf(buf, "%.*s\n", MTHCA_BOARD_ID_LEN, dev->board_id);
 }
 
-static DEVICE_ATTR(hw_rev,   S_IRUGO, show_rev,    NULL);
-static DEVICE_ATTR(fw_ver,   S_IRUGO, show_fw_ver, NULL);
-static DEVICE_ATTR(hca_type, S_IRUGO, show_hca,    NULL);
-static DEVICE_ATTR(board_id, S_IRUGO, show_board,  NULL);
+static ssize_t show_msix_async_irq(struct device *device,
+				   struct device_attribute *attr, char *buf)
+{
+	struct mthca_dev *dev =
+		container_of(device, struct mthca_dev, ib_dev.dev);
+	return sprintf(buf, "%u\n",
+		       dev->eq_table.eq[MTHCA_EQ_ASYNC].msi_x_vector);
+}
+
+static ssize_t show_msix_cmd_irq(struct device *device,
+				 struct device_attribute *attr, char *buf)
+{
+	struct mthca_dev *dev =
+		container_of(device, struct mthca_dev, ib_dev.dev);
+	return sprintf(buf, "%u\n",
+		       dev->eq_table.eq[MTHCA_EQ_CMD].msi_x_vector);
+}
+
+static ssize_t show_msix_comp_irq(struct device *device,
+				  struct device_attribute *attr, char *buf)
+{
+	struct mthca_dev *dev =
+		container_of(device, struct mthca_dev, ib_dev.dev);
+	return sprintf(buf, "%u\n",
+		       dev->eq_table.eq[MTHCA_EQ_COMP].msi_x_vector);
+}
+
+static DEVICE_ATTR(hw_rev,		S_IRUGO, show_rev,		NULL);
+static DEVICE_ATTR(fw_ver,		S_IRUGO, show_fw_ver,		NULL);
+static DEVICE_ATTR(hca_type,		S_IRUGO, show_hca,		NULL);
+static DEVICE_ATTR(board_id,		S_IRUGO, show_board,		NULL);
+static DEVICE_ATTR(msix_async_irq,	S_IRUGO, show_msix_async_irq,	NULL);
+static DEVICE_ATTR(msix_cmd_irq,	S_IRUGO, show_msix_cmd_irq,	NULL);
+static DEVICE_ATTR(msix_comp_irq,	S_IRUGO, show_msix_comp_irq,	NULL);
 
 static struct device_attribute *mthca_dev_attributes[] = {
 	&dev_attr_hw_rev,
@@ -1244,6 +1274,12 @@ static struct device_attribute *mthca_dev_attributes[] = {
 	&dev_attr_board_id
 };
 
+static struct device_attribute *mthca_msix_attributes[] = {
+	&dev_attr_msix_async_irq,
+	&dev_attr_msix_cmd_irq,
+	&dev_attr_msix_comp_irq
+};
+
 static int mthca_init_node_data(struct mthca_dev *dev)
 {
 	struct ib_smp *in_mad  = NULL;
@@ -1406,15 +1442,27 @@ int mthca_register_device(struct mthca_dev *dev)
 	for (i = 0; i < ARRAY_SIZE(mthca_dev_attributes); ++i) {
 		ret = device_create_file(&dev->ib_dev.dev,
 					 mthca_dev_attributes[i]);
-		if (ret) {
-			ib_unregister_device(&dev->ib_dev);
-			return ret;
+		if (ret)
+			goto err_reg;
+	}
+
+	/* Only create msix entries if msix is enabled */
+	if (dev->pdev->msix_enabled) {
+		for (i = 0; i < ARRAY_SIZE(mthca_msix_attributes); ++i) {
+			ret = device_create_file(&dev->ib_dev.dev,
+						 mthca_msix_attributes[i]);
+			if (ret)
+				goto err_reg;
 		}
 	}
 
 	mthca_start_catas_poll(dev);
 
 	return 0;
+
+err_reg:
+	ib_unregister_device(&dev->ib_dev);
+	return ret;
 }
 
 void mthca_unregister_device(struct mthca_dev *dev)




More information about the general mailing list