Commit f2080fa3 authored by Bryan O'Sullivan's avatar Bryan O'Sullivan Committed by Roland Dreier

IB/ipath: enable GPIO interrupt on HT-460

This is required for even semi-decent performance on OpenIB.
Signed-off-by: default avatarBryan O'Sullivan <bos@pathscale.com>
Signed-off-by: default avatarRoland Dreier <rolandd@cisco.com>
parent b0ff7c20
...@@ -505,11 +505,10 @@ static u8 flash_csum(struct ipath_flash *ifp, int adjust) ...@@ -505,11 +505,10 @@ static u8 flash_csum(struct ipath_flash *ifp, int adjust)
* ipath_get_guid - get the GUID from the i2c device * ipath_get_guid - get the GUID from the i2c device
* @dd: the infinipath device * @dd: the infinipath device
* *
* When we add the multi-chip support, we will probably have to add * We have the capability to use the ipath_nguid field, and get
* the ability to use the number of guids field, and get the guid from * the guid from the first chip's flash, to use for all of them.
* the first chip's flash, to use for all of them.
*/ */
void ipath_get_guid(struct ipath_devdata *dd) void ipath_get_eeprom_info(struct ipath_devdata *dd)
{ {
void *buf; void *buf;
struct ipath_flash *ifp; struct ipath_flash *ifp;
......
...@@ -607,7 +607,12 @@ static int ipath_ht_boardname(struct ipath_devdata *dd, char *name, ...@@ -607,7 +607,12 @@ static int ipath_ht_boardname(struct ipath_devdata *dd, char *name,
case 4: /* Ponderosa is one of the bringup boards */ case 4: /* Ponderosa is one of the bringup boards */
n = "Ponderosa"; n = "Ponderosa";
break; break;
case 5: /* HT-460 original production board */ case 5:
/*
* HT-460 original production board; two production levels, with
* different serial number ranges. See ipath_ht_early_init() for
* case where we enable IPATH_GPIO_INTR for later serial # range.
*/
n = "InfiniPath_HT-460"; n = "InfiniPath_HT-460";
break; break;
case 6: case 6:
...@@ -642,7 +647,7 @@ static int ipath_ht_boardname(struct ipath_devdata *dd, char *name, ...@@ -642,7 +647,7 @@ static int ipath_ht_boardname(struct ipath_devdata *dd, char *name,
if (n) if (n)
snprintf(name, namelen, "%s", n); snprintf(name, namelen, "%s", n);
if (dd->ipath_majrev != 3 || dd->ipath_minrev != 2) { if (dd->ipath_majrev != 3 || (dd->ipath_minrev < 2 || dd->ipath_minrev > 3)) {
/* /*
* This version of the driver only supports the HT-400 * This version of the driver only supports the HT-400
* Rev 3.2 * Rev 3.2
...@@ -1520,6 +1525,18 @@ static int ipath_ht_early_init(struct ipath_devdata *dd) ...@@ -1520,6 +1525,18 @@ static int ipath_ht_early_init(struct ipath_devdata *dd)
*/ */
ipath_write_kreg(dd, dd->ipath_kregs->kr_sendctrl, ipath_write_kreg(dd, dd->ipath_kregs->kr_sendctrl,
INFINIPATH_S_ABORT); INFINIPATH_S_ABORT);
ipath_get_eeprom_info(dd);
if(dd->ipath_boardrev == 5 && dd->ipath_serial[0] == '1' &&
dd->ipath_serial[1] == '2' && dd->ipath_serial[2] == '8') {
/*
* Later production HT-460 has same changes as HT-465, so
* can use GPIO interrupts. They have serial #'s starting
* with 128, rather than 112.
*/
dd->ipath_flags |= IPATH_GPIO_INTR;
dd->ipath_flags &= ~IPATH_POLL_RX_INTR;
}
return 0; return 0;
} }
......
...@@ -879,7 +879,6 @@ int ipath_init_chip(struct ipath_devdata *dd, int reinit) ...@@ -879,7 +879,6 @@ int ipath_init_chip(struct ipath_devdata *dd, int reinit)
done: done:
if (!ret) { if (!ret) {
ipath_get_guid(dd);
*dd->ipath_statusp |= IPATH_STATUS_CHIP_PRESENT; *dd->ipath_statusp |= IPATH_STATUS_CHIP_PRESENT;
if (!dd->ipath_f_intrsetup(dd)) { if (!dd->ipath_f_intrsetup(dd)) {
/* now we can enable all interrupts from the chip */ /* now we can enable all interrupts from the chip */
......
...@@ -650,7 +650,7 @@ u32 __iomem *ipath_getpiobuf(struct ipath_devdata *, u32 *); ...@@ -650,7 +650,7 @@ u32 __iomem *ipath_getpiobuf(struct ipath_devdata *, u32 *);
void ipath_init_pe800_funcs(struct ipath_devdata *); void ipath_init_pe800_funcs(struct ipath_devdata *);
/* init HT-400-specific func */ /* init HT-400-specific func */
void ipath_init_ht400_funcs(struct ipath_devdata *); void ipath_init_ht400_funcs(struct ipath_devdata *);
void ipath_get_guid(struct ipath_devdata *); void ipath_get_eeprom_info(struct ipath_devdata *);
u64 ipath_snap_cntr(struct ipath_devdata *, ipath_creg); u64 ipath_snap_cntr(struct ipath_devdata *, ipath_creg);
/* /*
......
...@@ -1180,6 +1180,8 @@ static int ipath_pe_early_init(struct ipath_devdata *dd) ...@@ -1180,6 +1180,8 @@ static int ipath_pe_early_init(struct ipath_devdata *dd)
*/ */
dd->ipath_rhdrhead_intr_off = 1ULL<<32; dd->ipath_rhdrhead_intr_off = 1ULL<<32;
ipath_get_eeprom_info(dd);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment