Lines Matching refs:ppd

52 static void sendctrl_7220_mod(struct qib_pportdata *ppd, u32 op);
751 static void qib_disarm_7220_senderrbufs(struct qib_pportdata *ppd) in qib_disarm_7220_senderrbufs() argument
754 struct qib_devdata *dd = ppd->dd; in qib_disarm_7220_senderrbufs()
779 static void qib_7220_sdma_sendctrl(struct qib_pportdata *ppd, unsigned op) in qib_7220_sdma_sendctrl() argument
781 struct qib_devdata *dd = ppd->dd; in qib_7220_sdma_sendctrl()
811 static void qib_decode_7220_sdma_errs(struct qib_pportdata *ppd, in qib_decode_7220_sdma_errs() argument
857 static void qib_7220_sdma_hw_clean_up(struct qib_pportdata *ppd) in qib_7220_sdma_hw_clean_up() argument
860 sendctrl_7220_mod(ppd, QIB_SENDCTRL_DISARM_ALL | QIB_SENDCTRL_FLUSH | in qib_7220_sdma_hw_clean_up()
862 ppd->dd->upd_pio_shadow = 1; /* update our idea of what's busy */ in qib_7220_sdma_hw_clean_up()
865 static void qib_sdma_7220_setlengen(struct qib_pportdata *ppd) in qib_sdma_7220_setlengen() argument
872 qib_write_kreg(ppd->dd, kr_senddmalengen, ppd->sdma_descq_cnt); in qib_sdma_7220_setlengen()
873 qib_write_kreg(ppd->dd, kr_senddmalengen, in qib_sdma_7220_setlengen()
874 ppd->sdma_descq_cnt | in qib_sdma_7220_setlengen()
878 static void qib_7220_sdma_hw_start_up(struct qib_pportdata *ppd) in qib_7220_sdma_hw_start_up() argument
880 qib_sdma_7220_setlengen(ppd); in qib_7220_sdma_hw_start_up()
881 qib_sdma_update_7220_tail(ppd, 0); /* Set SendDmaTail */ in qib_7220_sdma_hw_start_up()
882 ppd->sdma_head_dma[0] = 0; in qib_7220_sdma_hw_start_up()
897 static void sdma_7220_errors(struct qib_pportdata *ppd, u64 errs) in sdma_7220_errors() argument
900 struct qib_devdata *dd = ppd->dd; in sdma_7220_errors()
906 qib_decode_7220_sdma_errs(ppd, errs, msg, in sdma_7220_errors()
908 spin_lock_irqsave(&ppd->sdma_lock, flags); in sdma_7220_errors()
917 qib_dev_err(ppd->dd, in sdma_7220_errors()
919 ppd->dd->unit, ppd->port, sbuf[2], sbuf[1], in sdma_7220_errors()
924 qib_dev_err(dd, "IB%u:%u SDmaUnexpData\n", ppd->dd->unit, in sdma_7220_errors()
925 ppd->port); in sdma_7220_errors()
927 switch (ppd->sdma_state.current_state) { in sdma_7220_errors()
946 __qib_sdma_process_event(ppd, in sdma_7220_errors()
956 __qib_sdma_process_event(ppd, in sdma_7220_errors()
961 spin_unlock_irqrestore(&ppd->sdma_lock, flags); in sdma_7220_errors()
1049 struct qib_pportdata *ppd = &cpspec->pportdata; in reenable_7220_chase() local
1051 ppd->cpspec->chase_timer.expires = 0; in reenable_7220_chase()
1052 qib_set_ib_7220_lstate(ppd, QLOGIC_IB_IBCC_LINKCMD_DOWN, in reenable_7220_chase()
1056 static void handle_7220_chase(struct qib_pportdata *ppd, u64 ibcst) in handle_7220_chase() argument
1075 if (ppd->cpspec->chase_end && in handle_7220_chase()
1076 time_after(tnow, ppd->cpspec->chase_end)) { in handle_7220_chase()
1077 ppd->cpspec->chase_end = 0; in handle_7220_chase()
1078 qib_set_ib_7220_lstate(ppd, in handle_7220_chase()
1081 ppd->cpspec->chase_timer.expires = jiffies + in handle_7220_chase()
1083 add_timer(&ppd->cpspec->chase_timer); in handle_7220_chase()
1084 } else if (!ppd->cpspec->chase_end) in handle_7220_chase()
1085 ppd->cpspec->chase_end = tnow + QIB_CHASE_TIME; in handle_7220_chase()
1089 ppd->cpspec->chase_end = 0; in handle_7220_chase()
1099 struct qib_pportdata *ppd = dd->pport; in handle_7220_errors() local
1111 sdma_7220_errors(ppd, errs); in handle_7220_errors()
1119 qib_disarm_7220_senderrbufs(ppd); in handle_7220_errors()
1121 !(ppd->lflags & QIBL_LINKACTIVE)) { in handle_7220_errors()
1132 !(ppd->lflags & QIBL_LINKACTIVE)) { in handle_7220_errors()
1171 if (!(ppd->lflags & QIBL_IB_AUTONEG_INPROG)) in handle_7220_errors()
1172 handle_7220_chase(ppd, ibcs); in handle_7220_errors()
1175 ppd->link_width_active = in handle_7220_errors()
1178 ppd->link_speed_active = in handle_7220_errors()
1191 qib_handle_e_ibstatuschanged(ppd, ibcs); in handle_7220_errors()
1204 qib_dev_porterr(dd, ppd->port, "%s error\n", msg); in handle_7220_errors()
1206 if (ppd->state_wanted & ppd->lflags) in handle_7220_errors()
1207 wake_up_interruptible(&ppd->state_wait); in handle_7220_errors()
1485 static void qib_set_ib_7220_lstate(struct qib_pportdata *ppd, u16 linkcmd, in qib_set_ib_7220_lstate() argument
1489 struct qib_devdata *dd = ppd->dd; in qib_set_ib_7220_lstate()
1497 spin_lock_irqsave(&ppd->lflags_lock, flags); in qib_set_ib_7220_lstate()
1498 ppd->lflags |= QIBL_IB_LINK_DISABLED; in qib_set_ib_7220_lstate()
1499 spin_unlock_irqrestore(&ppd->lflags_lock, flags); in qib_set_ib_7220_lstate()
1506 spin_lock_irqsave(&ppd->lflags_lock, flags); in qib_set_ib_7220_lstate()
1507 ppd->lflags &= ~QIBL_IB_LINK_DISABLED; in qib_set_ib_7220_lstate()
1508 spin_unlock_irqrestore(&ppd->lflags_lock, flags); in qib_set_ib_7220_lstate()
1514 qib_write_kreg(dd, kr_ibcctrl, ppd->cpspec->ibcctrl | mod_wd); in qib_set_ib_7220_lstate()
1530 static int qib_7220_bringup_serdes(struct qib_pportdata *ppd) in qib_7220_bringup_serdes() argument
1532 struct qib_devdata *dd = ppd->dd; in qib_7220_bringup_serdes()
1541 ppd->cpspec->ibdeltainprog = 1; in qib_7220_bringup_serdes()
1542 ppd->cpspec->ibsymsnap = read_7220_creg32(dd, cr_ibsymbolerr); in qib_7220_bringup_serdes()
1543 ppd->cpspec->iblnkerrsnap = in qib_7220_bringup_serdes()
1565 ibc |= ((u64)(ppd->ibmaxlen >> 2) + 1) << SYM_LSB(IBCCtrl, MaxPktLen); in qib_7220_bringup_serdes()
1566 ppd->cpspec->ibcctrl = ibc; /* without linkcmd or linkinitcmd! */ in qib_7220_bringup_serdes()
1569 val = ppd->cpspec->ibcctrl | (QLOGIC_IB_IBCC_LINKINITCMD_DISABLE << in qib_7220_bringup_serdes()
1573 if (!ppd->cpspec->ibcddrctrl) { in qib_7220_bringup_serdes()
1575 ppd->cpspec->ibcddrctrl = qib_read_kreg64(dd, kr_ibcddrctrl); in qib_7220_bringup_serdes()
1577 if (ppd->link_speed_enabled == (QIB_IB_SDR | QIB_IB_DDR)) in qib_7220_bringup_serdes()
1578 ppd->cpspec->ibcddrctrl |= in qib_7220_bringup_serdes()
1582 ppd->cpspec->ibcddrctrl |= in qib_7220_bringup_serdes()
1583 ppd->link_speed_enabled == QIB_IB_DDR ? in qib_7220_bringup_serdes()
1585 if ((ppd->link_width_enabled & (IB_WIDTH_1X | IB_WIDTH_4X)) == in qib_7220_bringup_serdes()
1587 ppd->cpspec->ibcddrctrl |= IBA7220_IBC_WIDTH_AUTONEG; in qib_7220_bringup_serdes()
1589 ppd->cpspec->ibcddrctrl |= in qib_7220_bringup_serdes()
1590 ppd->link_width_enabled == IB_WIDTH_4X ? in qib_7220_bringup_serdes()
1595 ppd->cpspec->ibcddrctrl |= in qib_7220_bringup_serdes()
1597 ppd->cpspec->ibcddrctrl |= in qib_7220_bringup_serdes()
1601 ppd->cpspec->ibcddrctrl |= IBA7220_IBC_LANE_REV_SUPPORTED; in qib_7220_bringup_serdes()
1606 qib_write_kreg(dd, kr_ibcddrctrl, ppd->cpspec->ibcddrctrl); in qib_7220_bringup_serdes()
1627 if (!ppd->guid) in qib_7220_bringup_serdes()
1628 ppd->guid = dd->base_guid; in qib_7220_bringup_serdes()
1629 guid = be64_to_cpu(ppd->guid); in qib_7220_bringup_serdes()
1646 static void qib_7220_quiet_serdes(struct qib_pportdata *ppd) in qib_7220_quiet_serdes() argument
1649 struct qib_devdata *dd = ppd->dd; in qib_7220_quiet_serdes()
1657 ppd->cpspec->chase_end = 0; in qib_7220_quiet_serdes()
1658 if (ppd->cpspec->chase_timer.function) /* if initted */ in qib_7220_quiet_serdes()
1659 del_timer_sync(&ppd->cpspec->chase_timer); in qib_7220_quiet_serdes()
1661 if (ppd->cpspec->ibsymdelta || ppd->cpspec->iblnkerrdelta || in qib_7220_quiet_serdes()
1662 ppd->cpspec->ibdeltainprog) { in qib_7220_quiet_serdes()
1670 if (ppd->cpspec->ibsymdelta || ppd->cpspec->ibdeltainprog) { in qib_7220_quiet_serdes()
1672 if (ppd->cpspec->ibdeltainprog) in qib_7220_quiet_serdes()
1673 val -= val - ppd->cpspec->ibsymsnap; in qib_7220_quiet_serdes()
1674 val -= ppd->cpspec->ibsymdelta; in qib_7220_quiet_serdes()
1677 if (ppd->cpspec->iblnkerrdelta || ppd->cpspec->ibdeltainprog) { in qib_7220_quiet_serdes()
1679 if (ppd->cpspec->ibdeltainprog) in qib_7220_quiet_serdes()
1680 val -= val - ppd->cpspec->iblnkerrsnap; in qib_7220_quiet_serdes()
1681 val -= ppd->cpspec->iblnkerrdelta; in qib_7220_quiet_serdes()
1688 qib_set_ib_7220_lstate(ppd, 0, QLOGIC_IB_IBCC_LINKINITCMD_DISABLE); in qib_7220_quiet_serdes()
1690 spin_lock_irqsave(&ppd->lflags_lock, flags); in qib_7220_quiet_serdes()
1691 ppd->lflags &= ~QIBL_IB_AUTONEG_INPROG; in qib_7220_quiet_serdes()
1692 spin_unlock_irqrestore(&ppd->lflags_lock, flags); in qib_7220_quiet_serdes()
1693 wake_up(&ppd->cpspec->autoneg_wait); in qib_7220_quiet_serdes()
1694 cancel_delayed_work_sync(&ppd->cpspec->autoneg_work); in qib_7220_quiet_serdes()
1696 shutdown_7220_relock_poll(ppd->dd); in qib_7220_quiet_serdes()
1697 val = qib_read_kreg64(ppd->dd, kr_xgxs_cfg); in qib_7220_quiet_serdes()
1699 qib_write_kreg(ppd->dd, kr_xgxs_cfg, val); in qib_7220_quiet_serdes()
1725 static void qib_setup_7220_setextled(struct qib_pportdata *ppd, u32 on) in qib_setup_7220_setextled() argument
1727 struct qib_devdata *dd = ppd->dd; in qib_setup_7220_setextled()
1738 if (ppd->led_override) { in qib_setup_7220_setextled()
1739 ltst = (ppd->led_override & QIB_LED_PHYS) ? in qib_setup_7220_setextled()
1741 lst = (ppd->led_override & QIB_LED_LOG) ? in qib_setup_7220_setextled()
1793 static void sdma_7220_intr(struct qib_pportdata *ppd, u64 istat) in sdma_7220_intr() argument
1797 spin_lock_irqsave(&ppd->sdma_lock, flags); in sdma_7220_intr()
1799 switch (ppd->sdma_state.current_state) { in sdma_7220_intr()
1804 __qib_sdma_process_event(ppd, qib_sdma_event_e20_hw_started); in sdma_7220_intr()
1817 __qib_sdma_process_event(ppd, qib_sdma_event_e60_hw_halted); in sdma_7220_intr()
1822 __qib_sdma_intr(ppd); in sdma_7220_intr()
1825 spin_unlock_irqrestore(&ppd->sdma_lock, flags); in sdma_7220_intr()
2318 static int qib_7220_get_ib_cfg(struct qib_pportdata *ppd, int which) in qib_7220_get_ib_cfg() argument
2325 ret = ppd->link_width_enabled; in qib_7220_get_ib_cfg()
2329 ret = ppd->link_width_active; in qib_7220_get_ib_cfg()
2333 ret = ppd->link_speed_enabled; in qib_7220_get_ib_cfg()
2337 ret = ppd->link_speed_active; in qib_7220_get_ib_cfg()
2351 ret = qib_read_kreg64(ppd->dd, kr_ibcddrstatus) in qib_7220_get_ib_cfg()
2356 ret = ppd->vls_operational; in qib_7220_get_ib_cfg()
2368 ret = SYM_FIELD(ppd->cpspec->ibcctrl, IBCCtrl, in qib_7220_get_ib_cfg()
2373 ret = SYM_FIELD(ppd->cpspec->ibcctrl, IBCCtrl, in qib_7220_get_ib_cfg()
2379 ret = (ppd->cpspec->ibcctrl & in qib_7220_get_ib_cfg()
2394 ret = (ppd->link_speed_active == QIB_IB_DDR); in qib_7220_get_ib_cfg()
2401 ret = (int)((ppd->cpspec->ibcddrctrl >> lsb) & maskr); in qib_7220_get_ib_cfg()
2406 static int qib_7220_set_ib_cfg(struct qib_pportdata *ppd, int which, u32 val) in qib_7220_set_ib_cfg() argument
2408 struct qib_devdata *dd = ppd->dd; in qib_7220_set_ib_cfg()
2431 ppd->link_width_enabled = val; in qib_7220_set_ib_cfg()
2432 if (!(ppd->lflags & QIBL_LINKDOWN)) in qib_7220_set_ib_cfg()
2459 ppd->link_speed_enabled = val; in qib_7220_set_ib_cfg()
2460 if ((ppd->cpspec->ibcddrctrl & IBA7220_IBC_IBTA_1_2_MASK) && in qib_7220_set_ib_cfg()
2463 if (!(ppd->lflags & QIBL_LINKDOWN)) in qib_7220_set_ib_cfg()
2477 spin_lock_irqsave(&ppd->lflags_lock, flags); in qib_7220_set_ib_cfg()
2478 ppd->lflags &= ~QIBL_IB_AUTONEG_FAILED; in qib_7220_set_ib_cfg()
2479 spin_unlock_irqrestore(&ppd->lflags_lock, flags); in qib_7220_set_ib_cfg()
2501 maskr = SYM_FIELD(ppd->cpspec->ibcctrl, IBCCtrl, in qib_7220_set_ib_cfg()
2504 ppd->cpspec->ibcctrl &= in qib_7220_set_ib_cfg()
2506 ppd->cpspec->ibcctrl |= (u64) val << in qib_7220_set_ib_cfg()
2508 qib_write_kreg(dd, kr_ibcctrl, ppd->cpspec->ibcctrl); in qib_7220_set_ib_cfg()
2514 maskr = SYM_FIELD(ppd->cpspec->ibcctrl, IBCCtrl, in qib_7220_set_ib_cfg()
2517 ppd->cpspec->ibcctrl &= in qib_7220_set_ib_cfg()
2519 ppd->cpspec->ibcctrl |= (u64) val << in qib_7220_set_ib_cfg()
2521 qib_write_kreg(dd, kr_ibcctrl, ppd->cpspec->ibcctrl); in qib_7220_set_ib_cfg()
2527 maskr = (u64) ppd->pkeys[0] | ((u64) ppd->pkeys[1] << 16) | in qib_7220_set_ib_cfg()
2528 ((u64) ppd->pkeys[2] << 32) | in qib_7220_set_ib_cfg()
2529 ((u64) ppd->pkeys[3] << 48); in qib_7220_set_ib_cfg()
2536 ppd->cpspec->ibcctrl &= in qib_7220_set_ib_cfg()
2539 ppd->cpspec->ibcctrl |= in qib_7220_set_ib_cfg()
2541 qib_write_kreg(dd, kr_ibcctrl, ppd->cpspec->ibcctrl); in qib_7220_set_ib_cfg()
2553 val = (ppd->ibmaxlen >> 2) + 1; in qib_7220_set_ib_cfg()
2554 ppd->cpspec->ibcctrl &= ~SYM_MASK(IBCCtrl, MaxPktLen); in qib_7220_set_ib_cfg()
2555 ppd->cpspec->ibcctrl |= (u64)val << SYM_LSB(IBCCtrl, MaxPktLen); in qib_7220_set_ib_cfg()
2556 qib_write_kreg(dd, kr_ibcctrl, ppd->cpspec->ibcctrl); in qib_7220_set_ib_cfg()
2564 if (!ppd->cpspec->ibdeltainprog && in qib_7220_set_ib_cfg()
2566 ppd->cpspec->ibdeltainprog = 1; in qib_7220_set_ib_cfg()
2567 ppd->cpspec->ibsymsnap = in qib_7220_set_ib_cfg()
2569 ppd->cpspec->iblnkerrsnap = in qib_7220_set_ib_cfg()
2602 ppd->cpspec->chase_end = 0; in qib_7220_set_ib_cfg()
2607 if (ppd->cpspec->chase_timer.expires) { in qib_7220_set_ib_cfg()
2608 del_timer_sync(&ppd->cpspec->chase_timer); in qib_7220_set_ib_cfg()
2609 ppd->cpspec->chase_timer.expires = 0; in qib_7220_set_ib_cfg()
2619 qib_set_ib_7220_lstate(ppd, lcmd, licmd); in qib_7220_set_ib_cfg()
2623 tmp = (ppd->cpspec->ibcddrctrl >> lsb) & maskr; in qib_7220_set_ib_cfg()
2630 if (ppd->link_width_enabled-1 != tmp) { in qib_7220_set_ib_cfg()
2631 ppd->cpspec->ibcddrctrl &= ~(maskr << lsb); in qib_7220_set_ib_cfg()
2632 ppd->cpspec->ibcddrctrl |= in qib_7220_set_ib_cfg()
2633 (((u64)(ppd->link_width_enabled-1) & maskr) << in qib_7220_set_ib_cfg()
2636 ppd->cpspec->ibcddrctrl); in qib_7220_set_ib_cfg()
2638 spin_lock_irqsave(&ppd->lflags_lock, flags); in qib_7220_set_ib_cfg()
2639 ppd->lflags |= QIBL_IB_FORCE_NOTIFY; in qib_7220_set_ib_cfg()
2640 spin_unlock_irqrestore(&ppd->lflags_lock, flags); in qib_7220_set_ib_cfg()
2657 ppd->cpspec->ibcddrctrl &= ~(maskr << lsb); in qib_7220_set_ib_cfg()
2658 ppd->cpspec->ibcddrctrl |= (((u64) val & maskr) << lsb); in qib_7220_set_ib_cfg()
2659 qib_write_kreg(dd, kr_ibcddrctrl, ppd->cpspec->ibcddrctrl); in qib_7220_set_ib_cfg()
2662 spin_lock_irqsave(&ppd->lflags_lock, flags); in qib_7220_set_ib_cfg()
2663 ppd->lflags |= QIBL_IB_FORCE_NOTIFY; in qib_7220_set_ib_cfg()
2664 spin_unlock_irqrestore(&ppd->lflags_lock, flags); in qib_7220_set_ib_cfg()
2670 static int qib_7220_set_loopback(struct qib_pportdata *ppd, const char *what) in qib_7220_set_loopback() argument
2676 ppd->cpspec->ibcctrl |= SYM_MASK(IBCCtrl, Loopback); in qib_7220_set_loopback()
2678 qib_devinfo(ppd->dd->pcidev, "Enabling IB%u:%u IBC loopback\n", in qib_7220_set_loopback()
2679 ppd->dd->unit, ppd->port); in qib_7220_set_loopback()
2681 ppd->cpspec->ibcctrl &= ~SYM_MASK(IBCCtrl, Loopback); in qib_7220_set_loopback()
2684 qib_devinfo(ppd->dd->pcidev, in qib_7220_set_loopback()
2686 ppd->dd->unit, ppd->port); in qib_7220_set_loopback()
2690 qib_write_kreg(ppd->dd, kr_ibcctrl, ppd->cpspec->ibcctrl); in qib_7220_set_loopback()
2691 ddr = ppd->cpspec->ibcddrctrl & ~(IBA7220_IBC_HRTBT_MASK in qib_7220_set_loopback()
2693 ppd->cpspec->ibcddrctrl = ddr | val; in qib_7220_set_loopback()
2694 qib_write_kreg(ppd->dd, kr_ibcddrctrl, in qib_7220_set_loopback()
2695 ppd->cpspec->ibcddrctrl); in qib_7220_set_loopback()
2696 qib_write_kreg(ppd->dd, kr_scratch, 0); in qib_7220_set_loopback()
2728 static void rcvctrl_7220_mod(struct qib_pportdata *ppd, unsigned int op, in rcvctrl_7220_mod() argument
2731 struct qib_devdata *dd = ppd->dd; in rcvctrl_7220_mod()
2815 static void sendctrl_7220_mod(struct qib_pportdata *ppd, u32 op) in sendctrl_7220_mod() argument
2817 struct qib_devdata *dd = ppd->dd; in sendctrl_7220_mod()
2902 static u64 qib_portcntr_7220(struct qib_pportdata *ppd, u32 reg) in qib_portcntr_7220() argument
2905 struct qib_devdata *dd = ppd->dd; in qib_portcntr_7220()
2946 qib_devinfo(ppd->dd->pcidev, in qib_portcntr_7220()
2973 ret -= ret - ppd->cpspec->ibsymsnap; in qib_portcntr_7220()
2977 ret -= ret - ppd->cpspec->iblnkerrsnap; in qib_portcntr_7220()
3209 struct qib_pportdata *ppd = &dd->pport[port]; in qib_read_7220portcntrs() local
3221 *cntr++ = qib_portcntr_7220(ppd, in qib_read_7220portcntrs()
3244 struct qib_pportdata *ppd = dd->pport; in qib_get_7220_faststats() local
3261 traffic_wds = qib_portcntr_7220(ppd, cr_wordsend) + in qib_get_7220_faststats()
3262 qib_portcntr_7220(ppd, cr_wordrcv); in qib_get_7220_faststats()
3296 static void qib_7220_xgxs_reset(struct qib_pportdata *ppd) in qib_7220_xgxs_reset() argument
3299 struct qib_devdata *dd = ppd->dd; in qib_7220_xgxs_reset()
3327 static u32 __iomem *get_7220_link_buf(struct qib_pportdata *ppd, u32 *bnum) in get_7220_link_buf() argument
3330 u32 lbuf = ppd->dd->cspec->lastbuf_for_pio; in get_7220_link_buf()
3338 sendctrl_7220_mod(ppd->dd->pport, QIB_SENDCTRL_AVAIL_BLIP); in get_7220_link_buf()
3339 qib_read_kreg64(ppd->dd, kr_scratch); /* extra chip flush */ in get_7220_link_buf()
3340 buf = qib_getsendbuf_range(ppd->dd, bnum, lbuf, lbuf); in get_7220_link_buf()
3344 spin_lock_irqsave(&ppd->sdma_lock, flags); in get_7220_link_buf()
3345 if (ppd->sdma_state.current_state == qib_sdma_state_s20_idle && in get_7220_link_buf()
3346 ppd->sdma_state.current_state != qib_sdma_state_s00_hw_down) { in get_7220_link_buf()
3347 __qib_sdma_process_event(ppd, qib_sdma_event_e00_go_hw_down); in get_7220_link_buf()
3351 qib_7220_sdma_hw_clean_up(ppd); in get_7220_link_buf()
3353 spin_unlock_irqrestore(&ppd->sdma_lock, flags); in get_7220_link_buf()
3356 qib_read_kreg64(ppd->dd, kr_scratch); /* extra chip flush */ in get_7220_link_buf()
3357 buf = qib_getsendbuf_range(ppd->dd, bnum, lbuf, lbuf); in get_7220_link_buf()
3371 static void autoneg_7220_sendpkt(struct qib_pportdata *ppd, u32 *hdr, in autoneg_7220_sendpkt() argument
3378 struct qib_devdata *dd = ppd->dd; in autoneg_7220_sendpkt()
3383 while (!(piobuf = get_7220_link_buf(ppd, &pnum))) { in autoneg_7220_sendpkt()
3406 static void autoneg_7220_send(struct qib_pportdata *ppd, int which) in autoneg_7220_send() argument
3408 struct qib_devdata *dd = ppd->dd; in autoneg_7220_send()
3442 autoneg_7220_sendpkt(ppd, hdr, dcnt, data); in autoneg_7220_send()
3445 autoneg_7220_sendpkt(ppd, hdr, dcnt, data); in autoneg_7220_send()
3464 static void set_7220_ibspeed_fast(struct qib_pportdata *ppd, u32 speed) in set_7220_ibspeed_fast() argument
3466 ppd->cpspec->ibcddrctrl &= ~(IBA7220_IBC_SPEED_AUTONEG_MASK | in set_7220_ibspeed_fast()
3470 ppd->cpspec->ibcddrctrl |= IBA7220_IBC_SPEED_AUTONEG_MASK | in set_7220_ibspeed_fast()
3473 ppd->cpspec->ibcddrctrl |= speed == QIB_IB_DDR ? in set_7220_ibspeed_fast()
3476 qib_write_kreg(ppd->dd, kr_ibcddrctrl, ppd->cpspec->ibcddrctrl); in set_7220_ibspeed_fast()
3477 qib_write_kreg(ppd->dd, kr_scratch, 0); in set_7220_ibspeed_fast()
3486 static void try_7220_autoneg(struct qib_pportdata *ppd) in try_7220_autoneg() argument
3495 qib_write_kreg(ppd->dd, kr_ncmodectrl, 0x3b9dc07); in try_7220_autoneg()
3497 spin_lock_irqsave(&ppd->lflags_lock, flags); in try_7220_autoneg()
3498 ppd->lflags |= QIBL_IB_AUTONEG_INPROG; in try_7220_autoneg()
3499 spin_unlock_irqrestore(&ppd->lflags_lock, flags); in try_7220_autoneg()
3500 autoneg_7220_send(ppd, 0); in try_7220_autoneg()
3501 set_7220_ibspeed_fast(ppd, QIB_IB_DDR); in try_7220_autoneg()
3503 toggle_7220_rclkrls(ppd->dd); in try_7220_autoneg()
3505 queue_delayed_work(ib_wq, &ppd->cpspec->autoneg_work, in try_7220_autoneg()
3515 struct qib_pportdata *ppd; in autoneg_7220_work() local
3520 ppd = &container_of(work, struct qib_chippport_specific, in autoneg_7220_work()
3522 dd = ppd->dd; in autoneg_7220_work()
3529 if (SYM_FIELD(ppd->lastibcstat, IBCStatus, LinkTrainingState) in autoneg_7220_work()
3531 qib_set_linkstate(ppd, QIB_IB_LINKDOWN_DISABLE); in autoneg_7220_work()
3537 if (!(ppd->lflags & QIBL_IB_AUTONEG_INPROG)) in autoneg_7220_work()
3541 if (wait_event_timeout(ppd->cpspec->autoneg_wait, in autoneg_7220_work()
3542 !(ppd->lflags & QIBL_IB_AUTONEG_INPROG), in autoneg_7220_work()
3549 if (wait_event_timeout(ppd->cpspec->autoneg_wait, in autoneg_7220_work()
3550 !(ppd->lflags & QIBL_IB_AUTONEG_INPROG), in autoneg_7220_work()
3554 set_7220_ibspeed_fast(ppd, QIB_IB_SDR); in autoneg_7220_work()
3561 wait_event_timeout(ppd->cpspec->autoneg_wait, in autoneg_7220_work()
3562 !(ppd->lflags & QIBL_IB_AUTONEG_INPROG), in autoneg_7220_work()
3565 if (ppd->lflags & QIBL_IB_AUTONEG_INPROG) { in autoneg_7220_work()
3566 spin_lock_irqsave(&ppd->lflags_lock, flags); in autoneg_7220_work()
3567 ppd->lflags &= ~QIBL_IB_AUTONEG_INPROG; in autoneg_7220_work()
3569 ppd->lflags |= QIBL_IB_AUTONEG_FAILED; in autoneg_7220_work()
3572 spin_unlock_irqrestore(&ppd->lflags_lock, flags); in autoneg_7220_work()
3573 set_7220_ibspeed_fast(ppd, ppd->link_speed_enabled); in autoneg_7220_work()
3608 static int qib_7220_ib_updown(struct qib_pportdata *ppd, int ibup, u64 ibcs) in qib_7220_ib_updown() argument
3611 struct qib_devdata *dd = ppd->dd; in qib_7220_ib_updown()
3614 spin_lock_irqsave(&ppd->lflags_lock, flags); in qib_7220_ib_updown()
3615 ppd->lflags &= ~QIBL_IB_FORCE_NOTIFY; in qib_7220_ib_updown()
3616 spin_unlock_irqrestore(&ppd->lflags_lock, flags); in qib_7220_ib_updown()
3624 if (!(ppd->lflags & (QIBL_IB_AUTONEG_FAILED | in qib_7220_ib_updown()
3626 set_7220_ibspeed_fast(ppd, ppd->link_speed_enabled); in qib_7220_ib_updown()
3627 if (!(ppd->lflags & QIBL_IB_AUTONEG_INPROG)) { in qib_7220_ib_updown()
3629 qib_cancel_sends(ppd); /* initial disarm, etc. */ in qib_7220_ib_updown()
3630 spin_lock_irqsave(&ppd->sdma_lock, flags); in qib_7220_ib_updown()
3631 if (__qib_sdma_running(ppd)) in qib_7220_ib_updown()
3632 __qib_sdma_process_event(ppd, in qib_7220_ib_updown()
3634 spin_unlock_irqrestore(&ppd->sdma_lock, flags); in qib_7220_ib_updown()
3640 !(ppd->lflags & (QIBL_IB_AUTONEG_FAILED | in qib_7220_ib_updown()
3642 ppd->link_speed_active == QIB_IB_SDR && in qib_7220_ib_updown()
3643 (ppd->link_speed_enabled & (QIB_IB_DDR | QIB_IB_SDR)) == in qib_7220_ib_updown()
3648 if (!ppd->cpspec->ibdeltainprog) { in qib_7220_ib_updown()
3649 ppd->cpspec->ibdeltainprog = 1; in qib_7220_ib_updown()
3650 ppd->cpspec->ibsymsnap = read_7220_creg32(dd, in qib_7220_ib_updown()
3652 ppd->cpspec->iblnkerrsnap = read_7220_creg32(dd, in qib_7220_ib_updown()
3655 try_7220_autoneg(ppd); in qib_7220_ib_updown()
3657 } else if ((ppd->lflags & QIBL_IB_AUTONEG_INPROG) && in qib_7220_ib_updown()
3658 ppd->link_speed_active == QIB_IB_SDR) { in qib_7220_ib_updown()
3659 autoneg_7220_send(ppd, 1); in qib_7220_ib_updown()
3660 set_7220_ibspeed_fast(ppd, QIB_IB_DDR); in qib_7220_ib_updown()
3665 if ((ppd->lflags & QIBL_IB_AUTONEG_INPROG) && in qib_7220_ib_updown()
3666 (ppd->link_speed_active & QIB_IB_DDR)) { in qib_7220_ib_updown()
3667 spin_lock_irqsave(&ppd->lflags_lock, flags); in qib_7220_ib_updown()
3668 ppd->lflags &= ~(QIBL_IB_AUTONEG_INPROG | in qib_7220_ib_updown()
3670 spin_unlock_irqrestore(&ppd->lflags_lock, in qib_7220_ib_updown()
3674 set_7220_ibspeed_fast(ppd, in qib_7220_ib_updown()
3675 ppd->link_speed_enabled); in qib_7220_ib_updown()
3676 wake_up(&ppd->cpspec->autoneg_wait); in qib_7220_ib_updown()
3678 } else if (ppd->lflags & QIBL_IB_AUTONEG_FAILED) { in qib_7220_ib_updown()
3685 spin_lock_irqsave(&ppd->lflags_lock, flags); in qib_7220_ib_updown()
3686 ppd->lflags &= ~QIBL_IB_AUTONEG_FAILED; in qib_7220_ib_updown()
3687 spin_unlock_irqrestore(&ppd->lflags_lock, in qib_7220_ib_updown()
3689 ppd->cpspec->ibcddrctrl |= in qib_7220_ib_updown()
3696 if (!(ppd->lflags & QIBL_IB_AUTONEG_INPROG)) in qib_7220_ib_updown()
3700 ppd->delay_mult = rate_to_delay in qib_7220_ib_updown()
3705 spin_lock_irqsave(&ppd->sdma_lock, flags); in qib_7220_ib_updown()
3711 if (ppd->sdma_state.current_state != in qib_7220_ib_updown()
3713 __qib_sdma_process_event(ppd, in qib_7220_ib_updown()
3715 spin_unlock_irqrestore(&ppd->sdma_lock, flags); in qib_7220_ib_updown()
3720 if (ppd->cpspec->ibdeltainprog) { in qib_7220_ib_updown()
3721 ppd->cpspec->ibdeltainprog = 0; in qib_7220_ib_updown()
3722 ppd->cpspec->ibsymdelta += read_7220_creg32(ppd->dd, in qib_7220_ib_updown()
3723 cr_ibsymbolerr) - ppd->cpspec->ibsymsnap; in qib_7220_ib_updown()
3724 ppd->cpspec->iblnkerrdelta += read_7220_creg32(ppd->dd, in qib_7220_ib_updown()
3725 cr_iblinkerrrecov) - ppd->cpspec->iblnkerrsnap; in qib_7220_ib_updown()
3728 !ppd->cpspec->ibdeltainprog && in qib_7220_ib_updown()
3729 !(ppd->lflags & QIBL_IB_AUTONEG_INPROG)) { in qib_7220_ib_updown()
3730 ppd->cpspec->ibdeltainprog = 1; in qib_7220_ib_updown()
3731 ppd->cpspec->ibsymsnap = read_7220_creg32(ppd->dd, in qib_7220_ib_updown()
3733 ppd->cpspec->iblnkerrsnap = read_7220_creg32(ppd->dd, in qib_7220_ib_updown()
3738 qib_setup_7220_setextled(ppd, ibup); in qib_7220_ib_updown()
3958 struct qib_pportdata *ppd; in qib_init_7220_variables() local
3963 ppd = &cpspec->pportdata; in qib_init_7220_variables()
3964 dd->pport = ppd; in qib_init_7220_variables()
3969 ppd->cpspec = cpspec; in qib_init_7220_variables()
4010 ret = qib_init_pportdata(ppd, dd, 0, 1); in qib_init_7220_variables()
4013 ppd->link_width_supported = IB_WIDTH_1X | IB_WIDTH_4X; in qib_init_7220_variables()
4014 ppd->link_speed_supported = QIB_IB_SDR | QIB_IB_DDR; in qib_init_7220_variables()
4016 ppd->link_width_enabled = ppd->link_width_supported; in qib_init_7220_variables()
4017 ppd->link_speed_enabled = ppd->link_speed_supported; in qib_init_7220_variables()
4022 ppd->link_width_active = IB_WIDTH_4X; in qib_init_7220_variables()
4023 ppd->link_speed_active = QIB_IB_SDR; in qib_init_7220_variables()
4024 ppd->delay_mult = rate_to_delay[0][1]; in qib_init_7220_variables()
4025 ppd->vls_supported = IB_VL_VL0; in qib_init_7220_variables()
4026 ppd->vls_operational = ppd->vls_supported; in qib_init_7220_variables()
4031 timer_setup(&ppd->cpspec->chase_timer, reenable_7220_chase, 0); in qib_init_7220_variables()
4133 static u32 __iomem *qib_7220_getsendbuf(struct qib_pportdata *ppd, u64 pbc, in qib_7220_getsendbuf() argument
4137 struct qib_devdata *dd = ppd->dd; in qib_7220_getsendbuf()
4141 !(ppd->lflags & (QIBL_IB_AUTONEG_INPROG | QIBL_LINKACTIVE))) in qib_7220_getsendbuf()
4142 buf = get_7220_link_buf(ppd, pbufnum); in qib_7220_getsendbuf()
4156 static void qib_set_cntr_7220_sample(struct qib_pportdata *ppd, u32 intv, in qib_set_cntr_7220_sample() argument
4159 write_7220_creg(ppd->dd, cr_psinterval, intv); in qib_set_cntr_7220_sample()
4160 write_7220_creg(ppd->dd, cr_psstart, start); in qib_set_cntr_7220_sample()
4170 static void qib_sdma_update_7220_tail(struct qib_pportdata *ppd, u16 tail) in qib_sdma_update_7220_tail() argument
4174 ppd->sdma_descq_tail = tail; in qib_sdma_update_7220_tail()
4175 qib_write_kreg(ppd->dd, kr_senddmatail, tail); in qib_sdma_update_7220_tail()
4178 static void qib_sdma_set_7220_desc_cnt(struct qib_pportdata *ppd, unsigned cnt) in qib_sdma_set_7220_desc_cnt() argument
4222 static void qib_7220_sdma_init_early(struct qib_pportdata *ppd) in qib_7220_sdma_init_early() argument
4224 ppd->sdma_state.set_state_action = sdma_7220_action_table; in qib_7220_sdma_init_early()
4227 static int init_sdma_7220_regs(struct qib_pportdata *ppd) in init_sdma_7220_regs() argument
4229 struct qib_devdata *dd = ppd->dd; in init_sdma_7220_regs()
4234 qib_write_kreg(dd, kr_senddmabase, ppd->sdma_descq_phys); in init_sdma_7220_regs()
4235 qib_sdma_7220_setlengen(ppd); in init_sdma_7220_regs()
4236 qib_sdma_update_7220_tail(ppd, 0); /* Set SendDmaTail */ in init_sdma_7220_regs()
4238 qib_write_kreg(dd, kr_senddmaheadaddr, ppd->sdma_head_phys); in init_sdma_7220_regs()
4257 ppd->sdma_state.first_sendbuf = i; in init_sdma_7220_regs()
4258 ppd->sdma_state.last_sendbuf = n; in init_sdma_7220_regs()
4264 static u16 qib_sdma_7220_gethead(struct qib_pportdata *ppd) in qib_sdma_7220_gethead() argument
4266 struct qib_devdata *dd = ppd->dd; in qib_sdma_7220_gethead()
4274 use_dmahead = __qib_sdma_running(ppd) && in qib_sdma_7220_gethead()
4278 (u16)le64_to_cpu(*ppd->sdma_head_dma) : in qib_sdma_7220_gethead()
4281 swhead = ppd->sdma_descq_head; in qib_sdma_7220_gethead()
4282 swtail = ppd->sdma_descq_tail; in qib_sdma_7220_gethead()
4283 cnt = ppd->sdma_descq_cnt; in qib_sdma_7220_gethead()
4310 static int qib_sdma_7220_busy(struct qib_pportdata *ppd) in qib_sdma_7220_busy() argument
4312 u64 hwstatus = qib_read_kreg64(ppd->dd, kr_senddmastatus); in qib_sdma_7220_busy()
4328 static u32 qib_7220_setpbc_control(struct qib_pportdata *ppd, u32 plen, in qib_7220_setpbc_control() argument
4331 u8 snd_mult = ppd->delay_mult; in qib_7220_setpbc_control()
4333 u32 ret = ppd->cpspec->last_delay_mult; in qib_7220_setpbc_control()
4335 ppd->cpspec->last_delay_mult = (rcv_mult > snd_mult) ? in qib_7220_setpbc_control()