Skip to content

Commit

Permalink
IB/ipath: Initialize diagpkt file on device init only
Browse files Browse the repository at this point in the history
Don't attempt to set up the diagpkt device in the module init code.
Instead, wait until a piece of hardware is initialized.  Fixes a
problem when loading the ib_ipath module when no InfiniPath hardware
is present: modprobe would go into the D state and stay there.

Signed-off-by: Robert Walsh <robert.walsh@qlogic.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
  • Loading branch information
Robert Walsh authored and Roland Dreier committed Oct 16, 2006
1 parent fb7711e commit 6ef93dd
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 40 deletions.
65 changes: 38 additions & 27 deletions drivers/infiniband/hw/ipath/ipath_diag.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,19 +67,54 @@ static struct file_operations diag_file_ops = {
.release = ipath_diag_release
};

static ssize_t ipath_diagpkt_write(struct file *fp,
const char __user *data,
size_t count, loff_t *off);

static struct file_operations diagpkt_file_ops = {
.owner = THIS_MODULE,
.write = ipath_diagpkt_write,
};

static atomic_t diagpkt_count = ATOMIC_INIT(0);
static struct cdev *diagpkt_cdev;
static struct class_device *diagpkt_class_dev;

int ipath_diag_add(struct ipath_devdata *dd)
{
char name[16];
int ret = 0;

if (atomic_inc_return(&diagpkt_count) == 1) {
ret = ipath_cdev_init(IPATH_DIAGPKT_MINOR,
"ipath_diagpkt", &diagpkt_file_ops,
&diagpkt_cdev, &diagpkt_class_dev);

if (ret) {
ipath_dev_err(dd, "Couldn't create ipath_diagpkt "
"device: %d", ret);
goto done;
}
}

snprintf(name, sizeof(name), "ipath_diag%d", dd->ipath_unit);

return ipath_cdev_init(IPATH_DIAG_MINOR_BASE + dd->ipath_unit, name,
&diag_file_ops, &dd->diag_cdev,
&dd->diag_class_dev);
ret = ipath_cdev_init(IPATH_DIAG_MINOR_BASE + dd->ipath_unit, name,
&diag_file_ops, &dd->diag_cdev,
&dd->diag_class_dev);
if (ret)
ipath_dev_err(dd, "Couldn't create %s device: %d",
name, ret);

done:
return ret;
}

void ipath_diag_remove(struct ipath_devdata *dd)
{
if (atomic_dec_and_test(&diagpkt_count))
ipath_cdev_cleanup(&diagpkt_cdev, &diagpkt_class_dev);

ipath_cdev_cleanup(&dd->diag_cdev, &dd->diag_class_dev);
}

Expand Down Expand Up @@ -275,30 +310,6 @@ static int ipath_diag_open(struct inode *in, struct file *fp)
return ret;
}

static ssize_t ipath_diagpkt_write(struct file *fp,
const char __user *data,
size_t count, loff_t *off);

static struct file_operations diagpkt_file_ops = {
.owner = THIS_MODULE,
.write = ipath_diagpkt_write,
};

static struct cdev *diagpkt_cdev;
static struct class_device *diagpkt_class_dev;

int __init ipath_diagpkt_add(void)
{
return ipath_cdev_init(IPATH_DIAGPKT_MINOR,
"ipath_diagpkt", &diagpkt_file_ops,
&diagpkt_cdev, &diagpkt_class_dev);
}

void __exit ipath_diagpkt_remove(void)
{
ipath_cdev_cleanup(&diagpkt_cdev, &diagpkt_class_dev);
}

/**
* ipath_diagpkt_write - write an IB packet
* @fp: the diag data device file pointer
Expand Down
10 changes: 0 additions & 10 deletions drivers/infiniband/hw/ipath/ipath_driver.c
Original file line number Diff line number Diff line change
Expand Up @@ -2005,18 +2005,8 @@ static int __init infinipath_init(void)
goto bail_group;
}

ret = ipath_diagpkt_add();
if (ret < 0) {
printk(KERN_ERR IPATH_DRV_NAME ": Unable to create "
"diag data device: error %d\n", -ret);
goto bail_ipathfs;
}

goto bail;

bail_ipathfs:
ipath_exit_ipathfs();

bail_group:
ipath_driver_remove_group(&ipath_driver.driver);

Expand Down
3 changes: 0 additions & 3 deletions drivers/infiniband/hw/ipath/ipath_kernel.h
Original file line number Diff line number Diff line change
Expand Up @@ -869,9 +869,6 @@ int ipath_device_create_group(struct device *, struct ipath_devdata *);
void ipath_device_remove_group(struct device *, struct ipath_devdata *);
int ipath_expose_reset(struct device *);

int ipath_diagpkt_add(void);
void ipath_diagpkt_remove(void);

int ipath_init_ipathfs(void);
void ipath_exit_ipathfs(void);
int ipathfs_add_device(struct ipath_devdata *);
Expand Down

0 comments on commit 6ef93dd

Please sign in to comment.