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) |
