diff options
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_common.h | 5 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_driver.c | 32 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_file_ops.c | 11 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_kernel.h | 2 |
4 files changed, 49 insertions, 1 deletions
diff --git a/drivers/infiniband/hw/ipath/ipath_common.h b/drivers/infiniband/hw/ipath/ipath_common.h index 0fa43ba25b7e..414621095540 100644 --- a/drivers/infiniband/hw/ipath/ipath_common.h +++ b/drivers/infiniband/hw/ipath/ipath_common.h | |||
| @@ -443,8 +443,9 @@ struct ipath_user_info { | |||
| 443 | #define IPATH_CMD_UNUSED_2 26 | 443 | #define IPATH_CMD_UNUSED_2 26 |
| 444 | #define IPATH_CMD_PIOAVAILUPD 27 /* force an update of PIOAvail reg */ | 444 | #define IPATH_CMD_PIOAVAILUPD 27 /* force an update of PIOAvail reg */ |
| 445 | #define IPATH_CMD_POLL_TYPE 28 /* set the kind of polling we want */ | 445 | #define IPATH_CMD_POLL_TYPE 28 /* set the kind of polling we want */ |
| 446 | #define IPATH_CMD_ARMLAUNCH_CTRL 29 /* armlaunch detection control */ | ||
| 446 | 447 | ||
| 447 | #define IPATH_CMD_MAX 28 | 448 | #define IPATH_CMD_MAX 29 |
| 448 | 449 | ||
| 449 | /* | 450 | /* |
| 450 | * Poll types | 451 | * Poll types |
| @@ -487,6 +488,8 @@ struct ipath_cmd { | |||
| 487 | __u64 port_info; | 488 | __u64 port_info; |
| 488 | /* enable/disable receipt of packets */ | 489 | /* enable/disable receipt of packets */ |
| 489 | __u32 recv_ctrl; | 490 | __u32 recv_ctrl; |
| 491 | /* enable/disable armlaunch errors (non-zero to enable) */ | ||
| 492 | __u32 armlaunch_ctrl; | ||
| 490 | /* partition key to set */ | 493 | /* partition key to set */ |
| 491 | __u16 part_key; | 494 | __u16 part_key; |
| 492 | /* user address of __u32 bitmask of active slaves */ | 495 | /* user address of __u32 bitmask of active slaves */ |
diff --git a/drivers/infiniband/hw/ipath/ipath_driver.c b/drivers/infiniband/hw/ipath/ipath_driver.c index bfcdf8c254c5..d5ff6ca2db30 100644 --- a/drivers/infiniband/hw/ipath/ipath_driver.c +++ b/drivers/infiniband/hw/ipath/ipath_driver.c | |||
| @@ -334,6 +334,8 @@ static void ipath_verify_pioperf(struct ipath_devdata *dd) | |||
| 334 | udelay(1); | 334 | udelay(1); |
| 335 | } | 335 | } |
| 336 | 336 | ||
| 337 | ipath_disable_armlaunch(dd); | ||
| 338 | |||
| 337 | writeq(0, piobuf); /* length 0, no dwords actually sent */ | 339 | writeq(0, piobuf); /* length 0, no dwords actually sent */ |
| 338 | ipath_flush_wc(); | 340 | ipath_flush_wc(); |
| 339 | 341 | ||
| @@ -365,6 +367,7 @@ static void ipath_verify_pioperf(struct ipath_devdata *dd) | |||
| 365 | done: | 367 | done: |
| 366 | /* disarm piobuf, so it's available again */ | 368 | /* disarm piobuf, so it's available again */ |
| 367 | ipath_disarm_piobufs(dd, pbnum, 1); | 369 | ipath_disarm_piobufs(dd, pbnum, 1); |
| 370 | ipath_enable_armlaunch(dd); | ||
| 368 | } | 371 | } |
| 369 | 372 | ||
| 370 | static int __devinit ipath_init_one(struct pci_dev *pdev, | 373 | static int __devinit ipath_init_one(struct pci_dev *pdev, |
| @@ -2271,5 +2274,34 @@ int ipath_set_rx_pol_inv(struct ipath_devdata *dd, u8 new_pol_inv) | |||
| 2271 | } | 2274 | } |
| 2272 | return 0; | 2275 | return 0; |
| 2273 | } | 2276 | } |
| 2277 | |||
| 2278 | /* | ||
| 2279 | * Disable and enable the armlaunch error. Used for PIO bandwidth testing on | ||
| 2280 | * the 7220, which is count-based, rather than trigger-based. Safe for the | ||
| 2281 | * driver check, since it's at init. Not completely safe when used for | ||
| 2282 | * user-mode checking, since some error checking can be lost, but not | ||
| 2283 | * particularly risky, and only has problematic side-effects in the face of | ||
| 2284 | * very buggy user code. There is no reference counting, but that's also | ||
| 2285 | * fine, given the intended use. | ||
| 2286 | */ | ||
| 2287 | void ipath_enable_armlaunch(struct ipath_devdata *dd) | ||
| 2288 | { | ||
| 2289 | dd->ipath_lasterror &= ~INFINIPATH_E_SPIOARMLAUNCH; | ||
| 2290 | ipath_write_kreg(dd, dd->ipath_kregs->kr_errorclear, | ||
| 2291 | INFINIPATH_E_SPIOARMLAUNCH); | ||
| 2292 | dd->ipath_errormask |= INFINIPATH_E_SPIOARMLAUNCH; | ||
| 2293 | ipath_write_kreg(dd, dd->ipath_kregs->kr_errormask, | ||
| 2294 | dd->ipath_errormask); | ||
| 2295 | } | ||
| 2296 | |||
| 2297 | void ipath_disable_armlaunch(struct ipath_devdata *dd) | ||
| 2298 | { | ||
| 2299 | /* so don't re-enable if already set */ | ||
| 2300 | dd->ipath_maskederrs &= ~INFINIPATH_E_SPIOARMLAUNCH; | ||
| 2301 | dd->ipath_errormask &= ~INFINIPATH_E_SPIOARMLAUNCH; | ||
| 2302 | ipath_write_kreg(dd, dd->ipath_kregs->kr_errormask, | ||
| 2303 | dd->ipath_errormask); | ||
| 2304 | } | ||
| 2305 | |||
| 2274 | module_init(infinipath_init); | 2306 | module_init(infinipath_init); |
| 2275 | module_exit(infinipath_cleanup); | 2307 | module_exit(infinipath_cleanup); |
diff --git a/drivers/infiniband/hw/ipath/ipath_file_ops.c b/drivers/infiniband/hw/ipath/ipath_file_ops.c index 7b2f59af9c91..7e025c8e01b6 100644 --- a/drivers/infiniband/hw/ipath/ipath_file_ops.c +++ b/drivers/infiniband/hw/ipath/ipath_file_ops.c | |||
| @@ -2224,6 +2224,11 @@ static ssize_t ipath_write(struct file *fp, const char __user *data, | |||
| 2224 | dest = &cmd.cmd.poll_type; | 2224 | dest = &cmd.cmd.poll_type; |
| 2225 | src = &ucmd->cmd.poll_type; | 2225 | src = &ucmd->cmd.poll_type; |
| 2226 | break; | 2226 | break; |
| 2227 | case IPATH_CMD_ARMLAUNCH_CTRL: | ||
| 2228 | copy = sizeof(cmd.cmd.armlaunch_ctrl); | ||
| 2229 | dest = &cmd.cmd.armlaunch_ctrl; | ||
| 2230 | src = &ucmd->cmd.armlaunch_ctrl; | ||
| 2231 | break; | ||
| 2227 | default: | 2232 | default: |
| 2228 | ret = -EINVAL; | 2233 | ret = -EINVAL; |
| 2229 | goto bail; | 2234 | goto bail; |
| @@ -2299,6 +2304,12 @@ static ssize_t ipath_write(struct file *fp, const char __user *data, | |||
| 2299 | case IPATH_CMD_POLL_TYPE: | 2304 | case IPATH_CMD_POLL_TYPE: |
| 2300 | pd->poll_type = cmd.cmd.poll_type; | 2305 | pd->poll_type = cmd.cmd.poll_type; |
| 2301 | break; | 2306 | break; |
| 2307 | case IPATH_CMD_ARMLAUNCH_CTRL: | ||
| 2308 | if (cmd.cmd.armlaunch_ctrl) | ||
| 2309 | ipath_enable_armlaunch(pd->port_dd); | ||
| 2310 | else | ||
| 2311 | ipath_disable_armlaunch(pd->port_dd); | ||
| 2312 | break; | ||
| 2302 | } | 2313 | } |
| 2303 | 2314 | ||
| 2304 | if (ret >= 0) | 2315 | if (ret >= 0) |
diff --git a/drivers/infiniband/hw/ipath/ipath_kernel.h b/drivers/infiniband/hw/ipath/ipath_kernel.h index 31d79e246aa0..4cc0f95ea877 100644 --- a/drivers/infiniband/hw/ipath/ipath_kernel.h +++ b/drivers/infiniband/hw/ipath/ipath_kernel.h | |||
| @@ -771,6 +771,8 @@ int ipath_set_linkstate(struct ipath_devdata *, u8); | |||
| 771 | int ipath_set_mtu(struct ipath_devdata *, u16); | 771 | int ipath_set_mtu(struct ipath_devdata *, u16); |
| 772 | int ipath_set_lid(struct ipath_devdata *, u32, u8); | 772 | int ipath_set_lid(struct ipath_devdata *, u32, u8); |
| 773 | int ipath_set_rx_pol_inv(struct ipath_devdata *dd, u8 new_pol_inv); | 773 | int ipath_set_rx_pol_inv(struct ipath_devdata *dd, u8 new_pol_inv); |
| 774 | void ipath_enable_armlaunch(struct ipath_devdata *); | ||
| 775 | void ipath_disable_armlaunch(struct ipath_devdata *); | ||
| 774 | 776 | ||
| 775 | /* for use in system calls, where we want to know device type, etc. */ | 777 | /* for use in system calls, where we want to know device type, etc. */ |
| 776 | #define port_fp(fp) ((struct ipath_filedata *)(fp)->private_data)->pd | 778 | #define port_fp(fp) ((struct ipath_filedata *)(fp)->private_data)->pd |
