diff options
Diffstat (limited to 'drivers/infiniband')
-rw-r--r-- | drivers/infiniband/hw/qib/qib_iba7322.c | 120 | ||||
-rw-r--r-- | drivers/infiniband/hw/qib/qib_init.c | 4 | ||||
-rw-r--r-- | drivers/infiniband/hw/qib/qib_qsfp.c | 25 | ||||
-rw-r--r-- | drivers/infiniband/hw/qib/qib_qsfp.h | 2 |
4 files changed, 94 insertions, 57 deletions
diff --git a/drivers/infiniband/hw/qib/qib_iba7322.c b/drivers/infiniband/hw/qib/qib_iba7322.c index 708f4fea6afa..86575fbcaef7 100644 --- a/drivers/infiniband/hw/qib/qib_iba7322.c +++ b/drivers/infiniband/hw/qib/qib_iba7322.c | |||
@@ -2381,17 +2381,17 @@ static int qib_7322_bringup_serdes(struct qib_pportdata *ppd) | |||
2381 | ppd->cpspec->ibcctrl_a |= SYM_MASK(IBCCtrlA_0, IBLinkEn); | 2381 | ppd->cpspec->ibcctrl_a |= SYM_MASK(IBCCtrlA_0, IBLinkEn); |
2382 | set_vls(ppd); | 2382 | set_vls(ppd); |
2383 | 2383 | ||
2384 | /* Hold the link state machine for mezz boards */ | ||
2385 | qib_set_ib_7322_lstate(ppd, 0, | ||
2386 | QLOGIC_IB_IBCC_LINKINITCMD_DISABLE); | ||
2387 | |||
2388 | |||
2384 | /* be paranoid against later code motion, etc. */ | 2389 | /* be paranoid against later code motion, etc. */ |
2385 | spin_lock_irqsave(&dd->cspec->rcvmod_lock, flags); | 2390 | spin_lock_irqsave(&dd->cspec->rcvmod_lock, flags); |
2386 | ppd->p_rcvctrl |= SYM_MASK(RcvCtrl_0, RcvIBPortEnable); | 2391 | ppd->p_rcvctrl |= SYM_MASK(RcvCtrl_0, RcvIBPortEnable); |
2387 | qib_write_kreg_port(ppd, krp_rcvctrl, ppd->p_rcvctrl); | 2392 | qib_write_kreg_port(ppd, krp_rcvctrl, ppd->p_rcvctrl); |
2388 | spin_unlock_irqrestore(&dd->cspec->rcvmod_lock, flags); | 2393 | spin_unlock_irqrestore(&dd->cspec->rcvmod_lock, flags); |
2389 | 2394 | ||
2390 | /* Hold the link state machine for mezz boards */ | ||
2391 | if (IS_QMH(dd) || IS_QME(dd)) | ||
2392 | qib_set_ib_7322_lstate(ppd, 0, | ||
2393 | QLOGIC_IB_IBCC_LINKINITCMD_DISABLE); | ||
2394 | |||
2395 | /* Also enable IBSTATUSCHG interrupt. */ | 2395 | /* Also enable IBSTATUSCHG interrupt. */ |
2396 | val = qib_read_kreg_port(ppd, krp_errmask); | 2396 | val = qib_read_kreg_port(ppd, krp_errmask); |
2397 | qib_write_kreg_port(ppd, krp_errmask, | 2397 | qib_write_kreg_port(ppd, krp_errmask, |
@@ -5229,6 +5229,8 @@ static int qib_7322_ib_updown(struct qib_pportdata *ppd, int ibup, u64 ibcs) | |||
5229 | QIBL_IB_AUTONEG_INPROG))) | 5229 | QIBL_IB_AUTONEG_INPROG))) |
5230 | set_7322_ibspeed_fast(ppd, ppd->link_speed_enabled); | 5230 | set_7322_ibspeed_fast(ppd, ppd->link_speed_enabled); |
5231 | if (!(ppd->lflags & QIBL_IB_AUTONEG_INPROG)) { | 5231 | if (!(ppd->lflags & QIBL_IB_AUTONEG_INPROG)) { |
5232 | struct qib_qsfp_data *qd = | ||
5233 | &ppd->cpspec->qsfp_data; | ||
5232 | /* unlock the Tx settings, speed may change */ | 5234 | /* unlock the Tx settings, speed may change */ |
5233 | qib_write_kreg_port(ppd, krp_tx_deemph_override, | 5235 | qib_write_kreg_port(ppd, krp_tx_deemph_override, |
5234 | SYM_MASK(IBSD_TX_DEEMPHASIS_OVERRIDE_0, | 5236 | SYM_MASK(IBSD_TX_DEEMPHASIS_OVERRIDE_0, |
@@ -5236,6 +5238,12 @@ static int qib_7322_ib_updown(struct qib_pportdata *ppd, int ibup, u64 ibcs) | |||
5236 | qib_cancel_sends(ppd); | 5238 | qib_cancel_sends(ppd); |
5237 | /* on link down, ensure sane pcs state */ | 5239 | /* on link down, ensure sane pcs state */ |
5238 | qib_7322_mini_pcs_reset(ppd); | 5240 | qib_7322_mini_pcs_reset(ppd); |
5241 | /* schedule the qsfp refresh which should turn the link | ||
5242 | off */ | ||
5243 | if (ppd->dd->flags & QIB_HAS_QSFP) { | ||
5244 | qd->t_insert = get_jiffies_64(); | ||
5245 | schedule_work(&qd->work); | ||
5246 | } | ||
5239 | spin_lock_irqsave(&ppd->sdma_lock, flags); | 5247 | spin_lock_irqsave(&ppd->sdma_lock, flags); |
5240 | if (__qib_sdma_running(ppd)) | 5248 | if (__qib_sdma_running(ppd)) |
5241 | __qib_sdma_process_event(ppd, | 5249 | __qib_sdma_process_event(ppd, |
@@ -5591,38 +5599,62 @@ static void qsfp_7322_event(struct work_struct *work) | |||
5591 | 5599 | ||
5592 | qd = container_of(work, struct qib_qsfp_data, work); | 5600 | qd = container_of(work, struct qib_qsfp_data, work); |
5593 | ppd = qd->ppd; | 5601 | ppd = qd->ppd; |
5594 | pwrup = qd->t_insert + msecs_to_jiffies(QSFP_PWR_LAG_MSEC); | 5602 | pwrup = qd->t_insert + |
5603 | msecs_to_jiffies(QSFP_PWR_LAG_MSEC - QSFP_MODPRS_LAG_MSEC); | ||
5595 | 5604 | ||
5596 | /* | 5605 | /* Delay for 20 msecs to allow ModPrs resistor to setup */ |
5597 | * Some QSFP's not only do not respond until the full power-up | 5606 | mdelay(QSFP_MODPRS_LAG_MSEC); |
5598 | * time, but may behave badly if we try. So hold off responding | 5607 | |
5599 | * to insertion. | 5608 | if (!qib_qsfp_mod_present(ppd)) |
5600 | */ | 5609 | /* Set the physical link to disabled */ |
5601 | while (1) { | 5610 | qib_set_ib_7322_lstate(ppd, 0, |
5602 | u64 now = get_jiffies_64(); | 5611 | QLOGIC_IB_IBCC_LINKINITCMD_DISABLE); |
5603 | if (time_after64(now, pwrup)) | 5612 | else { |
5604 | break; | 5613 | /* |
5605 | msleep(20); | 5614 | * Some QSFP's not only do not respond until the full power-up |
5606 | } | 5615 | * time, but may behave badly if we try. So hold off responding |
5607 | ret = qib_refresh_qsfp_cache(ppd, &qd->cache); | 5616 | * to insertion. |
5608 | /* | 5617 | */ |
5609 | * Need to change LE2 back to defaults if we couldn't | 5618 | while (1) { |
5610 | * read the cable type (to handle cable swaps), so do this | 5619 | u64 now = get_jiffies_64(); |
5611 | * even on failure to read cable information. We don't | 5620 | if (time_after64(now, pwrup)) |
5612 | * get here for QME, so IS_QME check not needed here. | 5621 | break; |
5613 | */ | 5622 | msleep(20); |
5614 | if (!ret && !ppd->dd->cspec->r1) { | 5623 | } |
5615 | if (QSFP_IS_ACTIVE_FAR(qd->cache.tech)) | 5624 | |
5616 | le2 = LE2_QME; | 5625 | ret = qib_refresh_qsfp_cache(ppd, &qd->cache); |
5617 | else if (qd->cache.atten[1] >= qib_long_atten && | 5626 | |
5618 | QSFP_IS_CU(qd->cache.tech)) | 5627 | /* |
5619 | le2 = LE2_5m; | 5628 | * Need to change LE2 back to defaults if we couldn't |
5620 | else | 5629 | * read the cable type (to handle cable swaps), so do this |
5630 | * even on failure to read cable information. We don't | ||
5631 | * get here for QME, so IS_QME check not needed here. | ||
5632 | */ | ||
5633 | if (!ret && !ppd->dd->cspec->r1) { | ||
5634 | if (QSFP_IS_ACTIVE_FAR(qd->cache.tech)) | ||
5635 | le2 = LE2_QME; | ||
5636 | else if (qd->cache.atten[1] >= qib_long_atten && | ||
5637 | QSFP_IS_CU(qd->cache.tech)) | ||
5638 | le2 = LE2_5m; | ||
5639 | else | ||
5640 | le2 = LE2_DEFAULT; | ||
5641 | } else | ||
5621 | le2 = LE2_DEFAULT; | 5642 | le2 = LE2_DEFAULT; |
5622 | } else | 5643 | ibsd_wr_allchans(ppd, 13, (le2 << 7), BMASK(9, 7)); |
5623 | le2 = LE2_DEFAULT; | 5644 | /* |
5624 | ibsd_wr_allchans(ppd, 13, (le2 << 7), BMASK(9, 7)); | 5645 | * We always change parameteters, since we can choose |
5625 | init_txdds_table(ppd, 0); | 5646 | * values for cables without eeproms, and the cable may have |
5647 | * changed from a cable with full or partial eeprom content | ||
5648 | * to one with partial or no content. | ||
5649 | */ | ||
5650 | init_txdds_table(ppd, 0); | ||
5651 | /* The physical link is being re-enabled only when the | ||
5652 | previous state was DISABLED. This should only happen when | ||
5653 | the cable has been physically pulled. */ | ||
5654 | if (ppd->lflags & QIBL_IB_LINK_DISABLED) | ||
5655 | qib_set_ib_7322_lstate(ppd, 0, | ||
5656 | QLOGIC_IB_IBCC_LINKINITCMD_SLEEP); | ||
5657 | } | ||
5626 | } | 5658 | } |
5627 | 5659 | ||
5628 | /* | 5660 | /* |
@@ -5726,7 +5758,8 @@ static void set_no_qsfp_atten(struct qib_devdata *dd, int change) | |||
5726 | /* now change the IBC and serdes, overriding generic */ | 5758 | /* now change the IBC and serdes, overriding generic */ |
5727 | init_txdds_table(ppd, 1); | 5759 | init_txdds_table(ppd, 1); |
5728 | /* Re-enable the physical state machine on mezz boards | 5760 | /* Re-enable the physical state machine on mezz boards |
5729 | * now that the correct settings have been set. */ | 5761 | * now that the correct settings have been set. |
5762 | * QSFP boards are handles by the QSFP event handler */ | ||
5730 | if (IS_QMH(dd) || IS_QME(dd)) | 5763 | if (IS_QMH(dd) || IS_QME(dd)) |
5731 | qib_set_ib_7322_lstate(ppd, 0, | 5764 | qib_set_ib_7322_lstate(ppd, 0, |
5732 | QLOGIC_IB_IBCC_LINKINITCMD_SLEEP); | 5765 | QLOGIC_IB_IBCC_LINKINITCMD_SLEEP); |
@@ -7148,7 +7181,8 @@ static void find_best_ent(struct qib_pportdata *ppd, | |||
7148 | } | 7181 | } |
7149 | } | 7182 | } |
7150 | 7183 | ||
7151 | /* Lookup serdes setting by cable type and attenuation */ | 7184 | /* Active cables don't have attenuation so we only set SERDES |
7185 | * settings to account for the attenuation of the board traces. */ | ||
7152 | if (!override && QSFP_IS_ACTIVE(qd->tech)) { | 7186 | if (!override && QSFP_IS_ACTIVE(qd->tech)) { |
7153 | *sdr_dds = txdds_sdr + ppd->dd->board_atten; | 7187 | *sdr_dds = txdds_sdr + ppd->dd->board_atten; |
7154 | *ddr_dds = txdds_ddr + ppd->dd->board_atten; | 7188 | *ddr_dds = txdds_ddr + ppd->dd->board_atten; |
@@ -7465,12 +7499,6 @@ static int serdes_7322_init_new(struct qib_pportdata *ppd) | |||
7465 | u32 le_val, rxcaldone; | 7499 | u32 le_val, rxcaldone; |
7466 | int chan, chan_done = (1 << SERDES_CHANS) - 1; | 7500 | int chan, chan_done = (1 << SERDES_CHANS) - 1; |
7467 | 7501 | ||
7468 | /* | ||
7469 | * Initialize the Tx DDS tables. Also done every QSFP event, | ||
7470 | * for adapters with QSFP | ||
7471 | */ | ||
7472 | init_txdds_table(ppd, 0); | ||
7473 | |||
7474 | /* Clear cmode-override, may be set from older driver */ | 7502 | /* Clear cmode-override, may be set from older driver */ |
7475 | ahb_mod(ppd->dd, IBSD(ppd->hw_pidx), 5, 10, 0 << 14, 1 << 14); | 7503 | ahb_mod(ppd->dd, IBSD(ppd->hw_pidx), 5, 10, 0 << 14, 1 << 14); |
7476 | 7504 | ||
@@ -7656,6 +7684,12 @@ static int serdes_7322_init_new(struct qib_pportdata *ppd) | |||
7656 | /* VGA output common mode */ | 7684 | /* VGA output common mode */ |
7657 | ibsd_wr_allchans(ppd, 12, (3 << 2), BMASK(3, 2)); | 7685 | ibsd_wr_allchans(ppd, 12, (3 << 2), BMASK(3, 2)); |
7658 | 7686 | ||
7687 | /* | ||
7688 | * Initialize the Tx DDS tables. Also done every QSFP event, | ||
7689 | * for adapters with QSFP | ||
7690 | */ | ||
7691 | init_txdds_table(ppd, 0); | ||
7692 | |||
7659 | return 0; | 7693 | return 0; |
7660 | } | 7694 | } |
7661 | 7695 | ||
diff --git a/drivers/infiniband/hw/qib/qib_init.c b/drivers/infiniband/hw/qib/qib_init.c index 21ffa7c0915f..b093a0b53b2f 100644 --- a/drivers/infiniband/hw/qib/qib_init.c +++ b/drivers/infiniband/hw/qib/qib_init.c | |||
@@ -585,10 +585,6 @@ int qib_init(struct qib_devdata *dd, int reinit) | |||
585 | continue; | 585 | continue; |
586 | } | 586 | } |
587 | 587 | ||
588 | /* let link come up, and enable IBC */ | ||
589 | spin_lock_irqsave(&ppd->lflags_lock, flags); | ||
590 | ppd->lflags &= ~QIBL_IB_LINK_DISABLED; | ||
591 | spin_unlock_irqrestore(&ppd->lflags_lock, flags); | ||
592 | portok++; | 588 | portok++; |
593 | } | 589 | } |
594 | 590 | ||
diff --git a/drivers/infiniband/hw/qib/qib_qsfp.c b/drivers/infiniband/hw/qib/qib_qsfp.c index 3374a52232c1..e06c4ed383f1 100644 --- a/drivers/infiniband/hw/qib/qib_qsfp.c +++ b/drivers/infiniband/hw/qib/qib_qsfp.c | |||
@@ -273,18 +273,12 @@ int qib_refresh_qsfp_cache(struct qib_pportdata *ppd, struct qib_qsfp_cache *cp) | |||
273 | int ret; | 273 | int ret; |
274 | int idx; | 274 | int idx; |
275 | u16 cks; | 275 | u16 cks; |
276 | u32 mask; | ||
277 | u8 peek[4]; | 276 | u8 peek[4]; |
278 | 277 | ||
279 | /* ensure sane contents on invalid reads, for cable swaps */ | 278 | /* ensure sane contents on invalid reads, for cable swaps */ |
280 | memset(cp, 0, sizeof(*cp)); | 279 | memset(cp, 0, sizeof(*cp)); |
281 | 280 | ||
282 | mask = QSFP_GPIO_MOD_PRS_N; | 281 | if (!qib_qsfp_mod_present(ppd)) { |
283 | if (ppd->hw_pidx) | ||
284 | mask <<= QSFP_GPIO_PORT2_SHIFT; | ||
285 | |||
286 | ret = ppd->dd->f_gpio_mod(ppd->dd, 0, 0, 0); | ||
287 | if (ret & mask) { | ||
288 | ret = -ENODEV; | 282 | ret = -ENODEV; |
289 | goto bail; | 283 | goto bail; |
290 | } | 284 | } |
@@ -444,6 +438,19 @@ const char * const qib_qsfp_devtech[16] = { | |||
444 | 438 | ||
445 | static const char *pwr_codes = "1.5W2.0W2.5W3.5W"; | 439 | static const char *pwr_codes = "1.5W2.0W2.5W3.5W"; |
446 | 440 | ||
441 | int qib_qsfp_mod_present(struct qib_pportdata *ppd) | ||
442 | { | ||
443 | u32 mask; | ||
444 | int ret; | ||
445 | |||
446 | mask = QSFP_GPIO_MOD_PRS_N << | ||
447 | (ppd->hw_pidx * QSFP_GPIO_PORT2_SHIFT); | ||
448 | ret = ppd->dd->f_gpio_mod(ppd->dd, 0, 0, 0); | ||
449 | |||
450 | return !((ret & mask) >> | ||
451 | ((ppd->hw_pidx * QSFP_GPIO_PORT2_SHIFT) + 3)); | ||
452 | } | ||
453 | |||
447 | /* | 454 | /* |
448 | * Initialize structures that control access to QSFP. Called once per port | 455 | * Initialize structures that control access to QSFP. Called once per port |
449 | * on cards that support QSFP. | 456 | * on cards that support QSFP. |
@@ -452,7 +459,6 @@ void qib_qsfp_init(struct qib_qsfp_data *qd, | |||
452 | void (*fevent)(struct work_struct *)) | 459 | void (*fevent)(struct work_struct *)) |
453 | { | 460 | { |
454 | u32 mask, highs; | 461 | u32 mask, highs; |
455 | int pins; | ||
456 | 462 | ||
457 | struct qib_devdata *dd = qd->ppd->dd; | 463 | struct qib_devdata *dd = qd->ppd->dd; |
458 | 464 | ||
@@ -480,8 +486,7 @@ void qib_qsfp_init(struct qib_qsfp_data *qd, | |||
480 | mask <<= QSFP_GPIO_PORT2_SHIFT; | 486 | mask <<= QSFP_GPIO_PORT2_SHIFT; |
481 | 487 | ||
482 | /* Do not try to wait here. Better to let event handle it */ | 488 | /* Do not try to wait here. Better to let event handle it */ |
483 | pins = dd->f_gpio_mod(dd, 0, 0, 0); | 489 | if (!qib_qsfp_mod_present(qd->ppd)) |
484 | if (pins & mask) | ||
485 | goto bail; | 490 | goto bail; |
486 | /* We see a module, but it may be unwise to look yet. Just schedule */ | 491 | /* We see a module, but it may be unwise to look yet. Just schedule */ |
487 | qd->t_insert = get_jiffies_64(); | 492 | qd->t_insert = get_jiffies_64(); |
diff --git a/drivers/infiniband/hw/qib/qib_qsfp.h b/drivers/infiniband/hw/qib/qib_qsfp.h index c109bbdc90ac..786a92a25c25 100644 --- a/drivers/infiniband/hw/qib/qib_qsfp.h +++ b/drivers/infiniband/hw/qib/qib_qsfp.h | |||
@@ -34,6 +34,7 @@ | |||
34 | 34 | ||
35 | #define QSFP_DEV 0xA0 | 35 | #define QSFP_DEV 0xA0 |
36 | #define QSFP_PWR_LAG_MSEC 2000 | 36 | #define QSFP_PWR_LAG_MSEC 2000 |
37 | #define QSFP_MODPRS_LAG_MSEC 20 | ||
37 | 38 | ||
38 | /* | 39 | /* |
39 | * Below are masks for various QSFP signals, for Port 1. | 40 | * Below are masks for various QSFP signals, for Port 1. |
@@ -181,6 +182,7 @@ struct qib_qsfp_data { | |||
181 | 182 | ||
182 | extern int qib_refresh_qsfp_cache(struct qib_pportdata *ppd, | 183 | extern int qib_refresh_qsfp_cache(struct qib_pportdata *ppd, |
183 | struct qib_qsfp_cache *cp); | 184 | struct qib_qsfp_cache *cp); |
185 | extern int qib_qsfp_mod_present(struct qib_pportdata *ppd); | ||
184 | extern void qib_qsfp_init(struct qib_qsfp_data *qd, | 186 | extern void qib_qsfp_init(struct qib_qsfp_data *qd, |
185 | void (*fevent)(struct work_struct *)); | 187 | void (*fevent)(struct work_struct *)); |
186 | extern void qib_qsfp_deinit(struct qib_qsfp_data *qd); | 188 | extern void qib_qsfp_deinit(struct qib_qsfp_data *qd); |