aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/hw
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/infiniband/hw')
-rw-r--r--drivers/infiniband/hw/ipath/ipath_iba6110.c14
-rw-r--r--drivers/infiniband/hw/ipath/ipath_iba6120.c74
-rw-r--r--drivers/infiniband/hw/ipath/ipath_kernel.h9
-rw-r--r--drivers/infiniband/hw/ipath/ipath_sysfs.c11
4 files changed, 85 insertions, 23 deletions
diff --git a/drivers/infiniband/hw/ipath/ipath_iba6110.c b/drivers/infiniband/hw/ipath/ipath_iba6110.c
index 684c27e42406..19e3955304c0 100644
--- a/drivers/infiniband/hw/ipath/ipath_iba6110.c
+++ b/drivers/infiniband/hw/ipath/ipath_iba6110.c
@@ -742,11 +742,10 @@ static int ipath_ht_boardname(struct ipath_devdata *dd, char *name,
742 */ 742 */
743 dd->ipath_flags |= IPATH_32BITCOUNTERS; 743 dd->ipath_flags |= IPATH_32BITCOUNTERS;
744 dd->ipath_flags |= IPATH_GPIO_INTR; 744 dd->ipath_flags |= IPATH_GPIO_INTR;
745 if (dd->ipath_htspeed != 800) 745 if (dd->ipath_lbus_speed != 800)
746 ipath_dev_err(dd, 746 ipath_dev_err(dd,
747 "Incorrectly configured for HT @ %uMHz\n", 747 "Incorrectly configured for HT @ %uMHz\n",
748 dd->ipath_htspeed); 748 dd->ipath_lbus_speed);
749 ret = 0;
750 749
751 /* 750 /*
752 * set here, not in ipath_init_*_funcs because we have to do 751 * set here, not in ipath_init_*_funcs because we have to do
@@ -911,7 +910,7 @@ static void slave_or_pri_blk(struct ipath_devdata *dd, struct pci_dev *pdev,
911 break; 910 break;
912 } 911 }
913 912
914 dd->ipath_htwidth = width; 913 dd->ipath_lbus_width = width;
915 914
916 if (linkwidth != 0x11) { 915 if (linkwidth != 0x11) {
917 ipath_dev_err(dd, "Not configured for 16 bit HT " 916 ipath_dev_err(dd, "Not configured for 16 bit HT "
@@ -959,8 +958,13 @@ static void slave_or_pri_blk(struct ipath_devdata *dd, struct pci_dev *pdev,
959 speed = 200; 958 speed = 200;
960 break; 959 break;
961 } 960 }
962 dd->ipath_htspeed = speed; 961 dd->ipath_lbus_speed = speed;
963 } 962 }
963
964 snprintf(dd->ipath_lbus_info, sizeof(dd->ipath_lbus_info),
965 "HyperTransport,%uMHz,x%u\n",
966 dd->ipath_lbus_speed,
967 dd->ipath_lbus_width);
964} 968}
965 969
966static int ipath_ht_intconfig(struct ipath_devdata *dd) 970static int ipath_ht_intconfig(struct ipath_devdata *dd)
diff --git a/drivers/infiniband/hw/ipath/ipath_iba6120.c b/drivers/infiniband/hw/ipath/ipath_iba6120.c
index 8423fee6344b..828066e20ad7 100644
--- a/drivers/infiniband/hw/ipath/ipath_iba6120.c
+++ b/drivers/infiniband/hw/ipath/ipath_iba6120.c
@@ -626,7 +626,6 @@ static int ipath_pe_boardname(struct ipath_devdata *dd, char *name,
626 dd->ipath_f_put_tid = ipath_pe_put_tid_2; 626 dd->ipath_f_put_tid = ipath_pe_put_tid_2;
627 } 627 }
628 628
629
630 /* 629 /*
631 * set here, not in ipath_init_*_funcs because we have to do 630 * set here, not in ipath_init_*_funcs because we have to do
632 * it after we can read chip registers. 631 * it after we can read chip registers.
@@ -879,6 +878,62 @@ static void ipath_setup_pe_cleanup(struct ipath_devdata *dd)
879 pci_disable_msi(dd->pcidev); 878 pci_disable_msi(dd->pcidev);
880} 879}
881 880
881static void ipath_6120_pcie_params(struct ipath_devdata *dd)
882{
883 u16 linkstat, speed;
884 int pos;
885
886 pos = pci_find_capability(dd->pcidev, PCI_CAP_ID_EXP);
887 if (!pos) {
888 ipath_dev_err(dd, "Can't find PCI Express capability!\n");
889 goto bail;
890 }
891
892 pci_read_config_word(dd->pcidev, pos + PCI_EXP_LNKSTA,
893 &linkstat);
894 /*
895 * speed is bits 0-4, linkwidth is bits 4-8
896 * no defines for them in headers
897 */
898 speed = linkstat & 0xf;
899 linkstat >>= 4;
900 linkstat &= 0x1f;
901 dd->ipath_lbus_width = linkstat;
902
903 switch (speed) {
904 case 1:
905 dd->ipath_lbus_speed = 2500; /* Gen1, 2.5GHz */
906 break;
907 case 2:
908 dd->ipath_lbus_speed = 5000; /* Gen1, 5GHz */
909 break;
910 default: /* not defined, assume gen1 */
911 dd->ipath_lbus_speed = 2500;
912 break;
913 }
914
915 if (linkstat < 8)
916 ipath_dev_err(dd,
917 "PCIe width %u (x8 HCA), performance reduced\n",
918 linkstat);
919 else
920 ipath_cdbg(VERBOSE, "PCIe speed %u width %u (x8 HCA)\n",
921 dd->ipath_lbus_speed, linkstat);
922
923 if (speed != 1)
924 ipath_dev_err(dd,
925 "PCIe linkspeed %u is incorrect; "
926 "should be 1 (2500)!\n", speed);
927bail:
928 /* fill in string, even on errors */
929 snprintf(dd->ipath_lbus_info, sizeof(dd->ipath_lbus_info),
930 "PCIe,%uMHz,x%u\n",
931 dd->ipath_lbus_speed,
932 dd->ipath_lbus_width);
933
934 return;
935}
936
882/** 937/**
883 * ipath_setup_pe_config - setup PCIe config related stuff 938 * ipath_setup_pe_config - setup PCIe config related stuff
884 * @dd: the infinipath device 939 * @dd: the infinipath device
@@ -936,19 +991,8 @@ static int ipath_setup_pe_config(struct ipath_devdata *dd,
936 } else 991 } else
937 ipath_dev_err(dd, "Can't find MSI capability, " 992 ipath_dev_err(dd, "Can't find MSI capability, "
938 "can't save MSI settings for reset\n"); 993 "can't save MSI settings for reset\n");
939 if ((pos = pci_find_capability(dd->pcidev, PCI_CAP_ID_EXP))) { 994
940 u16 linkstat; 995 ipath_6120_pcie_params(dd);
941 pci_read_config_word(dd->pcidev, pos + PCI_EXP_LNKSTA,
942 &linkstat);
943 linkstat >>= 4;
944 linkstat &= 0x1f;
945 if (linkstat != 8)
946 ipath_dev_err(dd, "PCIe width %u, "
947 "performance reduced\n", linkstat);
948 }
949 else
950 ipath_dev_err(dd, "Can't find PCI Express "
951 "capability!\n");
952 996
953 dd->ipath_link_width_supported = IB_WIDTH_1X | IB_WIDTH_4X; 997 dd->ipath_link_width_supported = IB_WIDTH_1X | IB_WIDTH_4X;
954 dd->ipath_link_speed_supported = IPATH_IB_SDR; 998 dd->ipath_link_speed_supported = IPATH_IB_SDR;
@@ -1206,6 +1250,8 @@ static int ipath_setup_pe_reset(struct ipath_devdata *dd)
1206 ret = 0; /* failed */ 1250 ret = 0; /* failed */
1207 1251
1208bail: 1252bail:
1253 if (ret)
1254 ipath_6120_pcie_params(dd);
1209 return ret; 1255 return ret;
1210} 1256}
1211 1257
diff --git a/drivers/infiniband/hw/ipath/ipath_kernel.h b/drivers/infiniband/hw/ipath/ipath_kernel.h
index 3d4a254ffca0..59dc89516243 100644
--- a/drivers/infiniband/hw/ipath/ipath_kernel.h
+++ b/drivers/infiniband/hw/ipath/ipath_kernel.h
@@ -546,10 +546,10 @@ struct ipath_devdata {
546 u32 ipath_init_ibmaxlen; 546 u32 ipath_init_ibmaxlen;
547 /* size of each rcvegrbuffer */ 547 /* size of each rcvegrbuffer */
548 u32 ipath_rcvegrbufsize; 548 u32 ipath_rcvegrbufsize;
549 /* width (2,4,8,16,32) from HT config reg */ 549 /* localbus width (1, 2,4,8,16,32) from config space */
550 u32 ipath_htwidth; 550 u32 ipath_lbus_width;
551 /* HT speed (200,400,800,1000) from HT config */ 551 /* localbus speed (HT: 200,400,800,1000; PCIe 2500) */
552 u32 ipath_htspeed; 552 u32 ipath_lbus_speed;
553 /* 553 /*
554 * number of sequential ibcstatus change for polling active/quiet 554 * number of sequential ibcstatus change for polling active/quiet
555 * (i.e., link not coming up). 555 * (i.e., link not coming up).
@@ -574,6 +574,7 @@ struct ipath_devdata {
574 u8 ipath_serial[16]; 574 u8 ipath_serial[16];
575 /* human readable board version */ 575 /* human readable board version */
576 u8 ipath_boardversion[80]; 576 u8 ipath_boardversion[80];
577 u8 ipath_lbus_info[32]; /* human readable localbus info */
577 /* chip major rev, from ipath_revision */ 578 /* chip major rev, from ipath_revision */
578 u8 ipath_majrev; 579 u8 ipath_majrev;
579 /* chip minor rev, from ipath_revision */ 580 /* chip minor rev, from ipath_revision */
diff --git a/drivers/infiniband/hw/ipath/ipath_sysfs.c b/drivers/infiniband/hw/ipath/ipath_sysfs.c
index 56dfc8a2344c..bb41c3f6aad3 100644
--- a/drivers/infiniband/hw/ipath/ipath_sysfs.c
+++ b/drivers/infiniband/hw/ipath/ipath_sysfs.c
@@ -163,6 +163,15 @@ static ssize_t show_boardversion(struct device *dev,
163 return scnprintf(buf, PAGE_SIZE, "%s", dd->ipath_boardversion); 163 return scnprintf(buf, PAGE_SIZE, "%s", dd->ipath_boardversion);
164} 164}
165 165
166static ssize_t show_localbus_info(struct device *dev,
167 struct device_attribute *attr,
168 char *buf)
169{
170 struct ipath_devdata *dd = dev_get_drvdata(dev);
171 /* The string printed here is already newline-terminated. */
172 return scnprintf(buf, PAGE_SIZE, "%s", dd->ipath_lbus_info);
173}
174
166static ssize_t show_lmc(struct device *dev, 175static ssize_t show_lmc(struct device *dev,
167 struct device_attribute *attr, 176 struct device_attribute *attr,
168 char *buf) 177 char *buf)
@@ -1011,6 +1020,7 @@ static DEVICE_ATTR(unit, S_IRUGO, show_unit, NULL);
1011static DEVICE_ATTR(rx_pol_inv, S_IWUSR, NULL, store_rx_pol_inv); 1020static DEVICE_ATTR(rx_pol_inv, S_IWUSR, NULL, store_rx_pol_inv);
1012static DEVICE_ATTR(led_override, S_IWUSR, NULL, store_led_override); 1021static DEVICE_ATTR(led_override, S_IWUSR, NULL, store_led_override);
1013static DEVICE_ATTR(logged_errors, S_IRUGO, show_logged_errs, NULL); 1022static DEVICE_ATTR(logged_errors, S_IRUGO, show_logged_errs, NULL);
1023static DEVICE_ATTR(localbus_info, S_IRUGO, show_localbus_info, NULL);
1014static DEVICE_ATTR(jint_max_packets, S_IWUSR | S_IRUGO, 1024static DEVICE_ATTR(jint_max_packets, S_IWUSR | S_IRUGO,
1015 show_jint_max_packets, store_jint_max_packets); 1025 show_jint_max_packets, store_jint_max_packets);
1016static DEVICE_ATTR(jint_idle_ticks, S_IWUSR | S_IRUGO, 1026static DEVICE_ATTR(jint_idle_ticks, S_IWUSR | S_IRUGO,
@@ -1034,6 +1044,7 @@ static struct attribute *dev_attributes[] = {
1034 &dev_attr_rx_pol_inv.attr, 1044 &dev_attr_rx_pol_inv.attr,
1035 &dev_attr_led_override.attr, 1045 &dev_attr_led_override.attr,
1036 &dev_attr_logged_errors.attr, 1046 &dev_attr_logged_errors.attr,
1047 &dev_attr_localbus_info.attr,
1037 NULL 1048 NULL
1038}; 1049};
1039 1050