提交 569b87b4 编写于 作者: A Arthur Jones 提交者: Roland Dreier

IB/ipath: Force PIOAvail update entry point

Due to a chip bug, the PIOAvail register is not always updated to
memory.  This patch allows userspace to force an update.
Signed-off-by: NBryan O'Sullivan <bryan.osullivan@qlogic.com>
Signed-off-by: NRoland Dreier <rolandd@cisco.com>
上级 7b196e2f
master alk-4.19.24 alk-4.19.30 alk-4.19.34 alk-4.19.36 alk-4.19.43 alk-4.19.48 alk-4.19.57 ck-4.19.67 ck-4.19.81 ck-4.19.91 github/fork/deepanshu1422/fix-typo-in-comment github/fork/haosdent/fix-typo linux-next v4.19.91 v4.19.90 v4.19.89 v4.19.88 v4.19.87 v4.19.86 v4.19.85 v4.19.84 v4.19.83 v4.19.82 v4.19.81 v4.19.80 v4.19.79 v4.19.78 v4.19.77 v4.19.76 v4.19.75 v4.19.74 v4.19.73 v4.19.72 v4.19.71 v4.19.70 v4.19.69 v4.19.68 v4.19.67 v4.19.66 v4.19.65 v4.19.64 v4.19.63 v4.19.62 v4.19.61 v4.19.60 v4.19.59 v4.19.58 v4.19.57 v4.19.56 v4.19.55 v4.19.54 v4.19.53 v4.19.52 v4.19.51 v4.19.50 v4.19.49 v4.19.48 v4.19.47 v4.19.46 v4.19.45 v4.19.44 v4.19.43 v4.19.42 v4.19.41 v4.19.40 v4.19.39 v4.19.38 v4.19.37 v4.19.36 v4.19.35 v4.19.34 v4.19.33 v4.19.32 v4.19.31 v4.19.30 v4.19.29 v4.19.28 v4.19.27 v4.19.26 v4.19.25 v4.19.24 v4.19.23 v4.19.22 v4.19.21 v4.19.20 v4.19.19 v4.19.18 v4.19.17 v4.19.16 v4.19.15 v4.19.14 v4.19.13 v4.19.12 v4.19.11 v4.19.10 v4.19.9 v4.19.8 v4.19.7 v4.19.6 v4.19.5 v4.19.4 v4.19.3 v4.19.2 v4.19.1 v4.19 v4.19-rc8 v4.19-rc7 v4.19-rc6 v4.19-rc5 v4.19-rc4 v4.19-rc3 v4.19-rc2 v4.19-rc1 ck-release-21 ck-release-20 ck-release-19.2 ck-release-19.1 ck-release-19 ck-release-18 ck-release-17.2 ck-release-17.1 ck-release-17 ck-release-16 ck-release-15.1 ck-release-15 ck-release-14 ck-release-13.2 ck-release-13 ck-release-12 ck-release-11 ck-release-10 ck-release-9 ck-release-7 alk-release-15 alk-release-14 alk-release-13.2 alk-release-13 alk-release-12 alk-release-11 alk-release-10 alk-release-9 alk-release-7
无相关合并请求
...@@ -352,7 +352,7 @@ struct ipath_base_info { ...@@ -352,7 +352,7 @@ struct ipath_base_info {
* may not be implemented; the user code must deal with this if it * may not be implemented; the user code must deal with this if it
* cares, or it must abort after initialization reports the difference. * cares, or it must abort after initialization reports the difference.
*/ */
#define IPATH_USER_SWMINOR 4 #define IPATH_USER_SWMINOR 5
#define IPATH_USER_SWVERSION ((IPATH_USER_SWMAJOR<<16) | IPATH_USER_SWMINOR) #define IPATH_USER_SWVERSION ((IPATH_USER_SWMAJOR<<16) | IPATH_USER_SWMINOR)
...@@ -429,8 +429,11 @@ struct ipath_user_info { ...@@ -429,8 +429,11 @@ struct ipath_user_info {
#define __IPATH_CMD_SLAVE_INFO 22 /* return info on slave processes (for old user code) */ #define __IPATH_CMD_SLAVE_INFO 22 /* return info on slave processes (for old user code) */
#define IPATH_CMD_ASSIGN_PORT 23 /* allocate HCA and port */ #define IPATH_CMD_ASSIGN_PORT 23 /* allocate HCA and port */
#define IPATH_CMD_USER_INIT 24 /* set up userspace */ #define IPATH_CMD_USER_INIT 24 /* set up userspace */
#define IPATH_CMD_UNUSED_1 25
#define IPATH_CMD_UNUSED_2 26
#define IPATH_CMD_PIOAVAILUPD 27 /* force an update of PIOAvail reg */
#define IPATH_CMD_MAX 24 #define IPATH_CMD_MAX 27
struct ipath_port_info { struct ipath_port_info {
__u32 num_active; /* number of active units */ __u32 num_active; /* number of active units */
......
...@@ -2047,6 +2047,17 @@ static int ipath_get_slave_info(struct ipath_portdata *pd, ...@@ -2047,6 +2047,17 @@ static int ipath_get_slave_info(struct ipath_portdata *pd,
return ret; return ret;
} }
static int ipath_force_pio_avail_update(struct ipath_devdata *dd)
{
u64 reg = dd->ipath_sendctrl;
clear_bit(IPATH_S_PIOBUFAVAILUPD, &reg);
ipath_write_kreg(dd, dd->ipath_kregs->kr_sendctrl, reg);
ipath_write_kreg(dd, dd->ipath_kregs->kr_sendctrl, dd->ipath_sendctrl);
return 0;
}
static ssize_t ipath_write(struct file *fp, const char __user *data, static ssize_t ipath_write(struct file *fp, const char __user *data,
size_t count, loff_t *off) size_t count, loff_t *off)
{ {
...@@ -2106,22 +2117,30 @@ static ssize_t ipath_write(struct file *fp, const char __user *data, ...@@ -2106,22 +2117,30 @@ static ssize_t ipath_write(struct file *fp, const char __user *data,
dest = &cmd.cmd.slave_mask_addr; dest = &cmd.cmd.slave_mask_addr;
src = &ucmd->cmd.slave_mask_addr; src = &ucmd->cmd.slave_mask_addr;
break; break;
case IPATH_CMD_PIOAVAILUPD: // force an update of PIOAvail reg
copy = 0;
src = NULL;
dest = NULL;
break;
default: default:
ret = -EINVAL; ret = -EINVAL;
goto bail; goto bail;
} }
if ((count - consumed) < copy) { if (copy) {
ret = -EINVAL; if ((count - consumed) < copy) {
goto bail; ret = -EINVAL;
} goto bail;
}
if (copy_from_user(dest, src, copy)) { if (copy_from_user(dest, src, copy)) {
ret = -EFAULT; ret = -EFAULT;
goto bail; goto bail;
}
consumed += copy;
} }
consumed += copy;
pd = port_fp(fp); pd = port_fp(fp);
if (!pd && cmd.type != __IPATH_CMD_USER_INIT && if (!pd && cmd.type != __IPATH_CMD_USER_INIT &&
cmd.type != IPATH_CMD_ASSIGN_PORT) { cmd.type != IPATH_CMD_ASSIGN_PORT) {
...@@ -2172,6 +2191,9 @@ static ssize_t ipath_write(struct file *fp, const char __user *data, ...@@ -2172,6 +2191,9 @@ static ssize_t ipath_write(struct file *fp, const char __user *data,
(void __user *) (unsigned long) (void __user *) (unsigned long)
cmd.cmd.slave_mask_addr); cmd.cmd.slave_mask_addr);
break; break;
case IPATH_CMD_PIOAVAILUPD:
ret = ipath_force_pio_avail_update(pd->port_dd);
break;
} }
if (ret >= 0) if (ret >= 0)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册
反馈
建议
客服 返回
顶部