diff options
| author | Bryan O'Sullivan <bos@pathscale.com> | 2006-08-25 14:24:48 -0400 |
|---|---|---|
| committer | Roland Dreier <rolandd@cisco.com> | 2006-09-22 18:22:40 -0400 |
| commit | 30fc5c3130bdbc7cc051a2d6054ad38360d408a8 (patch) | |
| tree | 6928159aeed17f8a15ae705a0ce16551bef5811e /drivers/infiniband | |
| parent | e35d710d0c5b74bc9833d6a3791706bd577a3724 (diff) | |
IB/ipath: control receive polarity inversion
Signed-off-by: Bryan O'Sullivan <bryan.osullivan@qlogic.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'drivers/infiniband')
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_driver.c | 17 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_iba6110.c | 9 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_iba6120.c | 9 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_kernel.h | 3 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_registers.h | 2 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_sysfs.c | 29 |
6 files changed, 69 insertions, 0 deletions
diff --git a/drivers/infiniband/hw/ipath/ipath_driver.c b/drivers/infiniband/hw/ipath/ipath_driver.c index 3a15efee7387..47c9d15557c8 100644 --- a/drivers/infiniband/hw/ipath/ipath_driver.c +++ b/drivers/infiniband/hw/ipath/ipath_driver.c | |||
| @@ -2116,5 +2116,22 @@ bail: | |||
| 2116 | return ret; | 2116 | return ret; |
| 2117 | } | 2117 | } |
| 2118 | 2118 | ||
| 2119 | int ipath_set_rx_pol_inv(struct ipath_devdata *dd, u8 new_pol_inv) | ||
| 2120 | { | ||
| 2121 | u64 val; | ||
| 2122 | if ( new_pol_inv > INFINIPATH_XGXS_RX_POL_MASK ) { | ||
| 2123 | return -1; | ||
| 2124 | } | ||
| 2125 | if ( dd->ipath_rx_pol_inv != new_pol_inv ) { | ||
| 2126 | dd->ipath_rx_pol_inv = new_pol_inv; | ||
| 2127 | val = ipath_read_kreg64(dd, dd->ipath_kregs->kr_xgxsconfig); | ||
| 2128 | val &= ~(INFINIPATH_XGXS_RX_POL_MASK << | ||
| 2129 | INFINIPATH_XGXS_RX_POL_SHIFT); | ||
| 2130 | val |= ((u64)dd->ipath_rx_pol_inv) << | ||
| 2131 | INFINIPATH_XGXS_RX_POL_SHIFT; | ||
| 2132 | ipath_write_kreg(dd, dd->ipath_kregs->kr_xgxsconfig, val); | ||
| 2133 | } | ||
| 2134 | return 0; | ||
| 2135 | } | ||
| 2119 | module_init(infinipath_init); | 2136 | module_init(infinipath_init); |
| 2120 | module_exit(infinipath_cleanup); | 2137 | module_exit(infinipath_cleanup); |
diff --git a/drivers/infiniband/hw/ipath/ipath_iba6110.c b/drivers/infiniband/hw/ipath/ipath_iba6110.c index 7028c98e5c4f..bf2455a6d562 100644 --- a/drivers/infiniband/hw/ipath/ipath_iba6110.c +++ b/drivers/infiniband/hw/ipath/ipath_iba6110.c | |||
| @@ -1290,6 +1290,15 @@ static int ipath_ht_bringup_serdes(struct ipath_devdata *dd) | |||
| 1290 | val &= ~INFINIPATH_XGXS_RESET; | 1290 | val &= ~INFINIPATH_XGXS_RESET; |
| 1291 | change = 1; | 1291 | change = 1; |
| 1292 | } | 1292 | } |
| 1293 | if (((val >> INFINIPATH_XGXS_RX_POL_SHIFT) & | ||
| 1294 | INFINIPATH_XGXS_RX_POL_MASK) != dd->ipath_rx_pol_inv ) { | ||
| 1295 | /* need to compensate for Tx inversion in partner */ | ||
| 1296 | val &= ~(INFINIPATH_XGXS_RX_POL_MASK << | ||
| 1297 | INFINIPATH_XGXS_RX_POL_SHIFT); | ||
| 1298 | val |= dd->ipath_rx_pol_inv << | ||
| 1299 | INFINIPATH_XGXS_RX_POL_SHIFT; | ||
| 1300 | change = 1; | ||
| 1301 | } | ||
| 1293 | if (change) | 1302 | if (change) |
| 1294 | ipath_write_kreg(dd, dd->ipath_kregs->kr_xgxsconfig, val); | 1303 | ipath_write_kreg(dd, dd->ipath_kregs->kr_xgxsconfig, val); |
| 1295 | 1304 | ||
diff --git a/drivers/infiniband/hw/ipath/ipath_iba6120.c b/drivers/infiniband/hw/ipath/ipath_iba6120.c index 3a7640be2530..d86516d23df6 100644 --- a/drivers/infiniband/hw/ipath/ipath_iba6120.c +++ b/drivers/infiniband/hw/ipath/ipath_iba6120.c | |||
| @@ -654,6 +654,15 @@ static int ipath_pe_bringup_serdes(struct ipath_devdata *dd) | |||
| 654 | val &= ~INFINIPATH_XGXS_RESET; | 654 | val &= ~INFINIPATH_XGXS_RESET; |
| 655 | change = 1; | 655 | change = 1; |
| 656 | } | 656 | } |
| 657 | if (((val >> INFINIPATH_XGXS_RX_POL_SHIFT) & | ||
| 658 | INFINIPATH_XGXS_RX_POL_MASK) != dd->ipath_rx_pol_inv ) { | ||
| 659 | /* need to compensate for Tx inversion in partner */ | ||
| 660 | val &= ~(INFINIPATH_XGXS_RX_POL_MASK << | ||
| 661 | INFINIPATH_XGXS_RX_POL_SHIFT); | ||
| 662 | val |= dd->ipath_rx_pol_inv << | ||
| 663 | INFINIPATH_XGXS_RX_POL_SHIFT; | ||
| 664 | change = 1; | ||
| 665 | } | ||
| 657 | if (change) | 666 | if (change) |
| 658 | ipath_write_kreg(dd, dd->ipath_kregs->kr_xgxsconfig, val); | 667 | ipath_write_kreg(dd, dd->ipath_kregs->kr_xgxsconfig, val); |
| 659 | 668 | ||
diff --git a/drivers/infiniband/hw/ipath/ipath_kernel.h b/drivers/infiniband/hw/ipath/ipath_kernel.h index 2530686f6893..a8a56276ff1d 100644 --- a/drivers/infiniband/hw/ipath/ipath_kernel.h +++ b/drivers/infiniband/hw/ipath/ipath_kernel.h | |||
| @@ -503,6 +503,8 @@ struct ipath_devdata { | |||
| 503 | u8 ipath_pci_cacheline; | 503 | u8 ipath_pci_cacheline; |
| 504 | /* LID mask control */ | 504 | /* LID mask control */ |
| 505 | u8 ipath_lmc; | 505 | u8 ipath_lmc; |
| 506 | /* Rx Polarity inversion (compensate for ~tx on partner) */ | ||
| 507 | u8 ipath_rx_pol_inv; | ||
| 506 | 508 | ||
| 507 | /* local link integrity counter */ | 509 | /* local link integrity counter */ |
| 508 | u32 ipath_lli_counter; | 510 | u32 ipath_lli_counter; |
| @@ -567,6 +569,7 @@ void ipath_get_faststats(unsigned long); | |||
| 567 | int ipath_set_linkstate(struct ipath_devdata *, u8); | 569 | int ipath_set_linkstate(struct ipath_devdata *, u8); |
| 568 | int ipath_set_mtu(struct ipath_devdata *, u16); | 570 | int ipath_set_mtu(struct ipath_devdata *, u16); |
| 569 | int ipath_set_lid(struct ipath_devdata *, u32, u8); | 571 | int ipath_set_lid(struct ipath_devdata *, u32, u8); |
| 572 | int ipath_set_rx_pol_inv(struct ipath_devdata *dd, u8 new_pol_inv); | ||
| 570 | 573 | ||
| 571 | /* for use in system calls, where we want to know device type, etc. */ | 574 | /* for use in system calls, where we want to know device type, etc. */ |
| 572 | #define port_fp(fp) ((struct ipath_portdata *) (fp)->private_data) | 575 | #define port_fp(fp) ((struct ipath_portdata *) (fp)->private_data) |
diff --git a/drivers/infiniband/hw/ipath/ipath_registers.h b/drivers/infiniband/hw/ipath/ipath_registers.h index f08c86088ca4..6e23b3d632b8 100644 --- a/drivers/infiniband/hw/ipath/ipath_registers.h +++ b/drivers/infiniband/hw/ipath/ipath_registers.h | |||
| @@ -282,6 +282,8 @@ | |||
| 282 | #define INFINIPATH_XGXS_RESET 0x7ULL | 282 | #define INFINIPATH_XGXS_RESET 0x7ULL |
| 283 | #define INFINIPATH_XGXS_MDIOADDR_MASK 0xfULL | 283 | #define INFINIPATH_XGXS_MDIOADDR_MASK 0xfULL |
| 284 | #define INFINIPATH_XGXS_MDIOADDR_SHIFT 4 | 284 | #define INFINIPATH_XGXS_MDIOADDR_SHIFT 4 |
| 285 | #define INFINIPATH_XGXS_RX_POL_SHIFT 19 | ||
| 286 | #define INFINIPATH_XGXS_RX_POL_MASK 0xfULL | ||
| 285 | 287 | ||
| 286 | #define INFINIPATH_RT_ADDR_MASK 0xFFFFFFFFFFULL /* 40 bits valid */ | 288 | #define INFINIPATH_RT_ADDR_MASK 0xFFFFFFFFFFULL /* 40 bits valid */ |
| 287 | 289 | ||
diff --git a/drivers/infiniband/hw/ipath/ipath_sysfs.c b/drivers/infiniband/hw/ipath/ipath_sysfs.c index 8476dd3c7af4..e299148c4b68 100644 --- a/drivers/infiniband/hw/ipath/ipath_sysfs.c +++ b/drivers/infiniband/hw/ipath/ipath_sysfs.c | |||
| @@ -561,6 +561,33 @@ bail: | |||
| 561 | return ret; | 561 | return ret; |
| 562 | } | 562 | } |
| 563 | 563 | ||
| 564 | static ssize_t store_rx_pol_inv(struct device *dev, | ||
| 565 | struct device_attribute *attr, | ||
| 566 | const char *buf, | ||
| 567 | size_t count) | ||
| 568 | { | ||
| 569 | struct ipath_devdata *dd = dev_get_drvdata(dev); | ||
| 570 | int ret, r; | ||
| 571 | u16 val; | ||
| 572 | |||
| 573 | ret = ipath_parse_ushort(buf, &val); | ||
| 574 | if (ret < 0) | ||
| 575 | goto invalid; | ||
| 576 | |||
| 577 | r = ipath_set_rx_pol_inv(dd, val); | ||
| 578 | if (r < 0) { | ||
| 579 | ret = r; | ||
| 580 | goto bail; | ||
| 581 | } | ||
| 582 | |||
| 583 | goto bail; | ||
| 584 | invalid: | ||
| 585 | ipath_dev_err(dd, "attempt to set invalid Rx Polarity invert\n"); | ||
| 586 | bail: | ||
| 587 | return ret; | ||
| 588 | } | ||
| 589 | |||
| 590 | |||
| 564 | static DRIVER_ATTR(num_units, S_IRUGO, show_num_units, NULL); | 591 | static DRIVER_ATTR(num_units, S_IRUGO, show_num_units, NULL); |
| 565 | static DRIVER_ATTR(version, S_IRUGO, show_version, NULL); | 592 | static DRIVER_ATTR(version, S_IRUGO, show_version, NULL); |
| 566 | 593 | ||
| @@ -587,6 +614,7 @@ static DEVICE_ATTR(status, S_IRUGO, show_status, NULL); | |||
| 587 | static DEVICE_ATTR(status_str, S_IRUGO, show_status_str, NULL); | 614 | static DEVICE_ATTR(status_str, S_IRUGO, show_status_str, NULL); |
| 588 | static DEVICE_ATTR(boardversion, S_IRUGO, show_boardversion, NULL); | 615 | static DEVICE_ATTR(boardversion, S_IRUGO, show_boardversion, NULL); |
| 589 | static DEVICE_ATTR(unit, S_IRUGO, show_unit, NULL); | 616 | static DEVICE_ATTR(unit, S_IRUGO, show_unit, NULL); |
| 617 | static DEVICE_ATTR(rx_pol_inv, S_IWUSR, NULL, store_rx_pol_inv); | ||
| 590 | 618 | ||
| 591 | static struct attribute *dev_attributes[] = { | 619 | static struct attribute *dev_attributes[] = { |
| 592 | &dev_attr_guid.attr, | 620 | &dev_attr_guid.attr, |
| @@ -601,6 +629,7 @@ static struct attribute *dev_attributes[] = { | |||
| 601 | &dev_attr_boardversion.attr, | 629 | &dev_attr_boardversion.attr, |
| 602 | &dev_attr_unit.attr, | 630 | &dev_attr_unit.attr, |
| 603 | &dev_attr_enabled.attr, | 631 | &dev_attr_enabled.attr, |
| 632 | &dev_attr_rx_pol_inv.attr, | ||
| 604 | NULL | 633 | NULL |
| 605 | }; | 634 | }; |
| 606 | 635 | ||
