Lines Matching refs:ppd

51 static void sendctrl_7220_mod(struct qib_pportdata *ppd, u32 op);
750 static void qib_disarm_7220_senderrbufs(struct qib_pportdata *ppd) in qib_disarm_7220_senderrbufs() argument
753 struct qib_devdata *dd = ppd->dd; in qib_disarm_7220_senderrbufs()
778 static void qib_7220_sdma_sendctrl(struct qib_pportdata *ppd, unsigned op) in qib_7220_sdma_sendctrl() argument
780 struct qib_devdata *dd = ppd->dd; in qib_7220_sdma_sendctrl()
810 static void qib_decode_7220_sdma_errs(struct qib_pportdata *ppd, in qib_decode_7220_sdma_errs() argument
856 static void qib_7220_sdma_hw_clean_up(struct qib_pportdata *ppd) in qib_7220_sdma_hw_clean_up() argument
859 sendctrl_7220_mod(ppd, QIB_SENDCTRL_DISARM_ALL | QIB_SENDCTRL_FLUSH | in qib_7220_sdma_hw_clean_up()
861 ppd->dd->upd_pio_shadow = 1; /* update our idea of what's busy */ in qib_7220_sdma_hw_clean_up()
864 static void qib_sdma_7220_setlengen(struct qib_pportdata *ppd) in qib_sdma_7220_setlengen() argument
871 qib_write_kreg(ppd->dd, kr_senddmalengen, ppd->sdma_descq_cnt); in qib_sdma_7220_setlengen()
872 qib_write_kreg(ppd->dd, kr_senddmalengen, in qib_sdma_7220_setlengen()
873 ppd->sdma_descq_cnt | in qib_sdma_7220_setlengen()
877 static void qib_7220_sdma_hw_start_up(struct qib_pportdata *ppd) in qib_7220_sdma_hw_start_up() argument
879 qib_sdma_7220_setlengen(ppd); in qib_7220_sdma_hw_start_up()
880 qib_sdma_update_7220_tail(ppd, 0); /* Set SendDmaTail */ in qib_7220_sdma_hw_start_up()
881 ppd->sdma_head_dma[0] = 0; in qib_7220_sdma_hw_start_up()
896 static void sdma_7220_errors(struct qib_pportdata *ppd, u64 errs) in sdma_7220_errors() argument
899 struct qib_devdata *dd = ppd->dd; in sdma_7220_errors()
905 qib_decode_7220_sdma_errs(ppd, errs, msg, in sdma_7220_errors()
907 spin_lock_irqsave(&ppd->sdma_lock, flags); in sdma_7220_errors()
916 qib_dev_err(ppd->dd, in sdma_7220_errors()
918 ppd->dd->unit, ppd->port, sbuf[2], sbuf[1], in sdma_7220_errors()
923 qib_dev_err(dd, "IB%u:%u SDmaUnexpData\n", ppd->dd->unit, in sdma_7220_errors()
924 ppd->port); in sdma_7220_errors()
926 switch (ppd->sdma_state.current_state) { in sdma_7220_errors()
945 __qib_sdma_process_event(ppd, in sdma_7220_errors()
955 __qib_sdma_process_event(ppd, in sdma_7220_errors()
960 spin_unlock_irqrestore(&ppd->sdma_lock, flags); in sdma_7220_errors()
1046 struct qib_pportdata *ppd = (struct qib_pportdata *)opaque; in reenable_7220_chase() local
1048 ppd->cpspec->chase_timer.expires = 0; in reenable_7220_chase()
1049 qib_set_ib_7220_lstate(ppd, QLOGIC_IB_IBCC_LINKCMD_DOWN, in reenable_7220_chase()
1053 static void handle_7220_chase(struct qib_pportdata *ppd, u64 ibcst) in handle_7220_chase() argument
1072 if (ppd->cpspec->chase_end && in handle_7220_chase()
1073 time_after(tnow, ppd->cpspec->chase_end)) { in handle_7220_chase()
1074 ppd->cpspec->chase_end = 0; in handle_7220_chase()
1075 qib_set_ib_7220_lstate(ppd, in handle_7220_chase()
1078 ppd->cpspec->chase_timer.expires = jiffies + in handle_7220_chase()
1080 add_timer(&ppd->cpspec->chase_timer); in handle_7220_chase()
1081 } else if (!ppd->cpspec->chase_end) in handle_7220_chase()
1082 ppd->cpspec->chase_end = tnow + QIB_CHASE_TIME; in handle_7220_chase()
1086 ppd->cpspec->chase_end = 0; in handle_7220_chase()
1097 struct qib_pportdata *ppd = dd->pport; in handle_7220_errors() local
1113 sdma_7220_errors(ppd, errs); in handle_7220_errors()
1121 qib_disarm_7220_senderrbufs(ppd); in handle_7220_errors()
1123 !(ppd->lflags & QIBL_LINKACTIVE)) { in handle_7220_errors()
1134 !(ppd->lflags & QIBL_LINKACTIVE)) { in handle_7220_errors()
1173 if (!(ppd->lflags & QIBL_IB_AUTONEG_INPROG)) in handle_7220_errors()
1174 handle_7220_chase(ppd, ibcs); in handle_7220_errors()
1177 ppd->link_width_active = in handle_7220_errors()
1180 ppd->link_speed_active = in handle_7220_errors()
1193 qib_handle_e_ibstatuschanged(ppd, ibcs); in handle_7220_errors()
1206 qib_dev_porterr(dd, ppd->port, "%s error\n", msg); in handle_7220_errors()
1208 if (ppd->state_wanted & ppd->lflags) in handle_7220_errors()
1209 wake_up_interruptible(&ppd->state_wait); in handle_7220_errors()
1492 static void qib_set_ib_7220_lstate(struct qib_pportdata *ppd, u16 linkcmd, in qib_set_ib_7220_lstate() argument
1496 struct qib_devdata *dd = ppd->dd; in qib_set_ib_7220_lstate()
1504 spin_lock_irqsave(&ppd->lflags_lock, flags); in qib_set_ib_7220_lstate()
1505 ppd->lflags |= QIBL_IB_LINK_DISABLED; in qib_set_ib_7220_lstate()
1506 spin_unlock_irqrestore(&ppd->lflags_lock, flags); in qib_set_ib_7220_lstate()
1513 spin_lock_irqsave(&ppd->lflags_lock, flags); in qib_set_ib_7220_lstate()
1514 ppd->lflags &= ~QIBL_IB_LINK_DISABLED; in qib_set_ib_7220_lstate()
1515 spin_unlock_irqrestore(&ppd->lflags_lock, flags); in qib_set_ib_7220_lstate()
1521 qib_write_kreg(dd, kr_ibcctrl, ppd->cpspec->ibcctrl | mod_wd); in qib_set_ib_7220_lstate()
1537 static int qib_7220_bringup_serdes(struct qib_pportdata *ppd) in qib_7220_bringup_serdes() argument
1539 struct qib_devdata *dd = ppd->dd; in qib_7220_bringup_serdes()
1548 ppd->cpspec->ibdeltainprog = 1; in qib_7220_bringup_serdes()
1549 ppd->cpspec->ibsymsnap = read_7220_creg32(dd, cr_ibsymbolerr); in qib_7220_bringup_serdes()
1550 ppd->cpspec->iblnkerrsnap = in qib_7220_bringup_serdes()
1572 ibc |= ((u64)(ppd->ibmaxlen >> 2) + 1) << SYM_LSB(IBCCtrl, MaxPktLen); in qib_7220_bringup_serdes()
1573 ppd->cpspec->ibcctrl = ibc; /* without linkcmd or linkinitcmd! */ in qib_7220_bringup_serdes()
1576 val = ppd->cpspec->ibcctrl | (QLOGIC_IB_IBCC_LINKINITCMD_DISABLE << in qib_7220_bringup_serdes()
1580 if (!ppd->cpspec->ibcddrctrl) { in qib_7220_bringup_serdes()
1582 ppd->cpspec->ibcddrctrl = qib_read_kreg64(dd, kr_ibcddrctrl); in qib_7220_bringup_serdes()
1584 if (ppd->link_speed_enabled == (QIB_IB_SDR | QIB_IB_DDR)) in qib_7220_bringup_serdes()
1585 ppd->cpspec->ibcddrctrl |= in qib_7220_bringup_serdes()
1589 ppd->cpspec->ibcddrctrl |= in qib_7220_bringup_serdes()
1590 ppd->link_speed_enabled == QIB_IB_DDR ? in qib_7220_bringup_serdes()
1592 if ((ppd->link_width_enabled & (IB_WIDTH_1X | IB_WIDTH_4X)) == in qib_7220_bringup_serdes()
1594 ppd->cpspec->ibcddrctrl |= IBA7220_IBC_WIDTH_AUTONEG; in qib_7220_bringup_serdes()
1596 ppd->cpspec->ibcddrctrl |= in qib_7220_bringup_serdes()
1597 ppd->link_width_enabled == IB_WIDTH_4X ? in qib_7220_bringup_serdes()
1602 ppd->cpspec->ibcddrctrl |= in qib_7220_bringup_serdes()
1604 ppd->cpspec->ibcddrctrl |= in qib_7220_bringup_serdes()
1608 ppd->cpspec->ibcddrctrl |= IBA7220_IBC_LANE_REV_SUPPORTED; in qib_7220_bringup_serdes()
1613 qib_write_kreg(dd, kr_ibcddrctrl, ppd->cpspec->ibcddrctrl); in qib_7220_bringup_serdes()
1634 if (!ppd->guid) in qib_7220_bringup_serdes()
1635 ppd->guid = dd->base_guid; in qib_7220_bringup_serdes()
1636 guid = be64_to_cpu(ppd->guid); in qib_7220_bringup_serdes()
1653 static void qib_7220_quiet_serdes(struct qib_pportdata *ppd) in qib_7220_quiet_serdes() argument
1656 struct qib_devdata *dd = ppd->dd; in qib_7220_quiet_serdes()
1664 ppd->cpspec->chase_end = 0; in qib_7220_quiet_serdes()
1665 if (ppd->cpspec->chase_timer.data) /* if initted */ in qib_7220_quiet_serdes()
1666 del_timer_sync(&ppd->cpspec->chase_timer); in qib_7220_quiet_serdes()
1668 if (ppd->cpspec->ibsymdelta || ppd->cpspec->iblnkerrdelta || in qib_7220_quiet_serdes()
1669 ppd->cpspec->ibdeltainprog) { in qib_7220_quiet_serdes()
1677 if (ppd->cpspec->ibsymdelta || ppd->cpspec->ibdeltainprog) { in qib_7220_quiet_serdes()
1679 if (ppd->cpspec->ibdeltainprog) in qib_7220_quiet_serdes()
1680 val -= val - ppd->cpspec->ibsymsnap; in qib_7220_quiet_serdes()
1681 val -= ppd->cpspec->ibsymdelta; in qib_7220_quiet_serdes()
1684 if (ppd->cpspec->iblnkerrdelta || ppd->cpspec->ibdeltainprog) { in qib_7220_quiet_serdes()
1686 if (ppd->cpspec->ibdeltainprog) in qib_7220_quiet_serdes()
1687 val -= val - ppd->cpspec->iblnkerrsnap; in qib_7220_quiet_serdes()
1688 val -= ppd->cpspec->iblnkerrdelta; in qib_7220_quiet_serdes()
1695 qib_set_ib_7220_lstate(ppd, 0, QLOGIC_IB_IBCC_LINKINITCMD_DISABLE); in qib_7220_quiet_serdes()
1697 spin_lock_irqsave(&ppd->lflags_lock, flags); in qib_7220_quiet_serdes()
1698 ppd->lflags &= ~QIBL_IB_AUTONEG_INPROG; in qib_7220_quiet_serdes()
1699 spin_unlock_irqrestore(&ppd->lflags_lock, flags); in qib_7220_quiet_serdes()
1700 wake_up(&ppd->cpspec->autoneg_wait); in qib_7220_quiet_serdes()
1701 cancel_delayed_work_sync(&ppd->cpspec->autoneg_work); in qib_7220_quiet_serdes()
1703 shutdown_7220_relock_poll(ppd->dd); in qib_7220_quiet_serdes()
1704 val = qib_read_kreg64(ppd->dd, kr_xgxs_cfg); in qib_7220_quiet_serdes()
1706 qib_write_kreg(ppd->dd, kr_xgxs_cfg, val); in qib_7220_quiet_serdes()
1732 static void qib_setup_7220_setextled(struct qib_pportdata *ppd, u32 on) in qib_setup_7220_setextled() argument
1734 struct qib_devdata *dd = ppd->dd; in qib_setup_7220_setextled()
1745 if (ppd->led_override) { in qib_setup_7220_setextled()
1746 ltst = (ppd->led_override & QIB_LED_PHYS) ? in qib_setup_7220_setextled()
1748 lst = (ppd->led_override & QIB_LED_LOG) ? in qib_setup_7220_setextled()
1809 static void sdma_7220_intr(struct qib_pportdata *ppd, u64 istat) in sdma_7220_intr() argument
1813 spin_lock_irqsave(&ppd->sdma_lock, flags); in sdma_7220_intr()
1815 switch (ppd->sdma_state.current_state) { in sdma_7220_intr()
1820 __qib_sdma_process_event(ppd, qib_sdma_event_e20_hw_started); in sdma_7220_intr()
1833 __qib_sdma_process_event(ppd, qib_sdma_event_e60_hw_halted); in sdma_7220_intr()
1838 __qib_sdma_intr(ppd); in sdma_7220_intr()
1841 spin_unlock_irqrestore(&ppd->sdma_lock, flags); in sdma_7220_intr()
2349 static int qib_7220_get_ib_cfg(struct qib_pportdata *ppd, int which) in qib_7220_get_ib_cfg() argument
2356 ret = ppd->link_width_enabled; in qib_7220_get_ib_cfg()
2360 ret = ppd->link_width_active; in qib_7220_get_ib_cfg()
2364 ret = ppd->link_speed_enabled; in qib_7220_get_ib_cfg()
2368 ret = ppd->link_speed_active; in qib_7220_get_ib_cfg()
2382 ret = qib_read_kreg64(ppd->dd, kr_ibcddrstatus) in qib_7220_get_ib_cfg()
2387 ret = ppd->vls_operational; in qib_7220_get_ib_cfg()
2399 ret = SYM_FIELD(ppd->cpspec->ibcctrl, IBCCtrl, in qib_7220_get_ib_cfg()
2404 ret = SYM_FIELD(ppd->cpspec->ibcctrl, IBCCtrl, in qib_7220_get_ib_cfg()
2410 ret = (ppd->cpspec->ibcctrl & in qib_7220_get_ib_cfg()
2425 ret = (ppd->link_speed_active == QIB_IB_DDR); in qib_7220_get_ib_cfg()
2432 ret = (int)((ppd->cpspec->ibcddrctrl >> lsb) & maskr); in qib_7220_get_ib_cfg()
2437 static int qib_7220_set_ib_cfg(struct qib_pportdata *ppd, int which, u32 val) in qib_7220_set_ib_cfg() argument
2439 struct qib_devdata *dd = ppd->dd; in qib_7220_set_ib_cfg()
2462 ppd->link_width_enabled = val; in qib_7220_set_ib_cfg()
2463 if (!(ppd->lflags & QIBL_LINKDOWN)) in qib_7220_set_ib_cfg()
2490 ppd->link_speed_enabled = val; in qib_7220_set_ib_cfg()
2491 if ((ppd->cpspec->ibcddrctrl & IBA7220_IBC_IBTA_1_2_MASK) && in qib_7220_set_ib_cfg()
2494 if (!(ppd->lflags & QIBL_LINKDOWN)) in qib_7220_set_ib_cfg()
2508 spin_lock_irqsave(&ppd->lflags_lock, flags); in qib_7220_set_ib_cfg()
2509 ppd->lflags &= ~QIBL_IB_AUTONEG_FAILED; in qib_7220_set_ib_cfg()
2510 spin_unlock_irqrestore(&ppd->lflags_lock, flags); in qib_7220_set_ib_cfg()
2532 maskr = SYM_FIELD(ppd->cpspec->ibcctrl, IBCCtrl, in qib_7220_set_ib_cfg()
2535 ppd->cpspec->ibcctrl &= in qib_7220_set_ib_cfg()
2537 ppd->cpspec->ibcctrl |= (u64) val << in qib_7220_set_ib_cfg()
2539 qib_write_kreg(dd, kr_ibcctrl, ppd->cpspec->ibcctrl); in qib_7220_set_ib_cfg()
2545 maskr = SYM_FIELD(ppd->cpspec->ibcctrl, IBCCtrl, in qib_7220_set_ib_cfg()
2548 ppd->cpspec->ibcctrl &= in qib_7220_set_ib_cfg()
2550 ppd->cpspec->ibcctrl |= (u64) val << in qib_7220_set_ib_cfg()
2552 qib_write_kreg(dd, kr_ibcctrl, ppd->cpspec->ibcctrl); in qib_7220_set_ib_cfg()
2558 maskr = (u64) ppd->pkeys[0] | ((u64) ppd->pkeys[1] << 16) | in qib_7220_set_ib_cfg()
2559 ((u64) ppd->pkeys[2] << 32) | in qib_7220_set_ib_cfg()
2560 ((u64) ppd->pkeys[3] << 48); in qib_7220_set_ib_cfg()
2567 ppd->cpspec->ibcctrl &= in qib_7220_set_ib_cfg()
2570 ppd->cpspec->ibcctrl |= in qib_7220_set_ib_cfg()
2572 qib_write_kreg(dd, kr_ibcctrl, ppd->cpspec->ibcctrl); in qib_7220_set_ib_cfg()
2584 val = (ppd->ibmaxlen >> 2) + 1; in qib_7220_set_ib_cfg()
2585 ppd->cpspec->ibcctrl &= ~SYM_MASK(IBCCtrl, MaxPktLen); in qib_7220_set_ib_cfg()
2586 ppd->cpspec->ibcctrl |= (u64)val << SYM_LSB(IBCCtrl, MaxPktLen); in qib_7220_set_ib_cfg()
2587 qib_write_kreg(dd, kr_ibcctrl, ppd->cpspec->ibcctrl); in qib_7220_set_ib_cfg()
2595 if (!ppd->cpspec->ibdeltainprog && in qib_7220_set_ib_cfg()
2597 ppd->cpspec->ibdeltainprog = 1; in qib_7220_set_ib_cfg()
2598 ppd->cpspec->ibsymsnap = in qib_7220_set_ib_cfg()
2600 ppd->cpspec->iblnkerrsnap = in qib_7220_set_ib_cfg()
2633 ppd->cpspec->chase_end = 0; in qib_7220_set_ib_cfg()
2638 if (ppd->cpspec->chase_timer.expires) { in qib_7220_set_ib_cfg()
2639 del_timer_sync(&ppd->cpspec->chase_timer); in qib_7220_set_ib_cfg()
2640 ppd->cpspec->chase_timer.expires = 0; in qib_7220_set_ib_cfg()
2650 qib_set_ib_7220_lstate(ppd, lcmd, licmd); in qib_7220_set_ib_cfg()
2654 tmp = (ppd->cpspec->ibcddrctrl >> lsb) & maskr; in qib_7220_set_ib_cfg()
2661 if (ppd->link_width_enabled-1 != tmp) { in qib_7220_set_ib_cfg()
2662 ppd->cpspec->ibcddrctrl &= ~(maskr << lsb); in qib_7220_set_ib_cfg()
2663 ppd->cpspec->ibcddrctrl |= in qib_7220_set_ib_cfg()
2664 (((u64)(ppd->link_width_enabled-1) & maskr) << in qib_7220_set_ib_cfg()
2667 ppd->cpspec->ibcddrctrl); in qib_7220_set_ib_cfg()
2669 spin_lock_irqsave(&ppd->lflags_lock, flags); in qib_7220_set_ib_cfg()
2670 ppd->lflags |= QIBL_IB_FORCE_NOTIFY; in qib_7220_set_ib_cfg()
2671 spin_unlock_irqrestore(&ppd->lflags_lock, flags); in qib_7220_set_ib_cfg()
2688 ppd->cpspec->ibcddrctrl &= ~(maskr << lsb); in qib_7220_set_ib_cfg()
2689 ppd->cpspec->ibcddrctrl |= (((u64) val & maskr) << lsb); in qib_7220_set_ib_cfg()
2690 qib_write_kreg(dd, kr_ibcddrctrl, ppd->cpspec->ibcddrctrl); in qib_7220_set_ib_cfg()
2693 spin_lock_irqsave(&ppd->lflags_lock, flags); in qib_7220_set_ib_cfg()
2694 ppd->lflags |= QIBL_IB_FORCE_NOTIFY; in qib_7220_set_ib_cfg()
2695 spin_unlock_irqrestore(&ppd->lflags_lock, flags); in qib_7220_set_ib_cfg()
2701 static int qib_7220_set_loopback(struct qib_pportdata *ppd, const char *what) in qib_7220_set_loopback() argument
2707 ppd->cpspec->ibcctrl |= SYM_MASK(IBCCtrl, Loopback); in qib_7220_set_loopback()
2709 qib_devinfo(ppd->dd->pcidev, "Enabling IB%u:%u IBC loopback\n", in qib_7220_set_loopback()
2710 ppd->dd->unit, ppd->port); in qib_7220_set_loopback()
2712 ppd->cpspec->ibcctrl &= ~SYM_MASK(IBCCtrl, Loopback); in qib_7220_set_loopback()
2715 qib_devinfo(ppd->dd->pcidev, in qib_7220_set_loopback()
2717 ppd->dd->unit, ppd->port); in qib_7220_set_loopback()
2721 qib_write_kreg(ppd->dd, kr_ibcctrl, ppd->cpspec->ibcctrl); in qib_7220_set_loopback()
2722 ddr = ppd->cpspec->ibcddrctrl & ~(IBA7220_IBC_HRTBT_MASK in qib_7220_set_loopback()
2724 ppd->cpspec->ibcddrctrl = ddr | val; in qib_7220_set_loopback()
2725 qib_write_kreg(ppd->dd, kr_ibcddrctrl, in qib_7220_set_loopback()
2726 ppd->cpspec->ibcddrctrl); in qib_7220_set_loopback()
2727 qib_write_kreg(ppd->dd, kr_scratch, 0); in qib_7220_set_loopback()
2761 static void rcvctrl_7220_mod(struct qib_pportdata *ppd, unsigned int op, in rcvctrl_7220_mod() argument
2764 struct qib_devdata *dd = ppd->dd; in rcvctrl_7220_mod()
2848 static void sendctrl_7220_mod(struct qib_pportdata *ppd, u32 op) in sendctrl_7220_mod() argument
2850 struct qib_devdata *dd = ppd->dd; in sendctrl_7220_mod()
2935 static u64 qib_portcntr_7220(struct qib_pportdata *ppd, u32 reg) in qib_portcntr_7220() argument
2938 struct qib_devdata *dd = ppd->dd; in qib_portcntr_7220()
2979 qib_devinfo(ppd->dd->pcidev, in qib_portcntr_7220()
3006 ret -= ret - ppd->cpspec->ibsymsnap; in qib_portcntr_7220()
3010 ret -= ret - ppd->cpspec->iblnkerrsnap; in qib_portcntr_7220()
3245 struct qib_pportdata *ppd = &dd->pport[port]; in qib_read_7220portcntrs() local
3257 *cntr++ = qib_portcntr_7220(ppd, in qib_read_7220portcntrs()
3280 struct qib_pportdata *ppd = dd->pport; in qib_get_7220_faststats() local
3297 traffic_wds = qib_portcntr_7220(ppd, cr_wordsend) + in qib_get_7220_faststats()
3298 qib_portcntr_7220(ppd, cr_wordrcv); in qib_get_7220_faststats()
3336 static void qib_7220_xgxs_reset(struct qib_pportdata *ppd) in qib_7220_xgxs_reset() argument
3339 struct qib_devdata *dd = ppd->dd; in qib_7220_xgxs_reset()
3367 static u32 __iomem *get_7220_link_buf(struct qib_pportdata *ppd, u32 *bnum) in get_7220_link_buf() argument
3370 u32 lbuf = ppd->dd->cspec->lastbuf_for_pio; in get_7220_link_buf()
3378 sendctrl_7220_mod(ppd->dd->pport, QIB_SENDCTRL_AVAIL_BLIP); in get_7220_link_buf()
3379 qib_read_kreg64(ppd->dd, kr_scratch); /* extra chip flush */ in get_7220_link_buf()
3380 buf = qib_getsendbuf_range(ppd->dd, bnum, lbuf, lbuf); in get_7220_link_buf()
3384 spin_lock_irqsave(&ppd->sdma_lock, flags); in get_7220_link_buf()
3385 if (ppd->sdma_state.current_state == qib_sdma_state_s20_idle && in get_7220_link_buf()
3386 ppd->sdma_state.current_state != qib_sdma_state_s00_hw_down) { in get_7220_link_buf()
3387 __qib_sdma_process_event(ppd, qib_sdma_event_e00_go_hw_down); in get_7220_link_buf()
3391 qib_7220_sdma_hw_clean_up(ppd); in get_7220_link_buf()
3393 spin_unlock_irqrestore(&ppd->sdma_lock, flags); in get_7220_link_buf()
3396 qib_read_kreg64(ppd->dd, kr_scratch); /* extra chip flush */ in get_7220_link_buf()
3397 buf = qib_getsendbuf_range(ppd->dd, bnum, lbuf, lbuf); in get_7220_link_buf()
3411 static void autoneg_7220_sendpkt(struct qib_pportdata *ppd, u32 *hdr, in autoneg_7220_sendpkt() argument
3418 struct qib_devdata *dd = ppd->dd; in autoneg_7220_sendpkt()
3423 while (!(piobuf = get_7220_link_buf(ppd, &pnum))) { in autoneg_7220_sendpkt()
3446 static void autoneg_7220_send(struct qib_pportdata *ppd, int which) in autoneg_7220_send() argument
3448 struct qib_devdata *dd = ppd->dd; in autoneg_7220_send()
3482 autoneg_7220_sendpkt(ppd, hdr, dcnt, data); in autoneg_7220_send()
3485 autoneg_7220_sendpkt(ppd, hdr, dcnt, data); in autoneg_7220_send()
3504 static void set_7220_ibspeed_fast(struct qib_pportdata *ppd, u32 speed) in set_7220_ibspeed_fast() argument
3506 ppd->cpspec->ibcddrctrl &= ~(IBA7220_IBC_SPEED_AUTONEG_MASK | in set_7220_ibspeed_fast()
3510 ppd->cpspec->ibcddrctrl |= IBA7220_IBC_SPEED_AUTONEG_MASK | in set_7220_ibspeed_fast()
3513 ppd->cpspec->ibcddrctrl |= speed == QIB_IB_DDR ? in set_7220_ibspeed_fast()
3516 qib_write_kreg(ppd->dd, kr_ibcddrctrl, ppd->cpspec->ibcddrctrl); in set_7220_ibspeed_fast()
3517 qib_write_kreg(ppd->dd, kr_scratch, 0); in set_7220_ibspeed_fast()
3526 static void try_7220_autoneg(struct qib_pportdata *ppd) in try_7220_autoneg() argument
3535 qib_write_kreg(ppd->dd, kr_ncmodectrl, 0x3b9dc07); in try_7220_autoneg()
3537 spin_lock_irqsave(&ppd->lflags_lock, flags); in try_7220_autoneg()
3538 ppd->lflags |= QIBL_IB_AUTONEG_INPROG; in try_7220_autoneg()
3539 spin_unlock_irqrestore(&ppd->lflags_lock, flags); in try_7220_autoneg()
3540 autoneg_7220_send(ppd, 0); in try_7220_autoneg()
3541 set_7220_ibspeed_fast(ppd, QIB_IB_DDR); in try_7220_autoneg()
3543 toggle_7220_rclkrls(ppd->dd); in try_7220_autoneg()
3545 queue_delayed_work(ib_wq, &ppd->cpspec->autoneg_work, in try_7220_autoneg()
3555 struct qib_pportdata *ppd; in autoneg_7220_work() local
3561 ppd = &container_of(work, struct qib_chippport_specific, in autoneg_7220_work()
3563 dd = ppd->dd; in autoneg_7220_work()
3572 if (SYM_FIELD(ppd->lastibcstat, IBCStatus, LinkTrainingState) in autoneg_7220_work()
3574 qib_set_linkstate(ppd, QIB_IB_LINKDOWN_DISABLE); in autoneg_7220_work()
3580 if (!(ppd->lflags & QIBL_IB_AUTONEG_INPROG)) in autoneg_7220_work()
3584 if (wait_event_timeout(ppd->cpspec->autoneg_wait, in autoneg_7220_work()
3585 !(ppd->lflags & QIBL_IB_AUTONEG_INPROG), in autoneg_7220_work()
3592 if (wait_event_timeout(ppd->cpspec->autoneg_wait, in autoneg_7220_work()
3593 !(ppd->lflags & QIBL_IB_AUTONEG_INPROG), in autoneg_7220_work()
3597 set_7220_ibspeed_fast(ppd, QIB_IB_SDR); in autoneg_7220_work()
3604 wait_event_timeout(ppd->cpspec->autoneg_wait, in autoneg_7220_work()
3605 !(ppd->lflags & QIBL_IB_AUTONEG_INPROG), in autoneg_7220_work()
3608 if (ppd->lflags & QIBL_IB_AUTONEG_INPROG) { in autoneg_7220_work()
3609 spin_lock_irqsave(&ppd->lflags_lock, flags); in autoneg_7220_work()
3610 ppd->lflags &= ~QIBL_IB_AUTONEG_INPROG; in autoneg_7220_work()
3612 ppd->lflags |= QIBL_IB_AUTONEG_FAILED; in autoneg_7220_work()
3615 spin_unlock_irqrestore(&ppd->lflags_lock, flags); in autoneg_7220_work()
3616 set_7220_ibspeed_fast(ppd, ppd->link_speed_enabled); in autoneg_7220_work()
3651 static int qib_7220_ib_updown(struct qib_pportdata *ppd, int ibup, u64 ibcs) in qib_7220_ib_updown() argument
3654 struct qib_devdata *dd = ppd->dd; in qib_7220_ib_updown()
3657 spin_lock_irqsave(&ppd->lflags_lock, flags); in qib_7220_ib_updown()
3658 ppd->lflags &= ~QIBL_IB_FORCE_NOTIFY; in qib_7220_ib_updown()
3659 spin_unlock_irqrestore(&ppd->lflags_lock, flags); in qib_7220_ib_updown()
3667 if (!(ppd->lflags & (QIBL_IB_AUTONEG_FAILED | in qib_7220_ib_updown()
3669 set_7220_ibspeed_fast(ppd, ppd->link_speed_enabled); in qib_7220_ib_updown()
3670 if (!(ppd->lflags & QIBL_IB_AUTONEG_INPROG)) { in qib_7220_ib_updown()
3672 qib_cancel_sends(ppd); /* initial disarm, etc. */ in qib_7220_ib_updown()
3673 spin_lock_irqsave(&ppd->sdma_lock, flags); in qib_7220_ib_updown()
3674 if (__qib_sdma_running(ppd)) in qib_7220_ib_updown()
3675 __qib_sdma_process_event(ppd, in qib_7220_ib_updown()
3677 spin_unlock_irqrestore(&ppd->sdma_lock, flags); in qib_7220_ib_updown()
3683 !(ppd->lflags & (QIBL_IB_AUTONEG_FAILED | in qib_7220_ib_updown()
3685 ppd->link_speed_active == QIB_IB_SDR && in qib_7220_ib_updown()
3686 (ppd->link_speed_enabled & (QIB_IB_DDR | QIB_IB_SDR)) == in qib_7220_ib_updown()
3691 if (!ppd->cpspec->ibdeltainprog) { in qib_7220_ib_updown()
3692 ppd->cpspec->ibdeltainprog = 1; in qib_7220_ib_updown()
3693 ppd->cpspec->ibsymsnap = read_7220_creg32(dd, in qib_7220_ib_updown()
3695 ppd->cpspec->iblnkerrsnap = read_7220_creg32(dd, in qib_7220_ib_updown()
3698 try_7220_autoneg(ppd); in qib_7220_ib_updown()
3700 } else if ((ppd->lflags & QIBL_IB_AUTONEG_INPROG) && in qib_7220_ib_updown()
3701 ppd->link_speed_active == QIB_IB_SDR) { in qib_7220_ib_updown()
3702 autoneg_7220_send(ppd, 1); in qib_7220_ib_updown()
3703 set_7220_ibspeed_fast(ppd, QIB_IB_DDR); in qib_7220_ib_updown()
3708 if ((ppd->lflags & QIBL_IB_AUTONEG_INPROG) && in qib_7220_ib_updown()
3709 (ppd->link_speed_active & QIB_IB_DDR)) { in qib_7220_ib_updown()
3710 spin_lock_irqsave(&ppd->lflags_lock, flags); in qib_7220_ib_updown()
3711 ppd->lflags &= ~(QIBL_IB_AUTONEG_INPROG | in qib_7220_ib_updown()
3713 spin_unlock_irqrestore(&ppd->lflags_lock, in qib_7220_ib_updown()
3717 set_7220_ibspeed_fast(ppd, in qib_7220_ib_updown()
3718 ppd->link_speed_enabled); in qib_7220_ib_updown()
3719 wake_up(&ppd->cpspec->autoneg_wait); in qib_7220_ib_updown()
3721 } else if (ppd->lflags & QIBL_IB_AUTONEG_FAILED) { in qib_7220_ib_updown()
3728 spin_lock_irqsave(&ppd->lflags_lock, flags); in qib_7220_ib_updown()
3729 ppd->lflags &= ~QIBL_IB_AUTONEG_FAILED; in qib_7220_ib_updown()
3730 spin_unlock_irqrestore(&ppd->lflags_lock, in qib_7220_ib_updown()
3732 ppd->cpspec->ibcddrctrl |= in qib_7220_ib_updown()
3739 if (!(ppd->lflags & QIBL_IB_AUTONEG_INPROG)) in qib_7220_ib_updown()
3743 ppd->delay_mult = rate_to_delay in qib_7220_ib_updown()
3748 spin_lock_irqsave(&ppd->sdma_lock, flags); in qib_7220_ib_updown()
3754 if (ppd->sdma_state.current_state != in qib_7220_ib_updown()
3756 __qib_sdma_process_event(ppd, in qib_7220_ib_updown()
3758 spin_unlock_irqrestore(&ppd->sdma_lock, flags); in qib_7220_ib_updown()
3763 if (ppd->cpspec->ibdeltainprog) { in qib_7220_ib_updown()
3764 ppd->cpspec->ibdeltainprog = 0; in qib_7220_ib_updown()
3765 ppd->cpspec->ibsymdelta += read_7220_creg32(ppd->dd, in qib_7220_ib_updown()
3766 cr_ibsymbolerr) - ppd->cpspec->ibsymsnap; in qib_7220_ib_updown()
3767 ppd->cpspec->iblnkerrdelta += read_7220_creg32(ppd->dd, in qib_7220_ib_updown()
3768 cr_iblinkerrrecov) - ppd->cpspec->iblnkerrsnap; in qib_7220_ib_updown()
3771 !ppd->cpspec->ibdeltainprog && in qib_7220_ib_updown()
3772 !(ppd->lflags & QIBL_IB_AUTONEG_INPROG)) { in qib_7220_ib_updown()
3773 ppd->cpspec->ibdeltainprog = 1; in qib_7220_ib_updown()
3774 ppd->cpspec->ibsymsnap = read_7220_creg32(ppd->dd, in qib_7220_ib_updown()
3776 ppd->cpspec->iblnkerrsnap = read_7220_creg32(ppd->dd, in qib_7220_ib_updown()
3781 qib_setup_7220_setextled(ppd, ibup); in qib_7220_ib_updown()
4001 struct qib_pportdata *ppd; in qib_init_7220_variables() local
4006 ppd = &cpspec->pportdata; in qib_init_7220_variables()
4007 dd->pport = ppd; in qib_init_7220_variables()
4011 ppd->cpspec = cpspec; in qib_init_7220_variables()
4062 ret = qib_init_pportdata(ppd, dd, 0, 1); in qib_init_7220_variables()
4065 ppd->link_width_supported = IB_WIDTH_1X | IB_WIDTH_4X; in qib_init_7220_variables()
4066 ppd->link_speed_supported = QIB_IB_SDR | QIB_IB_DDR; in qib_init_7220_variables()
4068 ppd->link_width_enabled = ppd->link_width_supported; in qib_init_7220_variables()
4069 ppd->link_speed_enabled = ppd->link_speed_supported; in qib_init_7220_variables()
4074 ppd->link_width_active = IB_WIDTH_4X; in qib_init_7220_variables()
4075 ppd->link_speed_active = QIB_IB_SDR; in qib_init_7220_variables()
4076 ppd->delay_mult = rate_to_delay[0][1]; in qib_init_7220_variables()
4077 ppd->vls_supported = IB_VL_VL0; in qib_init_7220_variables()
4078 ppd->vls_operational = ppd->vls_supported; in qib_init_7220_variables()
4083 init_timer(&ppd->cpspec->chase_timer); in qib_init_7220_variables()
4084 ppd->cpspec->chase_timer.function = reenable_7220_chase; in qib_init_7220_variables()
4085 ppd->cpspec->chase_timer.data = (unsigned long)ppd; in qib_init_7220_variables()
4190 static u32 __iomem *qib_7220_getsendbuf(struct qib_pportdata *ppd, u64 pbc, in qib_7220_getsendbuf() argument
4194 struct qib_devdata *dd = ppd->dd; in qib_7220_getsendbuf()
4198 !(ppd->lflags & (QIBL_IB_AUTONEG_INPROG | QIBL_LINKACTIVE))) in qib_7220_getsendbuf()
4199 buf = get_7220_link_buf(ppd, pbufnum); in qib_7220_getsendbuf()
4213 static void qib_set_cntr_7220_sample(struct qib_pportdata *ppd, u32 intv, in qib_set_cntr_7220_sample() argument
4216 write_7220_creg(ppd->dd, cr_psinterval, intv); in qib_set_cntr_7220_sample()
4217 write_7220_creg(ppd->dd, cr_psstart, start); in qib_set_cntr_7220_sample()
4227 static void qib_sdma_update_7220_tail(struct qib_pportdata *ppd, u16 tail) in qib_sdma_update_7220_tail() argument
4231 ppd->sdma_descq_tail = tail; in qib_sdma_update_7220_tail()
4232 qib_write_kreg(ppd->dd, kr_senddmatail, tail); in qib_sdma_update_7220_tail()
4235 static void qib_sdma_set_7220_desc_cnt(struct qib_pportdata *ppd, unsigned cnt) in qib_sdma_set_7220_desc_cnt() argument
4279 static void qib_7220_sdma_init_early(struct qib_pportdata *ppd) in qib_7220_sdma_init_early() argument
4281 ppd->sdma_state.set_state_action = sdma_7220_action_table; in qib_7220_sdma_init_early()
4284 static int init_sdma_7220_regs(struct qib_pportdata *ppd) in init_sdma_7220_regs() argument
4286 struct qib_devdata *dd = ppd->dd; in init_sdma_7220_regs()
4291 qib_write_kreg(dd, kr_senddmabase, ppd->sdma_descq_phys); in init_sdma_7220_regs()
4292 qib_sdma_7220_setlengen(ppd); in init_sdma_7220_regs()
4293 qib_sdma_update_7220_tail(ppd, 0); /* Set SendDmaTail */ in init_sdma_7220_regs()
4295 qib_write_kreg(dd, kr_senddmaheadaddr, ppd->sdma_head_phys); in init_sdma_7220_regs()
4315 ppd->sdma_state.first_sendbuf = i; in init_sdma_7220_regs()
4316 ppd->sdma_state.last_sendbuf = n; in init_sdma_7220_regs()
4322 static u16 qib_sdma_7220_gethead(struct qib_pportdata *ppd) in qib_sdma_7220_gethead() argument
4324 struct qib_devdata *dd = ppd->dd; in qib_sdma_7220_gethead()
4332 use_dmahead = __qib_sdma_running(ppd) && in qib_sdma_7220_gethead()
4336 (u16)le64_to_cpu(*ppd->sdma_head_dma) : in qib_sdma_7220_gethead()
4339 swhead = ppd->sdma_descq_head; in qib_sdma_7220_gethead()
4340 swtail = ppd->sdma_descq_tail; in qib_sdma_7220_gethead()
4341 cnt = ppd->sdma_descq_cnt; in qib_sdma_7220_gethead()
4368 static int qib_sdma_7220_busy(struct qib_pportdata *ppd) in qib_sdma_7220_busy() argument
4370 u64 hwstatus = qib_read_kreg64(ppd->dd, kr_senddmastatus); in qib_sdma_7220_busy()
4386 static u32 qib_7220_setpbc_control(struct qib_pportdata *ppd, u32 plen, in qib_7220_setpbc_control() argument
4389 u8 snd_mult = ppd->delay_mult; in qib_7220_setpbc_control()
4391 u32 ret = ppd->cpspec->last_delay_mult; in qib_7220_setpbc_control()
4393 ppd->cpspec->last_delay_mult = (rcv_mult > snd_mult) ? in qib_7220_setpbc_control()