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 |