diff options
-rw-r--r-- | drivers/infiniband/hw/ipath/ipath_common.h | 6 | ||||
-rw-r--r-- | drivers/infiniband/hw/ipath/ipath_file_ops.c | 39 |
2 files changed, 35 insertions, 10 deletions
diff --git a/drivers/infiniband/hw/ipath/ipath_common.h b/drivers/infiniband/hw/ipath/ipath_common.h index a9b109a353bc..54139d398181 100644 --- a/drivers/infiniband/hw/ipath/ipath_common.h +++ b/drivers/infiniband/hw/ipath/ipath_common.h | |||
@@ -412,15 +412,17 @@ struct ipath_user_info { | |||
412 | 412 | ||
413 | #define IPATH_CMD_MIN 16 | 413 | #define IPATH_CMD_MIN 16 |
414 | 414 | ||
415 | #define IPATH_CMD_USER_INIT 16 /* set up userspace */ | 415 | #define __IPATH_CMD_USER_INIT 16 /* old set up userspace (for old user code) */ |
416 | #define IPATH_CMD_PORT_INFO 17 /* find out what resources we got */ | 416 | #define IPATH_CMD_PORT_INFO 17 /* find out what resources we got */ |
417 | #define IPATH_CMD_RECV_CTRL 18 /* control receipt of packets */ | 417 | #define IPATH_CMD_RECV_CTRL 18 /* control receipt of packets */ |
418 | #define IPATH_CMD_TID_UPDATE 19 /* update expected TID entries */ | 418 | #define IPATH_CMD_TID_UPDATE 19 /* update expected TID entries */ |
419 | #define IPATH_CMD_TID_FREE 20 /* free expected TID entries */ | 419 | #define IPATH_CMD_TID_FREE 20 /* free expected TID entries */ |
420 | #define IPATH_CMD_SET_PART_KEY 21 /* add partition key */ | 420 | #define IPATH_CMD_SET_PART_KEY 21 /* add partition key */ |
421 | #define IPATH_CMD_SLAVE_INFO 22 /* return info on slave processes */ | 421 | #define IPATH_CMD_SLAVE_INFO 22 /* return info on slave processes */ |
422 | #define IPATH_CMD_ASSIGN_PORT 23 /* allocate HCA and port */ | ||
423 | #define IPATH_CMD_USER_INIT 24 /* set up userspace */ | ||
422 | 424 | ||
423 | #define IPATH_CMD_MAX 22 | 425 | #define IPATH_CMD_MAX 24 |
424 | 426 | ||
425 | struct ipath_port_info { | 427 | struct ipath_port_info { |
426 | __u32 num_active; /* number of active units */ | 428 | __u32 num_active; /* number of active units */ |
diff --git a/drivers/infiniband/hw/ipath/ipath_file_ops.c b/drivers/infiniband/hw/ipath/ipath_file_ops.c index 64221b937762..a9ddc6911f66 100644 --- a/drivers/infiniband/hw/ipath/ipath_file_ops.c +++ b/drivers/infiniband/hw/ipath/ipath_file_ops.c | |||
@@ -1701,18 +1701,17 @@ done: | |||
1701 | 1701 | ||
1702 | static int ipath_open(struct inode *in, struct file *fp) | 1702 | static int ipath_open(struct inode *in, struct file *fp) |
1703 | { | 1703 | { |
1704 | /* The real work is performed later in ipath_do_user_init() */ | 1704 | /* The real work is performed later in ipath_assign_port() */ |
1705 | fp->private_data = kzalloc(sizeof(struct ipath_filedata), GFP_KERNEL); | 1705 | fp->private_data = kzalloc(sizeof(struct ipath_filedata), GFP_KERNEL); |
1706 | return fp->private_data ? 0 : -ENOMEM; | 1706 | return fp->private_data ? 0 : -ENOMEM; |
1707 | } | 1707 | } |
1708 | 1708 | ||
1709 | static int ipath_do_user_init(struct file *fp, | 1709 | |
1710 | /* Get port early, so can set affinity prior to memory allocation */ | ||
1711 | static int ipath_assign_port(struct file *fp, | ||
1710 | const struct ipath_user_info *uinfo) | 1712 | const struct ipath_user_info *uinfo) |
1711 | { | 1713 | { |
1712 | int ret; | 1714 | int ret; |
1713 | struct ipath_portdata *pd; | ||
1714 | struct ipath_devdata *dd; | ||
1715 | u32 head32; | ||
1716 | int i_minor; | 1715 | int i_minor; |
1717 | unsigned swminor; | 1716 | unsigned swminor; |
1718 | 1717 | ||
@@ -1757,8 +1756,18 @@ static int ipath_do_user_init(struct file *fp, | |||
1757 | 1756 | ||
1758 | mutex_unlock(&ipath_mutex); | 1757 | mutex_unlock(&ipath_mutex); |
1759 | 1758 | ||
1760 | if (ret) | 1759 | done: |
1761 | goto done; | 1760 | return ret; |
1761 | } | ||
1762 | |||
1763 | |||
1764 | static int ipath_do_user_init(struct file *fp, | ||
1765 | const struct ipath_user_info *uinfo) | ||
1766 | { | ||
1767 | int ret; | ||
1768 | struct ipath_portdata *pd; | ||
1769 | struct ipath_devdata *dd; | ||
1770 | u32 head32; | ||
1762 | 1771 | ||
1763 | pd = port_fp(fp); | 1772 | pd = port_fp(fp); |
1764 | dd = pd->port_dd; | 1773 | dd = pd->port_dd; |
@@ -2035,6 +2044,8 @@ static ssize_t ipath_write(struct file *fp, const char __user *data, | |||
2035 | consumed = sizeof(cmd.type); | 2044 | consumed = sizeof(cmd.type); |
2036 | 2045 | ||
2037 | switch (cmd.type) { | 2046 | switch (cmd.type) { |
2047 | case IPATH_CMD_ASSIGN_PORT: | ||
2048 | case __IPATH_CMD_USER_INIT: | ||
2038 | case IPATH_CMD_USER_INIT: | 2049 | case IPATH_CMD_USER_INIT: |
2039 | copy = sizeof(cmd.cmd.user_info); | 2050 | copy = sizeof(cmd.cmd.user_info); |
2040 | dest = &cmd.cmd.user_info; | 2051 | dest = &cmd.cmd.user_info; |
@@ -2083,12 +2094,24 @@ static ssize_t ipath_write(struct file *fp, const char __user *data, | |||
2083 | 2094 | ||
2084 | consumed += copy; | 2095 | consumed += copy; |
2085 | pd = port_fp(fp); | 2096 | pd = port_fp(fp); |
2086 | if (!pd && cmd.type != IPATH_CMD_USER_INIT) { | 2097 | if (!pd && cmd.type != __IPATH_CMD_USER_INIT && |
2098 | cmd.type != IPATH_CMD_ASSIGN_PORT) { | ||
2087 | ret = -EINVAL; | 2099 | ret = -EINVAL; |
2088 | goto bail; | 2100 | goto bail; |
2089 | } | 2101 | } |
2090 | 2102 | ||
2091 | switch (cmd.type) { | 2103 | switch (cmd.type) { |
2104 | case IPATH_CMD_ASSIGN_PORT: | ||
2105 | ret = ipath_assign_port(fp, &cmd.cmd.user_info); | ||
2106 | if (ret) | ||
2107 | goto bail; | ||
2108 | break; | ||
2109 | case __IPATH_CMD_USER_INIT: | ||
2110 | /* backwards compatibility, get port first */ | ||
2111 | ret = ipath_assign_port(fp, &cmd.cmd.user_info); | ||
2112 | if (ret) | ||
2113 | goto bail; | ||
2114 | /* and fall through to current version. */ | ||
2092 | case IPATH_CMD_USER_INIT: | 2115 | case IPATH_CMD_USER_INIT: |
2093 | ret = ipath_do_user_init(fp, &cmd.cmd.user_info); | 2116 | ret = ipath_do_user_init(fp, &cmd.cmd.user_info); |
2094 | if (ret) | 2117 | if (ret) |