Lines Matching refs:ppd

63 static void sendctrl_7322_mod(struct qib_pportdata *ppd, u32 op);
74 static void qib_set_ib_7322_lstate(struct qib_pportdata *ppd, u16 linkcmd,
617 struct qib_pportdata *ppd; member
863 static inline u64 qib_read_kreg_port(const struct qib_pportdata *ppd, in qib_read_kreg_port() argument
866 if (!ppd->cpspec->kpregbase || !(ppd->dd->flags & QIB_PRESENT)) in qib_read_kreg_port()
868 return readq(&ppd->cpspec->kpregbase[regno]); in qib_read_kreg_port()
871 static inline void qib_write_kreg_port(const struct qib_pportdata *ppd, in qib_write_kreg_port() argument
874 if (ppd->cpspec && ppd->dd && ppd->cpspec->kpregbase && in qib_write_kreg_port()
875 (ppd->dd->flags & QIB_PRESENT)) in qib_write_kreg_port()
876 writeq(value, &ppd->cpspec->kpregbase[regno]); in qib_write_kreg_port()
911 static inline void write_7322_creg_port(const struct qib_pportdata *ppd, in write_7322_creg_port() argument
914 if (ppd->cpspec && ppd->cpspec->cpregbase && in write_7322_creg_port()
915 (ppd->dd->flags & QIB_PRESENT)) in write_7322_creg_port()
916 writeq(value, &ppd->cpspec->cpregbase[regno]); in write_7322_creg_port()
919 static inline u64 read_7322_creg_port(const struct qib_pportdata *ppd, in read_7322_creg_port() argument
922 if (!ppd->cpspec || !ppd->cpspec->cpregbase || in read_7322_creg_port()
923 !(ppd->dd->flags & QIB_PRESENT)) in read_7322_creg_port()
925 return readq(&ppd->cpspec->cpregbase[regno]); in read_7322_creg_port()
928 static inline u32 read_7322_creg32_port(const struct qib_pportdata *ppd, in read_7322_creg32_port() argument
931 if (!ppd->cpspec || !ppd->cpspec->cpregbase || in read_7322_creg32_port()
932 !(ppd->dd->flags & QIB_PRESENT)) in read_7322_creg32_port()
934 return readl(&ppd->cpspec->cpregbase[regno]); in read_7322_creg32_port()
1347 static void qib_disarm_7322_senderrbufs(struct qib_pportdata *ppd) in qib_disarm_7322_senderrbufs() argument
1349 struct qib_devdata *dd = ppd->dd; in qib_disarm_7322_senderrbufs()
1425 static void flush_fifo(struct qib_pportdata *ppd) in flush_fifo() argument
1427 struct qib_devdata *dd = ppd->dd; in flush_fifo()
1451 (((u64)ppd->hw_pidx) << (PBC_PORT_SEL_LSB + 32)) | in flush_fifo()
1453 piobuf = qib_7322_getsendbuf(ppd, pbc, &bufn); in flush_fifo()
1472 static void qib_7322_sdma_sendctrl(struct qib_pportdata *ppd, unsigned op) in qib_7322_sdma_sendctrl() argument
1474 struct qib_devdata *dd = ppd->dd; in qib_7322_sdma_sendctrl()
1506 ppd->p_sendctrl &= ~SYM_MASK(SendCtrl_0, SendEnable); in qib_7322_sdma_sendctrl()
1507 qib_write_kreg_port(ppd, krp_sendctrl, ppd->p_sendctrl); in qib_7322_sdma_sendctrl()
1511 ppd->p_sendctrl |= set_sendctrl; in qib_7322_sdma_sendctrl()
1512 ppd->p_sendctrl &= ~clr_sendctrl; in qib_7322_sdma_sendctrl()
1515 qib_write_kreg_port(ppd, krp_sendctrl, in qib_7322_sdma_sendctrl()
1516 ppd->p_sendctrl | in qib_7322_sdma_sendctrl()
1519 qib_write_kreg_port(ppd, krp_sendctrl, ppd->p_sendctrl); in qib_7322_sdma_sendctrl()
1523 ppd->p_sendctrl |= SYM_MASK(SendCtrl_0, SendEnable); in qib_7322_sdma_sendctrl()
1524 qib_write_kreg_port(ppd, krp_sendctrl, ppd->p_sendctrl); in qib_7322_sdma_sendctrl()
1530 if ((op & QIB_SDMA_SENDCTRL_OP_DRAIN) && ppd->dd->cspec->r1) in qib_7322_sdma_sendctrl()
1531 flush_fifo(ppd); in qib_7322_sdma_sendctrl()
1534 static void qib_7322_sdma_hw_clean_up(struct qib_pportdata *ppd) in qib_7322_sdma_hw_clean_up() argument
1536 __qib_sdma_process_event(ppd, qib_sdma_event_e50_hw_cleaned); in qib_7322_sdma_hw_clean_up()
1539 static void qib_sdma_7322_setlengen(struct qib_pportdata *ppd) in qib_sdma_7322_setlengen() argument
1546 qib_write_kreg_port(ppd, krp_senddmalengen, ppd->sdma_descq_cnt); in qib_sdma_7322_setlengen()
1547 qib_write_kreg_port(ppd, krp_senddmalengen, in qib_sdma_7322_setlengen()
1548 ppd->sdma_descq_cnt | in qib_sdma_7322_setlengen()
1555 static void qib_sdma_update_7322_tail(struct qib_pportdata *ppd, u16 tail) in qib_sdma_update_7322_tail() argument
1559 ppd->sdma_descq_tail = tail; in qib_sdma_update_7322_tail()
1560 qib_write_kreg_port(ppd, krp_senddmatail, tail); in qib_sdma_update_7322_tail()
1566 static void qib_7322_sdma_hw_start_up(struct qib_pportdata *ppd) in qib_7322_sdma_hw_start_up() argument
1574 sendctrl_7322_mod(ppd, QIB_SENDCTRL_FLUSH); in qib_7322_sdma_hw_start_up()
1576 qib_sdma_7322_setlengen(ppd); in qib_7322_sdma_hw_start_up()
1577 qib_sdma_update_7322_tail(ppd, 0); /* Set SendDmaTail */ in qib_7322_sdma_hw_start_up()
1578 ppd->sdma_head_dma[0] = 0; in qib_7322_sdma_hw_start_up()
1579 qib_7322_sdma_sendctrl(ppd, in qib_7322_sdma_hw_start_up()
1580 ppd->sdma_state.current_op | QIB_SDMA_SENDCTRL_OP_CLEANUP); in qib_7322_sdma_hw_start_up()
1595 static void sdma_7322_p_errors(struct qib_pportdata *ppd, u64 errs) in sdma_7322_p_errors() argument
1598 struct qib_devdata *dd = ppd->dd; in sdma_7322_p_errors()
1601 err_decode(ppd->cpspec->sdmamsgbuf, sizeof(ppd->cpspec->sdmamsgbuf), in sdma_7322_p_errors()
1606 ppd->port); in sdma_7322_p_errors()
1608 spin_lock_irqsave(&ppd->sdma_lock, flags); in sdma_7322_p_errors()
1612 qib_dev_porterr(dd, ppd->port, in sdma_7322_p_errors()
1614 qib_sdma_state_names[ppd->sdma_state.current_state], in sdma_7322_p_errors()
1615 errs, ppd->cpspec->sdmamsgbuf); in sdma_7322_p_errors()
1616 dump_sdma_7322_state(ppd); in sdma_7322_p_errors()
1619 switch (ppd->sdma_state.current_state) { in sdma_7322_p_errors()
1625 __qib_sdma_process_event(ppd, in sdma_7322_p_errors()
1637 __qib_sdma_process_event(ppd, in sdma_7322_p_errors()
1643 __qib_sdma_process_event(ppd, in sdma_7322_p_errors()
1648 __qib_sdma_process_event(ppd, qib_sdma_event_e7322_err_halted); in sdma_7322_p_errors()
1649 __qib_sdma_process_event(ppd, qib_sdma_event_e60_hw_halted); in sdma_7322_p_errors()
1653 spin_unlock_irqrestore(&ppd->sdma_lock, flags); in sdma_7322_p_errors()
1759 struct qib_pportdata *ppd = (struct qib_pportdata *)opaque; in reenable_chase() local
1761 ppd->cpspec->chase_timer.expires = 0; in reenable_chase()
1762 qib_set_ib_7322_lstate(ppd, QLOGIC_IB_IBCC_LINKCMD_DOWN, in reenable_chase()
1766 static void disable_chase(struct qib_pportdata *ppd, unsigned long tnow, in disable_chase() argument
1769 ppd->cpspec->chase_end = 0; in disable_chase()
1774 qib_set_ib_7322_lstate(ppd, QLOGIC_IB_IBCC_LINKCMD_DOWN, in disable_chase()
1776 ppd->cpspec->chase_timer.expires = jiffies + QIB_CHASE_DIS_TIME; in disable_chase()
1777 add_timer(&ppd->cpspec->chase_timer); in disable_chase()
1780 static void handle_serdes_issues(struct qib_pportdata *ppd, u64 ibcst) in handle_serdes_issues() argument
1799 if (ppd->cpspec->chase_end && in handle_serdes_issues()
1800 time_after(tnow, ppd->cpspec->chase_end)) in handle_serdes_issues()
1801 disable_chase(ppd, tnow, ibclt); in handle_serdes_issues()
1802 else if (!ppd->cpspec->chase_end) in handle_serdes_issues()
1803 ppd->cpspec->chase_end = tnow + QIB_CHASE_TIME; in handle_serdes_issues()
1806 ppd->cpspec->chase_end = 0; in handle_serdes_issues()
1814 force_h1(ppd); in handle_serdes_issues()
1815 ppd->cpspec->qdr_reforce = 1; in handle_serdes_issues()
1816 if (!ppd->dd->cspec->r1) in handle_serdes_issues()
1817 serdes_7322_los_enable(ppd, 0); in handle_serdes_issues()
1818 } else if (ppd->cpspec->qdr_reforce && in handle_serdes_issues()
1823 force_h1(ppd); in handle_serdes_issues()
1825 if ((IS_QMH(ppd->dd) || IS_QME(ppd->dd)) && in handle_serdes_issues()
1826 ppd->link_speed_enabled == QIB_IB_QDR && in handle_serdes_issues()
1831 adj_tx_serdes(ppd); in handle_serdes_issues()
1835 u8 pibclt = (u8)SYM_FIELD(ppd->lastibcstat, IBCStatusA_0, in handle_serdes_issues()
1837 if (!ppd->dd->cspec->r1 && in handle_serdes_issues()
1845 serdes_7322_los_enable(ppd, 1); in handle_serdes_issues()
1846 if (!ppd->cpspec->qdr_dfe_on && in handle_serdes_issues()
1848 ppd->cpspec->qdr_dfe_on = 1; in handle_serdes_issues()
1849 ppd->cpspec->qdr_dfe_time = 0; in handle_serdes_issues()
1851 qib_write_kreg_port(ppd, krp_static_adapt_dis(2), in handle_serdes_issues()
1852 ppd->dd->cspec->r1 ? in handle_serdes_issues()
1857 ppd->dd->unit, ppd->port, ibclt); in handle_serdes_issues()
1869 static noinline void handle_7322_p_errors(struct qib_pportdata *ppd) in handle_7322_p_errors() argument
1873 struct qib_devdata *dd = ppd->dd; in handle_7322_p_errors()
1878 check_7322_rxe_status(ppd); in handle_7322_p_errors()
1880 errs = qib_read_kreg_port(ppd, krp_errstatus); in handle_7322_p_errors()
1884 ppd->port); in handle_7322_p_errors()
1890 msg = ppd->cpspec->epmsgbuf; in handle_7322_p_errors()
1894 err_decode(msg, sizeof(ppd->cpspec->epmsgbuf), in handle_7322_p_errors()
1897 snprintf(msg, sizeof(ppd->cpspec->epmsgbuf), in handle_7322_p_errors()
1899 qib_dev_porterr(dd, ppd->port, in handle_7322_p_errors()
1909 symptom = qib_read_kreg_port(ppd, krp_sendhdrsymptom); in handle_7322_p_errors()
1910 qib_write_kreg_port(ppd, krp_sendhdrsymptom, 0); in handle_7322_p_errors()
1911 err_decode(msg, sizeof(ppd->cpspec->epmsgbuf), symptom, in handle_7322_p_errors()
1919 !(ppd->lflags & QIBL_LINKACTIVE)) { in handle_7322_p_errors()
1927 err_decode(msg, sizeof(ppd->cpspec->epmsgbuf), in handle_7322_p_errors()
1933 qib_disarm_7322_senderrbufs(ppd); in handle_7322_p_errors()
1935 !(ppd->lflags & QIBL_LINKACTIVE)) { in handle_7322_p_errors()
1943 err_decode(msg, sizeof(ppd->cpspec->epmsgbuf), errs, in handle_7322_p_errors()
1949 qib_write_kreg_port(ppd, krp_errclear, errs); in handle_7322_p_errors()
1963 sdma_7322_p_errors(ppd, errs); in handle_7322_p_errors()
1969 ibcs = qib_read_kreg_port(ppd, krp_ibcstatus_a); in handle_7322_p_errors()
1972 if (!(ppd->lflags & QIBL_IB_AUTONEG_INPROG)) in handle_7322_p_errors()
1973 handle_serdes_issues(ppd, ibcs); in handle_7322_p_errors()
1974 if (!(ppd->cpspec->ibcctrl_a & in handle_7322_p_errors()
1981 ppd->cpspec->ibcctrl_a |= in handle_7322_p_errors()
1983 qib_write_kreg_port(ppd, krp_ibcctrl_a, in handle_7322_p_errors()
1984 ppd->cpspec->ibcctrl_a); in handle_7322_p_errors()
1988 ppd->link_width_active = in handle_7322_p_errors()
1991 ppd->link_speed_active = (ibcs & SYM_MASK(IBCStatusA_0, in handle_7322_p_errors()
1996 if ((ppd->lflags & QIBL_IB_LINK_DISABLED) && ltstate != in handle_7322_p_errors()
1998 qib_set_ib_7322_lstate(ppd, 0, in handle_7322_p_errors()
2013 qib_handle_e_ibstatuschanged(ppd, ibcs); in handle_7322_p_errors()
2016 qib_dev_porterr(dd, ppd->port, "%s error\n", msg); in handle_7322_p_errors()
2018 if (ppd->state_wanted & ppd->lflags) in handle_7322_p_errors()
2019 wake_up_interruptible(&ppd->state_wait); in handle_7322_p_errors()
2181 struct qib_pportdata *ppd = dd->pport; in qib_7322_handle_hwerrors() local
2183 for (; pidx < dd->num_pports; ++pidx, ppd++) { in qib_7322_handle_hwerrors()
2192 spin_lock_irqsave(&ppd->sdma_lock, flags); in qib_7322_handle_hwerrors()
2193 dump_sdma_7322_state(ppd); in qib_7322_handle_hwerrors()
2194 spin_unlock_irqrestore(&ppd->sdma_lock, flags); in qib_7322_handle_hwerrors()
2271 static void qib_set_ib_7322_lstate(struct qib_pportdata *ppd, u16 linkcmd, in qib_set_ib_7322_lstate() argument
2275 struct qib_devdata *dd = ppd->dd; in qib_set_ib_7322_lstate()
2286 qib_7322_mini_pcs_reset(ppd); in qib_set_ib_7322_lstate()
2287 spin_lock_irqsave(&ppd->lflags_lock, flags); in qib_set_ib_7322_lstate()
2288 ppd->lflags |= QIBL_IB_LINK_DISABLED; in qib_set_ib_7322_lstate()
2289 spin_unlock_irqrestore(&ppd->lflags_lock, flags); in qib_set_ib_7322_lstate()
2296 spin_lock_irqsave(&ppd->lflags_lock, flags); in qib_set_ib_7322_lstate()
2297 ppd->lflags &= ~QIBL_IB_LINK_DISABLED; in qib_set_ib_7322_lstate()
2298 spin_unlock_irqrestore(&ppd->lflags_lock, flags); in qib_set_ib_7322_lstate()
2303 ppd->cpspec->ibcctrl_a &= in qib_set_ib_7322_lstate()
2310 qib_write_kreg_port(ppd, krp_ibcctrl_a, ppd->cpspec->ibcctrl_a | in qib_set_ib_7322_lstate()
2328 static void set_vls(struct qib_pportdata *ppd) in set_vls() argument
2331 struct qib_devdata *dd = ppd->dd; in set_vls()
2334 numvls = qib_num_vls(ppd->vls_operational); in set_vls()
2346 qib_write_kreg_port(ppd, krp_rxcreditvl15, (u64) cred_vl); in set_vls()
2349 qib_write_kreg_port(ppd, krp_rxcreditvl0, cred_vl + vl0extra); in set_vls()
2351 qib_write_kreg_port(ppd, krp_rxcreditvl0 + i, cred_vl); in set_vls()
2353 qib_write_kreg_port(ppd, krp_rxcreditvl0 + i, 0); in set_vls()
2356 val = qib_read_kreg_port(ppd, krp_ibsdtestiftx); in set_vls()
2358 qib_write_kreg_port(ppd, krp_ibsdtestiftx, val); in set_vls()
2361 qib_write_kreg_port(ppd, krp_ibsdtestiftx, val); in set_vls()
2364 val = qib_read_kreg_port(ppd, krp_rxcreditvl0 + i); in set_vls()
2365 val = qib_read_kreg_port(ppd, krp_rxcreditvl15); in set_vls()
2368 ppd->cpspec->ibcctrl_a = (ppd->cpspec->ibcctrl_a & in set_vls()
2371 qib_write_kreg_port(ppd, krp_ibcctrl_a, ppd->cpspec->ibcctrl_a); in set_vls()
2379 static int serdes_7322_init(struct qib_pportdata *ppd);
2385 static int qib_7322_bringup_serdes(struct qib_pportdata *ppd) in qib_7322_bringup_serdes() argument
2387 struct qib_devdata *dd = ppd->dd; in qib_7322_bringup_serdes()
2398 ppd->cpspec->ibcctrl_a &= ~SYM_MASK(IBCCtrlA_0, IBLinkEn); in qib_7322_bringup_serdes()
2399 qib_write_kreg_port(ppd, krp_ibcctrl_a, ppd->cpspec->ibcctrl_a); in qib_7322_bringup_serdes()
2403 qib_write_kreg_port(ppd, krp_tx_deemph_override, in qib_7322_bringup_serdes()
2408 ppd->cpspec->ibdeltainprog = 1; in qib_7322_bringup_serdes()
2409 ppd->cpspec->ibsymsnap = read_7322_creg32_port(ppd, in qib_7322_bringup_serdes()
2411 ppd->cpspec->iblnkerrsnap = read_7322_creg32_port(ppd, in qib_7322_bringup_serdes()
2431 ibc |= ((u64)(ppd->ibmaxlen >> 2) + 1) << in qib_7322_bringup_serdes()
2433 ppd->cpspec->ibcctrl_a = ibc; /* without linkcmd or linkinitcmd! */ in qib_7322_bringup_serdes()
2439 qib_7322_mini_pcs_reset(ppd); in qib_7322_bringup_serdes()
2441 if (!ppd->cpspec->ibcctrl_b) { in qib_7322_bringup_serdes()
2442 unsigned lse = ppd->link_speed_enabled; in qib_7322_bringup_serdes()
2448 ppd->cpspec->ibcctrl_b = qib_read_kreg_port(ppd, in qib_7322_bringup_serdes()
2450 ppd->cpspec->ibcctrl_b &= ~(IBA7322_IBC_SPEED_QDR | in qib_7322_bringup_serdes()
2456 ppd->cpspec->ibcctrl_b |= in qib_7322_bringup_serdes()
2461 ppd->cpspec->ibcctrl_b |= (lse == QIB_IB_QDR) ? in qib_7322_bringup_serdes()
2467 if ((ppd->link_width_enabled & (IB_WIDTH_1X | IB_WIDTH_4X)) == in qib_7322_bringup_serdes()
2469 ppd->cpspec->ibcctrl_b |= IBA7322_IBC_WIDTH_AUTONEG; in qib_7322_bringup_serdes()
2471 ppd->cpspec->ibcctrl_b |= in qib_7322_bringup_serdes()
2472 ppd->link_width_enabled == IB_WIDTH_4X ? in qib_7322_bringup_serdes()
2477 ppd->cpspec->ibcctrl_b |= (IBA7322_IBC_RXPOL_MASK | in qib_7322_bringup_serdes()
2480 qib_write_kreg_port(ppd, krp_ibcctrl_b, ppd->cpspec->ibcctrl_b); in qib_7322_bringup_serdes()
2483 val = qib_read_kreg_port(ppd, krp_ibcctrl_c); in qib_7322_bringup_serdes()
2486 qib_write_kreg_port(ppd, krp_ibcctrl_c, val); in qib_7322_bringup_serdes()
2488 serdes_7322_init(ppd); in qib_7322_bringup_serdes()
2490 guid = be64_to_cpu(ppd->guid); in qib_7322_bringup_serdes()
2493 guid = be64_to_cpu(dd->base_guid) + ppd->port - 1; in qib_7322_bringup_serdes()
2494 ppd->guid = cpu_to_be64(guid); in qib_7322_bringup_serdes()
2497 qib_write_kreg_port(ppd, krp_hrtbt_guid, guid); in qib_7322_bringup_serdes()
2502 ppd->cpspec->ibcctrl_a |= SYM_MASK(IBCCtrlA_0, IBLinkEn); in qib_7322_bringup_serdes()
2503 set_vls(ppd); in qib_7322_bringup_serdes()
2506 val = ppd->cpspec->ibcctrl_a | (QLOGIC_IB_IBCC_LINKINITCMD_DISABLE << in qib_7322_bringup_serdes()
2508 qib_write_kreg_port(ppd, krp_ibcctrl_a, val); in qib_7322_bringup_serdes()
2511 ppd->cpspec->ibcctrl_a = val & ~SYM_MASK(IBCCtrlA_0, LinkInitCmd); in qib_7322_bringup_serdes()
2515 ppd->p_rcvctrl |= SYM_MASK(RcvCtrl_0, RcvIBPortEnable); in qib_7322_bringup_serdes()
2516 qib_write_kreg_port(ppd, krp_rcvctrl, ppd->p_rcvctrl); in qib_7322_bringup_serdes()
2520 val = qib_read_kreg_port(ppd, krp_errmask); in qib_7322_bringup_serdes()
2521 qib_write_kreg_port(ppd, krp_errmask, in qib_7322_bringup_serdes()
2533 static void qib_7322_mini_quiet_serdes(struct qib_pportdata *ppd) in qib_7322_mini_quiet_serdes() argument
2538 qib_set_ib_7322_lstate(ppd, 0, QLOGIC_IB_IBCC_LINKINITCMD_DISABLE); in qib_7322_mini_quiet_serdes()
2540 spin_lock_irqsave(&ppd->lflags_lock, flags); in qib_7322_mini_quiet_serdes()
2541 ppd->lflags &= ~QIBL_IB_AUTONEG_INPROG; in qib_7322_mini_quiet_serdes()
2542 spin_unlock_irqrestore(&ppd->lflags_lock, flags); in qib_7322_mini_quiet_serdes()
2543 wake_up(&ppd->cpspec->autoneg_wait); in qib_7322_mini_quiet_serdes()
2544 cancel_delayed_work_sync(&ppd->cpspec->autoneg_work); in qib_7322_mini_quiet_serdes()
2545 if (ppd->dd->cspec->r1) in qib_7322_mini_quiet_serdes()
2546 cancel_delayed_work_sync(&ppd->cpspec->ipg_work); in qib_7322_mini_quiet_serdes()
2548 ppd->cpspec->chase_end = 0; in qib_7322_mini_quiet_serdes()
2549 if (ppd->cpspec->chase_timer.data) /* if initted */ in qib_7322_mini_quiet_serdes()
2550 del_timer_sync(&ppd->cpspec->chase_timer); in qib_7322_mini_quiet_serdes()
2559 ppd->cpspec->ibcctrl_a &= ~SYM_MASK(IBCCtrlA_0, IBLinkEn); in qib_7322_mini_quiet_serdes()
2560 qib_7322_mini_pcs_reset(ppd); in qib_7322_mini_quiet_serdes()
2566 if (ppd->cpspec->ibsymdelta || ppd->cpspec->iblnkerrdelta || in qib_7322_mini_quiet_serdes()
2567 ppd->cpspec->ibdeltainprog || ppd->cpspec->iblnkdowndelta) { in qib_7322_mini_quiet_serdes()
2568 struct qib_devdata *dd = ppd->dd; in qib_7322_mini_quiet_serdes()
2576 if (ppd->cpspec->ibsymdelta || ppd->cpspec->ibdeltainprog) { in qib_7322_mini_quiet_serdes()
2577 val = read_7322_creg32_port(ppd, crp_ibsymbolerr); in qib_7322_mini_quiet_serdes()
2578 if (ppd->cpspec->ibdeltainprog) in qib_7322_mini_quiet_serdes()
2579 val -= val - ppd->cpspec->ibsymsnap; in qib_7322_mini_quiet_serdes()
2580 val -= ppd->cpspec->ibsymdelta; in qib_7322_mini_quiet_serdes()
2581 write_7322_creg_port(ppd, crp_ibsymbolerr, val); in qib_7322_mini_quiet_serdes()
2583 if (ppd->cpspec->iblnkerrdelta || ppd->cpspec->ibdeltainprog) { in qib_7322_mini_quiet_serdes()
2584 val = read_7322_creg32_port(ppd, crp_iblinkerrrecov); in qib_7322_mini_quiet_serdes()
2585 if (ppd->cpspec->ibdeltainprog) in qib_7322_mini_quiet_serdes()
2586 val -= val - ppd->cpspec->iblnkerrsnap; in qib_7322_mini_quiet_serdes()
2587 val -= ppd->cpspec->iblnkerrdelta; in qib_7322_mini_quiet_serdes()
2588 write_7322_creg_port(ppd, crp_iblinkerrrecov, val); in qib_7322_mini_quiet_serdes()
2590 if (ppd->cpspec->iblnkdowndelta) { in qib_7322_mini_quiet_serdes()
2591 val = read_7322_creg32_port(ppd, crp_iblinkdown); in qib_7322_mini_quiet_serdes()
2592 val += ppd->cpspec->iblnkdowndelta; in qib_7322_mini_quiet_serdes()
2593 write_7322_creg_port(ppd, crp_iblinkdown, val); in qib_7322_mini_quiet_serdes()
2627 static void qib_setup_7322_setextled(struct qib_pportdata *ppd, u32 on) in qib_setup_7322_setextled() argument
2629 struct qib_devdata *dd = ppd->dd; in qib_setup_7322_setextled()
2642 if (ppd->led_override) { in qib_setup_7322_setextled()
2643 grn = (ppd->led_override & QIB_LED_PHYS); in qib_setup_7322_setextled()
2644 yel = (ppd->led_override & QIB_LED_LOG); in qib_setup_7322_setextled()
2646 val = qib_read_kreg_port(ppd, krp_ibcstatus_a); in qib_setup_7322_setextled()
2656 extctl = dd->cspec->extctrl & (ppd->port == 1 ? in qib_setup_7322_setextled()
2659 extctl |= ppd->port == 1 ? ExtLED_IB1_GRN : ExtLED_IB2_GRN; in qib_setup_7322_setextled()
2669 extctl |= ppd->port == 1 ? ExtLED_IB1_YEL : ExtLED_IB2_YEL; in qib_setup_7322_setextled()
2675 qib_write_kreg_port(ppd, krp_rcvpktledcnt, ledblink); in qib_setup_7322_setextled()
2730 static void qib_update_sdma_dca(struct qib_pportdata *ppd, int cpu) in qib_update_sdma_dca() argument
2732 struct qib_devdata *dd = ppd->dd; in qib_update_sdma_dca()
2734 unsigned pidx = ppd->port - 1; in qib_update_sdma_dca()
2740 cspec->dca_rcvhdr_ctrl[4] &= ~(ppd->hw_pidx ? in qib_update_sdma_dca()
2745 (ppd->hw_pidx ? in qib_update_sdma_dca()
2749 "sdma %d cpu %d dca %llx\n", ppd->hw_pidx, cpu, in qib_update_sdma_dca()
2753 cspec->dca_ctrl |= ppd->hw_pidx ? in qib_update_sdma_dca()
2811 struct qib_pportdata *ppd = (struct qib_pportdata *)n->arg; in qib_irq_notifier_notify() local
2813 qib_update_sdma_dca(ppd, cpu); in qib_irq_notifier_notify()
2828 struct qib_pportdata *ppd = (struct qib_pportdata *)n->arg; in qib_irq_notifier_release() local
2830 dd = ppd->dd; in qib_irq_notifier_release()
3002 struct qib_pportdata *ppd; in unknown_7322_gpio_intr() local
3009 ppd = dd->pport + pidx; in unknown_7322_gpio_intr()
3010 mask <<= (QSFP_GPIO_PORT2_SHIFT * ppd->hw_pidx); in unknown_7322_gpio_intr()
3014 qd = &ppd->cpspec->qsfp_data; in unknown_7322_gpio_intr()
3053 handle_7322_p_errors(dd->rcd[0]->ppd); in unlikely_7322_intr()
3055 handle_7322_p_errors(dd->rcd[1]->ppd); in unlikely_7322_intr()
3243 struct qib_pportdata *ppd = data; in sdma_intr() local
3244 struct qib_devdata *dd = ppd->dd; in sdma_intr()
3258 qib_write_kreg(dd, kr_intclear, ppd->hw_pidx ? in sdma_intr()
3260 qib_sdma_intr(ppd); in sdma_intr()
3270 struct qib_pportdata *ppd = data; in sdma_idle_intr() local
3271 struct qib_devdata *dd = ppd->dd; in sdma_idle_intr()
3285 qib_write_kreg(dd, kr_intclear, ppd->hw_pidx ? in sdma_idle_intr()
3287 qib_sdma_intr(ppd); in sdma_idle_intr()
3297 struct qib_pportdata *ppd = data; in sdma_progress_intr() local
3298 struct qib_devdata *dd = ppd->dd; in sdma_progress_intr()
3312 qib_write_kreg(dd, kr_intclear, ppd->hw_pidx ? in sdma_progress_intr()
3315 qib_sdma_intr(ppd); in sdma_progress_intr()
3325 struct qib_pportdata *ppd = data; in sdma_cleanup_intr() local
3326 struct qib_devdata *dd = ppd->dd; in sdma_cleanup_intr()
3340 qib_write_kreg(dd, kr_intclear, ppd->hw_pidx ? in sdma_cleanup_intr()
3343 qib_sdma_process_event(ppd, qib_sdma_event_e20_hw_started); in sdma_cleanup_intr()
3796 struct qib_pportdata *ppd = &dd->pport[i]; in qib_do_7322_reset() local
3798 spin_lock_irqsave(&ppd->lflags_lock, flags); in qib_do_7322_reset()
3799 ppd->lflags |= QIBL_IB_FORCE_NOTIFY; in qib_do_7322_reset()
3800 ppd->lflags &= ~QIBL_IB_AUTONEG_FAILED; in qib_do_7322_reset()
3801 spin_unlock_irqrestore(&ppd->lflags_lock, flags); in qib_do_7322_reset()
4013 static int qib_7322_get_ib_cfg(struct qib_pportdata *ppd, int which) in qib_7322_get_ib_cfg() argument
4022 ret = ppd->link_width_enabled; in qib_7322_get_ib_cfg()
4026 ret = ppd->link_width_active; in qib_7322_get_ib_cfg()
4030 ret = ppd->link_speed_enabled; in qib_7322_get_ib_cfg()
4034 ret = ppd->link_speed_active; in qib_7322_get_ib_cfg()
4048 ret = qib_read_kreg_port(ppd, krp_ibcstatus_b) & in qib_7322_get_ib_cfg()
4053 ret = ppd->vls_operational; in qib_7322_get_ib_cfg()
4065 ret = SYM_FIELD(ppd->cpspec->ibcctrl_a, IBCCtrlA_0, in qib_7322_get_ib_cfg()
4070 ret = SYM_FIELD(ppd->cpspec->ibcctrl_a, IBCCtrlA_0, in qib_7322_get_ib_cfg()
4076 ret = (ppd->cpspec->ibcctrl_a & in qib_7322_get_ib_cfg()
4091 if (ppd->link_speed_active == QIB_IB_QDR) in qib_7322_get_ib_cfg()
4093 else if (ppd->link_speed_active == QIB_IB_DDR) in qib_7322_get_ib_cfg()
4103 ret = (int)((ppd->cpspec->ibcctrl_b >> lsb) & maskr); in qib_7322_get_ib_cfg()
4116 static int qib_7322_set_ib_cfg(struct qib_pportdata *ppd, int which, u32 val) in qib_7322_set_ib_cfg() argument
4118 struct qib_devdata *dd = ppd->dd; in qib_7322_set_ib_cfg()
4139 qib_write_kreg_port(ppd, krp_sendslid, in qib_7322_set_ib_cfg()
4141 qib_write_kreg_port(ppd, krp_sendslidmask, in qib_7322_set_ib_cfg()
4146 ppd->link_width_enabled = val; in qib_7322_set_ib_cfg()
4166 ppd->link_speed_enabled = val; in qib_7322_set_ib_cfg()
4174 spin_lock_irqsave(&ppd->lflags_lock, flags); in qib_7322_set_ib_cfg()
4175 ppd->lflags &= ~QIBL_IB_AUTONEG_FAILED; in qib_7322_set_ib_cfg()
4176 spin_unlock_irqrestore(&ppd->lflags_lock, flags); in qib_7322_set_ib_cfg()
4194 maskr = SYM_FIELD(ppd->cpspec->ibcctrl_a, IBCCtrlA_0, in qib_7322_set_ib_cfg()
4197 ppd->cpspec->ibcctrl_a &= in qib_7322_set_ib_cfg()
4199 ppd->cpspec->ibcctrl_a |= (u64) val << in qib_7322_set_ib_cfg()
4201 qib_write_kreg_port(ppd, krp_ibcctrl_a, in qib_7322_set_ib_cfg()
4202 ppd->cpspec->ibcctrl_a); in qib_7322_set_ib_cfg()
4208 maskr = SYM_FIELD(ppd->cpspec->ibcctrl_a, IBCCtrlA_0, in qib_7322_set_ib_cfg()
4211 ppd->cpspec->ibcctrl_a &= in qib_7322_set_ib_cfg()
4213 ppd->cpspec->ibcctrl_a |= (u64) val << in qib_7322_set_ib_cfg()
4215 qib_write_kreg_port(ppd, krp_ibcctrl_a, in qib_7322_set_ib_cfg()
4216 ppd->cpspec->ibcctrl_a); in qib_7322_set_ib_cfg()
4222 maskr = (u64) ppd->pkeys[0] | ((u64) ppd->pkeys[1] << 16) | in qib_7322_set_ib_cfg()
4223 ((u64) ppd->pkeys[2] << 32) | in qib_7322_set_ib_cfg()
4224 ((u64) ppd->pkeys[3] << 48); in qib_7322_set_ib_cfg()
4225 qib_write_kreg_port(ppd, krp_partitionkey, maskr); in qib_7322_set_ib_cfg()
4231 ppd->cpspec->ibcctrl_a &= in qib_7322_set_ib_cfg()
4234 ppd->cpspec->ibcctrl_a |= in qib_7322_set_ib_cfg()
4236 qib_write_kreg_port(ppd, krp_ibcctrl_a, ppd->cpspec->ibcctrl_a); in qib_7322_set_ib_cfg()
4248 val = (ppd->ibmaxlen >> 2) + 1; in qib_7322_set_ib_cfg()
4249 ppd->cpspec->ibcctrl_a &= ~SYM_MASK(IBCCtrlA_0, MaxPktLen); in qib_7322_set_ib_cfg()
4250 ppd->cpspec->ibcctrl_a |= (u64)val << in qib_7322_set_ib_cfg()
4252 qib_write_kreg_port(ppd, krp_ibcctrl_a, in qib_7322_set_ib_cfg()
4253 ppd->cpspec->ibcctrl_a); in qib_7322_set_ib_cfg()
4261 ppd->cpspec->ibmalfusesnap = 1; in qib_7322_set_ib_cfg()
4262 ppd->cpspec->ibmalfsnap = read_7322_creg32_port(ppd, in qib_7322_set_ib_cfg()
4264 if (!ppd->cpspec->ibdeltainprog && in qib_7322_set_ib_cfg()
4266 ppd->cpspec->ibdeltainprog = 1; in qib_7322_set_ib_cfg()
4267 ppd->cpspec->ibsymsnap = in qib_7322_set_ib_cfg()
4268 read_7322_creg32_port(ppd, in qib_7322_set_ib_cfg()
4270 ppd->cpspec->iblnkerrsnap = in qib_7322_set_ib_cfg()
4271 read_7322_creg32_port(ppd, in qib_7322_set_ib_cfg()
4278 if (ppd->cpspec->ibmalfusesnap) { in qib_7322_set_ib_cfg()
4279 ppd->cpspec->ibmalfusesnap = 0; in qib_7322_set_ib_cfg()
4280 ppd->cpspec->ibmalfdelta += in qib_7322_set_ib_cfg()
4281 read_7322_creg32_port(ppd, in qib_7322_set_ib_cfg()
4283 ppd->cpspec->ibmalfsnap; in qib_7322_set_ib_cfg()
4311 ppd->cpspec->chase_end = 0; in qib_7322_set_ib_cfg()
4316 if (ppd->cpspec->chase_timer.expires) { in qib_7322_set_ib_cfg()
4317 del_timer_sync(&ppd->cpspec->chase_timer); in qib_7322_set_ib_cfg()
4318 ppd->cpspec->chase_timer.expires = 0; in qib_7322_set_ib_cfg()
4328 qib_set_ib_7322_lstate(ppd, lcmd, licmd); in qib_7322_set_ib_cfg()
4332 if (ppd->vls_operational != val) { in qib_7322_set_ib_cfg()
4333 ppd->vls_operational = val; in qib_7322_set_ib_cfg()
4334 set_vls(ppd); in qib_7322_set_ib_cfg()
4339 qib_write_kreg_port(ppd, krp_highprio_limit, val); in qib_7322_set_ib_cfg()
4353 if (ppd->dd->cspec->r1) { in qib_7322_set_ib_cfg()
4354 cancel_delayed_work(&ppd->cpspec->ipg_work); in qib_7322_set_ib_cfg()
4355 ppd->cpspec->ipg_tries = 0; in qib_7322_set_ib_cfg()
4363 ppd->cpspec->ibcctrl_b &= ~(maskr << lsb); in qib_7322_set_ib_cfg()
4364 ppd->cpspec->ibcctrl_b |= (((u64) val & maskr) << lsb); in qib_7322_set_ib_cfg()
4365 qib_write_kreg_port(ppd, krp_ibcctrl_b, ppd->cpspec->ibcctrl_b); in qib_7322_set_ib_cfg()
4371 static int qib_7322_set_loopback(struct qib_pportdata *ppd, const char *what) in qib_7322_set_loopback() argument
4378 ppd->cpspec->ibcctrl_a |= SYM_MASK(IBCCtrlA_0, in qib_7322_set_loopback()
4381 qib_devinfo(ppd->dd->pcidev, "Enabling IB%u:%u IBC loopback\n", in qib_7322_set_loopback()
4382 ppd->dd->unit, ppd->port); in qib_7322_set_loopback()
4384 ppd->cpspec->ibcctrl_a &= ~SYM_MASK(IBCCtrlA_0, in qib_7322_set_loopback()
4388 qib_devinfo(ppd->dd->pcidev, in qib_7322_set_loopback()
4390 ppd->dd->unit, ppd->port); in qib_7322_set_loopback()
4394 qib_write_kreg_port(ppd, krp_ibcctrl_a, in qib_7322_set_loopback()
4395 ppd->cpspec->ibcctrl_a); in qib_7322_set_loopback()
4396 ctrlb = ppd->cpspec->ibcctrl_b & ~(IBA7322_IBC_HRTBT_MASK in qib_7322_set_loopback()
4398 ppd->cpspec->ibcctrl_b = ctrlb | val; in qib_7322_set_loopback()
4399 qib_write_kreg_port(ppd, krp_ibcctrl_b, in qib_7322_set_loopback()
4400 ppd->cpspec->ibcctrl_b); in qib_7322_set_loopback()
4401 qib_write_kreg(ppd->dd, kr_scratch, 0); in qib_7322_set_loopback()
4406 static void get_vl_weights(struct qib_pportdata *ppd, unsigned regno, in get_vl_weights() argument
4412 u32 val = qib_read_kreg_port(ppd, regno); in get_vl_weights()
4421 static void set_vl_weights(struct qib_pportdata *ppd, unsigned regno, in set_vl_weights() argument
4433 qib_write_kreg_port(ppd, regno, val); in set_vl_weights()
4435 if (!(ppd->p_sendctrl & SYM_MASK(SendCtrl_0, IBVLArbiterEn))) { in set_vl_weights()
4436 struct qib_devdata *dd = ppd->dd; in set_vl_weights()
4440 ppd->p_sendctrl |= SYM_MASK(SendCtrl_0, IBVLArbiterEn); in set_vl_weights()
4441 qib_write_kreg_port(ppd, krp_sendctrl, ppd->p_sendctrl); in set_vl_weights()
4447 static int qib_7322_get_ib_table(struct qib_pportdata *ppd, int which, void *t) in qib_7322_get_ib_table() argument
4451 get_vl_weights(ppd, krp_highprio_0, t); in qib_7322_get_ib_table()
4455 get_vl_weights(ppd, krp_lowprio_0, t); in qib_7322_get_ib_table()
4464 static int qib_7322_set_ib_table(struct qib_pportdata *ppd, int which, void *t) in qib_7322_set_ib_table() argument
4468 set_vl_weights(ppd, krp_highprio_0, t); in qib_7322_set_ib_table()
4472 set_vl_weights(ppd, krp_lowprio_0, t); in qib_7322_set_ib_table()
4533 static void rcvctrl_7322_mod(struct qib_pportdata *ppd, unsigned int op, in rcvctrl_7322_mod() argument
4536 struct qib_devdata *dd = ppd->dd; in rcvctrl_7322_mod()
4552 ppd->p_rcvctrl &= ~SYM_MASK(RcvCtrl_0, RcvPartitionKeyDisable); in rcvctrl_7322_mod()
4554 ppd->p_rcvctrl |= SYM_MASK(RcvCtrl_0, RcvPartitionKeyDisable); in rcvctrl_7322_mod()
4563 ppd->p_rcvctrl |= in rcvctrl_7322_mod()
4577 ppd->p_rcvctrl &= in rcvctrl_7322_mod()
4595 qib_write_kreg_port(ppd, krp_rcvctrl, ppd->p_rcvctrl); in rcvctrl_7322_mod()
4673 static void sendctrl_7322_mod(struct qib_pportdata *ppd, u32 op) in sendctrl_7322_mod() argument
4675 struct qib_devdata *dd = ppd->dd; in sendctrl_7322_mod()
4694 ppd->p_sendctrl &= ~SYM_MASK(SendCtrl_0, SendEnable); in sendctrl_7322_mod()
4696 ppd->p_sendctrl |= SYM_MASK(SendCtrl_0, SendEnable); in sendctrl_7322_mod()
4717 u64 tmp_ppd_sendctrl = ppd->p_sendctrl; in sendctrl_7322_mod()
4727 qib_write_kreg_port(ppd, krp_sendctrl, tmp_ppd_sendctrl); in sendctrl_7322_mod()
4747 qib_write_kreg_port(ppd, krp_sendctrl, ppd->p_sendctrl); in sendctrl_7322_mod()
4783 static u64 qib_portcntr_7322(struct qib_pportdata *ppd, u32 reg) in qib_portcntr_7322() argument
4785 struct qib_devdata *dd = ppd->dd; in qib_portcntr_7322()
4833 qib_devinfo(ppd->dd->pcidev, in qib_portcntr_7322()
4847 if (!rcd || rcd->ppd != ppd) in qib_portcntr_7322()
4862 ret = qib_read_kreg_port(ppd, creg); in qib_portcntr_7322()
4871 ret = read_7322_creg_port(ppd, creg); in qib_portcntr_7322()
4873 ret = read_7322_creg32_port(ppd, creg); in qib_portcntr_7322()
4875 if (ppd->cpspec->ibdeltainprog) in qib_portcntr_7322()
4876 ret -= ret - ppd->cpspec->ibsymsnap; in qib_portcntr_7322()
4877 ret -= ppd->cpspec->ibsymdelta; in qib_portcntr_7322()
4879 if (ppd->cpspec->ibdeltainprog) in qib_portcntr_7322()
4880 ret -= ret - ppd->cpspec->iblnkerrsnap; in qib_portcntr_7322()
4881 ret -= ppd->cpspec->iblnkerrdelta; in qib_portcntr_7322()
4883 ret -= ppd->cpspec->ibmalfdelta; in qib_portcntr_7322()
4885 ret += ppd->cpspec->iblnkdowndelta; in qib_portcntr_7322()
5126 struct qib_pportdata *ppd = &dd->pport[port]; in qib_read_7322portcntrs() local
5127 u64 *cntr = ppd->cpspec->portcntrs; in qib_read_7322portcntrs()
5139 *cntr++ = qib_portcntr_7322(ppd, in qib_read_7322portcntrs()
5143 *cntr++ = read_7322_creg_port(ppd, in qib_read_7322portcntrs()
5147 *cntr++ = read_7322_creg32_port(ppd, in qib_read_7322portcntrs()
5169 struct qib_pportdata *ppd; in qib_get_7322_faststats() local
5175 ppd = dd->pport + pidx; in qib_get_7322_faststats()
5182 if (!ppd->link_speed_supported || !(dd->flags & QIB_INITTED) in qib_get_7322_faststats()
5191 traffic_wds = qib_portcntr_7322(ppd, QIBPORTCNTR_WORDRCV) + in qib_get_7322_faststats()
5192 qib_portcntr_7322(ppd, QIBPORTCNTR_WORDSEND); in qib_get_7322_faststats()
5193 spin_lock_irqsave(&ppd->dd->eep_st_lock, flags); in qib_get_7322_faststats()
5194 traffic_wds -= ppd->dd->traffic_wds; in qib_get_7322_faststats()
5195 ppd->dd->traffic_wds += traffic_wds; in qib_get_7322_faststats()
5196 spin_unlock_irqrestore(&ppd->dd->eep_st_lock, flags); in qib_get_7322_faststats()
5197 if (ppd->cpspec->qdr_dfe_on && (ppd->link_speed_active & in qib_get_7322_faststats()
5199 (ppd->lflags & (QIBL_LINKINIT | QIBL_LINKARMED | in qib_get_7322_faststats()
5201 ppd->cpspec->qdr_dfe_time && in qib_get_7322_faststats()
5202 time_is_before_jiffies(ppd->cpspec->qdr_dfe_time)) { in qib_get_7322_faststats()
5203 ppd->cpspec->qdr_dfe_on = 0; in qib_get_7322_faststats()
5205 qib_write_kreg_port(ppd, krp_static_adapt_dis(2), in qib_get_7322_faststats()
5206 ppd->dd->cspec->r1 ? in qib_get_7322_faststats()
5209 force_h1(ppd); in qib_get_7322_faststats()
5240 static void qib_7322_mini_pcs_reset(struct qib_pportdata *ppd) in qib_7322_mini_pcs_reset() argument
5243 struct qib_devdata *dd = ppd->dd; in qib_7322_mini_pcs_reset()
5248 val = qib_read_kreg_port(ppd, krp_ib_pcsconfig); in qib_7322_mini_pcs_reset()
5251 qib_write_kreg_port(ppd, krp_ibcctrl_a, in qib_7322_mini_pcs_reset()
5252 ppd->cpspec->ibcctrl_a & in qib_7322_mini_pcs_reset()
5255 qib_write_kreg_port(ppd, krp_ib_pcsconfig, val | reset_bits); in qib_7322_mini_pcs_reset()
5257 qib_write_kreg_port(ppd, krp_ib_pcsconfig, val & ~reset_bits); in qib_7322_mini_pcs_reset()
5258 qib_write_kreg_port(ppd, krp_ibcctrl_a, ppd->cpspec->ibcctrl_a); in qib_7322_mini_pcs_reset()
5273 static void autoneg_7322_sendpkt(struct qib_pportdata *ppd, u32 *hdr, in autoneg_7322_sendpkt() argument
5280 struct qib_devdata *dd = ppd->dd; in autoneg_7322_sendpkt()
5284 control = qib_7322_setpbc_control(ppd, len, 0, 15); in autoneg_7322_sendpkt()
5286 while (!(piobuf = qib_7322_getsendbuf(ppd, pbc, &pnum))) { in autoneg_7322_sendpkt()
5312 static void qib_autoneg_7322_send(struct qib_pportdata *ppd, int which) in qib_autoneg_7322_send() argument
5314 struct qib_devdata *dd = ppd->dd; in qib_autoneg_7322_send()
5348 autoneg_7322_sendpkt(ppd, hdr, dcnt, data); in qib_autoneg_7322_send()
5351 autoneg_7322_sendpkt(ppd, hdr, dcnt, data); in qib_autoneg_7322_send()
5370 static void set_7322_ibspeed_fast(struct qib_pportdata *ppd, u32 speed) in set_7322_ibspeed_fast() argument
5374 newctrlb = ppd->cpspec->ibcctrl_b & ~(IBA7322_IBC_SPEED_MASK | in set_7322_ibspeed_fast()
5388 if (newctrlb == ppd->cpspec->ibcctrl_b) in set_7322_ibspeed_fast()
5391 ppd->cpspec->ibcctrl_b = newctrlb; in set_7322_ibspeed_fast()
5392 qib_write_kreg_port(ppd, krp_ibcctrl_b, ppd->cpspec->ibcctrl_b); in set_7322_ibspeed_fast()
5393 qib_write_kreg(ppd->dd, kr_scratch, 0); in set_7322_ibspeed_fast()
5402 static void try_7322_autoneg(struct qib_pportdata *ppd) in try_7322_autoneg() argument
5406 spin_lock_irqsave(&ppd->lflags_lock, flags); in try_7322_autoneg()
5407 ppd->lflags |= QIBL_IB_AUTONEG_INPROG; in try_7322_autoneg()
5408 spin_unlock_irqrestore(&ppd->lflags_lock, flags); in try_7322_autoneg()
5409 qib_autoneg_7322_send(ppd, 0); in try_7322_autoneg()
5410 set_7322_ibspeed_fast(ppd, QIB_IB_DDR); in try_7322_autoneg()
5411 qib_7322_mini_pcs_reset(ppd); in try_7322_autoneg()
5413 queue_delayed_work(ib_wq, &ppd->cpspec->autoneg_work, in try_7322_autoneg()
5423 struct qib_pportdata *ppd; in autoneg_7322_work() local
5429 ppd = container_of(work, struct qib_chippport_specific, in autoneg_7322_work()
5430 autoneg_work.work)->ppd; in autoneg_7322_work()
5431 dd = ppd->dd; in autoneg_7322_work()
5440 if (SYM_FIELD(ppd->lastibcstat, IBCStatusA_0, LinkState) in autoneg_7322_work()
5442 qib_set_linkstate(ppd, QIB_IB_LINKDOWN_DISABLE); in autoneg_7322_work()
5448 if (!(ppd->lflags & QIBL_IB_AUTONEG_INPROG)) in autoneg_7322_work()
5452 if (wait_event_timeout(ppd->cpspec->autoneg_wait, in autoneg_7322_work()
5453 !(ppd->lflags & QIBL_IB_AUTONEG_INPROG), in autoneg_7322_work()
5456 qib_7322_mini_pcs_reset(ppd); in autoneg_7322_work()
5459 if (wait_event_timeout(ppd->cpspec->autoneg_wait, in autoneg_7322_work()
5460 !(ppd->lflags & QIBL_IB_AUTONEG_INPROG), in autoneg_7322_work()
5463 qib_7322_mini_pcs_reset(ppd); in autoneg_7322_work()
5465 set_7322_ibspeed_fast(ppd, QIB_IB_SDR); in autoneg_7322_work()
5471 wait_event_timeout(ppd->cpspec->autoneg_wait, in autoneg_7322_work()
5472 !(ppd->lflags & QIBL_IB_AUTONEG_INPROG), in autoneg_7322_work()
5475 if (ppd->lflags & QIBL_IB_AUTONEG_INPROG) { in autoneg_7322_work()
5476 spin_lock_irqsave(&ppd->lflags_lock, flags); in autoneg_7322_work()
5477 ppd->lflags &= ~QIBL_IB_AUTONEG_INPROG; in autoneg_7322_work()
5478 if (ppd->cpspec->autoneg_tries == AUTONEG_TRIES) { in autoneg_7322_work()
5479 ppd->lflags |= QIBL_IB_AUTONEG_FAILED; in autoneg_7322_work()
5480 ppd->cpspec->autoneg_tries = 0; in autoneg_7322_work()
5482 spin_unlock_irqrestore(&ppd->lflags_lock, flags); in autoneg_7322_work()
5483 set_7322_ibspeed_fast(ppd, ppd->link_speed_enabled); in autoneg_7322_work()
5491 static void try_7322_ipg(struct qib_pportdata *ppd) in try_7322_ipg() argument
5493 struct qib_ibport *ibp = &ppd->ibport_data; in try_7322_ipg()
5540 delay = 2 << ppd->cpspec->ipg_tries; in try_7322_ipg()
5541 queue_delayed_work(ib_wq, &ppd->cpspec->ipg_work, in try_7322_ipg()
5551 struct qib_pportdata *ppd; in ipg_7322_work() local
5553 ppd = container_of(work, struct qib_chippport_specific, in ipg_7322_work()
5554 ipg_work.work)->ppd; in ipg_7322_work()
5555 if ((ppd->lflags & (QIBL_LINKINIT | QIBL_LINKARMED | QIBL_LINKACTIVE)) in ipg_7322_work()
5556 && ++ppd->cpspec->ipg_tries <= 10) in ipg_7322_work()
5557 try_7322_ipg(ppd); in ipg_7322_work()
5591 static int qib_7322_ib_updown(struct qib_pportdata *ppd, int ibup, u64 ibcs) in qib_7322_ib_updown() argument
5597 spin_lock_irqsave(&ppd->lflags_lock, flags); in qib_7322_ib_updown()
5598 ppd->lflags &= ~QIBL_IB_FORCE_NOTIFY; in qib_7322_ib_updown()
5599 spin_unlock_irqrestore(&ppd->lflags_lock, flags); in qib_7322_ib_updown()
5603 ppd->link_speed_active = QIB_IB_QDR; in qib_7322_ib_updown()
5606 ppd->link_speed_active = QIB_IB_DDR; in qib_7322_ib_updown()
5609 ppd->link_speed_active = QIB_IB_SDR; in qib_7322_ib_updown()
5613 ppd->link_width_active = IB_WIDTH_4X; in qib_7322_ib_updown()
5616 ppd->link_width_active = IB_WIDTH_1X; in qib_7322_ib_updown()
5617 ppd->delay_mult = ib_rate_to_delay[mult_to_ib_rate(mult)]; in qib_7322_ib_updown()
5624 ppd->cpspec->ipg_tries = 0; in qib_7322_ib_updown()
5625 clr = qib_read_kreg_port(ppd, krp_ibcstatus_b) & in qib_7322_ib_updown()
5629 qib_write_kreg_port(ppd, krp_ibcstatus_b, clr); in qib_7322_ib_updown()
5630 if (!(ppd->lflags & (QIBL_IB_AUTONEG_FAILED | in qib_7322_ib_updown()
5632 set_7322_ibspeed_fast(ppd, ppd->link_speed_enabled); in qib_7322_ib_updown()
5633 if (!(ppd->lflags & QIBL_IB_AUTONEG_INPROG)) { in qib_7322_ib_updown()
5635 &ppd->cpspec->qsfp_data; in qib_7322_ib_updown()
5637 qib_write_kreg_port(ppd, krp_tx_deemph_override, in qib_7322_ib_updown()
5640 qib_cancel_sends(ppd); in qib_7322_ib_updown()
5642 qib_7322_mini_pcs_reset(ppd); in qib_7322_ib_updown()
5645 if (ppd->dd->flags & QIB_HAS_QSFP) { in qib_7322_ib_updown()
5649 spin_lock_irqsave(&ppd->sdma_lock, flags); in qib_7322_ib_updown()
5650 if (__qib_sdma_running(ppd)) in qib_7322_ib_updown()
5651 __qib_sdma_process_event(ppd, in qib_7322_ib_updown()
5653 spin_unlock_irqrestore(&ppd->sdma_lock, flags); in qib_7322_ib_updown()
5655 clr = read_7322_creg32_port(ppd, crp_iblinkdown); in qib_7322_ib_updown()
5656 if (clr == ppd->cpspec->iblnkdownsnap) in qib_7322_ib_updown()
5657 ppd->cpspec->iblnkdowndelta++; in qib_7322_ib_updown()
5660 !(ppd->lflags & (QIBL_IB_AUTONEG_FAILED | in qib_7322_ib_updown()
5662 ppd->link_speed_active == QIB_IB_SDR && in qib_7322_ib_updown()
5663 (ppd->link_speed_enabled & QIB_IB_DDR) in qib_7322_ib_updown()
5664 && ppd->cpspec->autoneg_tries < AUTONEG_TRIES) { in qib_7322_ib_updown()
5666 ++ppd->cpspec->autoneg_tries; in qib_7322_ib_updown()
5667 if (!ppd->cpspec->ibdeltainprog) { in qib_7322_ib_updown()
5668 ppd->cpspec->ibdeltainprog = 1; in qib_7322_ib_updown()
5669 ppd->cpspec->ibsymdelta += in qib_7322_ib_updown()
5670 read_7322_creg32_port(ppd, in qib_7322_ib_updown()
5672 ppd->cpspec->ibsymsnap; in qib_7322_ib_updown()
5673 ppd->cpspec->iblnkerrdelta += in qib_7322_ib_updown()
5674 read_7322_creg32_port(ppd, in qib_7322_ib_updown()
5676 ppd->cpspec->iblnkerrsnap; in qib_7322_ib_updown()
5678 try_7322_autoneg(ppd); in qib_7322_ib_updown()
5680 } else if ((ppd->lflags & QIBL_IB_AUTONEG_INPROG) && in qib_7322_ib_updown()
5681 ppd->link_speed_active == QIB_IB_SDR) { in qib_7322_ib_updown()
5682 qib_autoneg_7322_send(ppd, 1); in qib_7322_ib_updown()
5683 set_7322_ibspeed_fast(ppd, QIB_IB_DDR); in qib_7322_ib_updown()
5684 qib_7322_mini_pcs_reset(ppd); in qib_7322_ib_updown()
5687 } else if ((ppd->lflags & QIBL_IB_AUTONEG_INPROG) && in qib_7322_ib_updown()
5688 (ppd->link_speed_active & QIB_IB_DDR)) { in qib_7322_ib_updown()
5689 spin_lock_irqsave(&ppd->lflags_lock, flags); in qib_7322_ib_updown()
5690 ppd->lflags &= ~(QIBL_IB_AUTONEG_INPROG | in qib_7322_ib_updown()
5692 spin_unlock_irqrestore(&ppd->lflags_lock, flags); in qib_7322_ib_updown()
5693 ppd->cpspec->autoneg_tries = 0; in qib_7322_ib_updown()
5695 set_7322_ibspeed_fast(ppd, ppd->link_speed_enabled); in qib_7322_ib_updown()
5696 wake_up(&ppd->cpspec->autoneg_wait); in qib_7322_ib_updown()
5698 } else if (ppd->lflags & QIBL_IB_AUTONEG_FAILED) { in qib_7322_ib_updown()
5705 spin_lock_irqsave(&ppd->lflags_lock, flags); in qib_7322_ib_updown()
5706 ppd->lflags &= ~QIBL_IB_AUTONEG_FAILED; in qib_7322_ib_updown()
5707 spin_unlock_irqrestore(&ppd->lflags_lock, flags); in qib_7322_ib_updown()
5708 ppd->cpspec->ibcctrl_b |= IBA7322_IBC_IBTA_1_2_MASK; in qib_7322_ib_updown()
5711 if (!(ppd->lflags & QIBL_IB_AUTONEG_INPROG)) { in qib_7322_ib_updown()
5713 if (ppd->dd->cspec->r1 && ppd->cpspec->ipg_tries <= 10) in qib_7322_ib_updown()
5714 try_7322_ipg(ppd); in qib_7322_ib_updown()
5715 if (!ppd->cpspec->recovery_init) in qib_7322_ib_updown()
5716 setup_7322_link_recovery(ppd, 0); in qib_7322_ib_updown()
5717 ppd->cpspec->qdr_dfe_time = jiffies + in qib_7322_ib_updown()
5720 ppd->cpspec->ibmalfusesnap = 0; in qib_7322_ib_updown()
5721 ppd->cpspec->ibmalfsnap = read_7322_creg32_port(ppd, in qib_7322_ib_updown()
5725 ppd->cpspec->iblnkdownsnap = in qib_7322_ib_updown()
5726 read_7322_creg32_port(ppd, crp_iblinkdown); in qib_7322_ib_updown()
5727 if (ppd->cpspec->ibdeltainprog) { in qib_7322_ib_updown()
5728 ppd->cpspec->ibdeltainprog = 0; in qib_7322_ib_updown()
5729 ppd->cpspec->ibsymdelta += read_7322_creg32_port(ppd, in qib_7322_ib_updown()
5730 crp_ibsymbolerr) - ppd->cpspec->ibsymsnap; in qib_7322_ib_updown()
5731 ppd->cpspec->iblnkerrdelta += read_7322_creg32_port(ppd, in qib_7322_ib_updown()
5732 crp_iblinkerrrecov) - ppd->cpspec->iblnkerrsnap; in qib_7322_ib_updown()
5735 !ppd->cpspec->ibdeltainprog && in qib_7322_ib_updown()
5736 !(ppd->lflags & QIBL_IB_AUTONEG_INPROG)) { in qib_7322_ib_updown()
5737 ppd->cpspec->ibdeltainprog = 1; in qib_7322_ib_updown()
5738 ppd->cpspec->ibsymsnap = read_7322_creg32_port(ppd, in qib_7322_ib_updown()
5740 ppd->cpspec->iblnkerrsnap = read_7322_creg32_port(ppd, in qib_7322_ib_updown()
5745 qib_setup_7322_setextled(ppd, ibup); in qib_7322_ib_updown()
5904 struct qib_pportdata *ppd = NULL; in sendctrl_hook() local
5917 ppd = dd->pport + pidx; in sendctrl_hook()
5918 if (!ppd->cpspec->kpregbase) in sendctrl_hook()
5921 psptr = ppd->cpspec->kpregbase + krp_sendctrl; in sendctrl_hook()
5929 ppd = NULL; in sendctrl_hook()
5939 if (!ppd || (mask & all_bits) != all_bits) { in sendctrl_hook()
5964 if (ppd) { in sendctrl_hook()
5965 sval = ppd->p_sendctrl & ~mask; in sendctrl_hook()
5967 ppd->p_sendctrl = sval; in sendctrl_hook()
5993 static void init_txdds_table(struct qib_pportdata *ppd, int override);
5998 struct qib_pportdata *ppd; in qsfp_7322_event() local
6005 ppd = qd->ppd; in qsfp_7322_event()
6012 if (!qib_qsfp_mod_present(ppd)) { in qsfp_7322_event()
6013 ppd->cpspec->qsfp_data.modpresent = 0; in qsfp_7322_event()
6015 qib_set_ib_7322_lstate(ppd, 0, in qsfp_7322_event()
6017 spin_lock_irqsave(&ppd->lflags_lock, flags); in qsfp_7322_event()
6018 ppd->lflags &= ~QIBL_LINKV; in qsfp_7322_event()
6019 spin_unlock_irqrestore(&ppd->lflags_lock, flags); in qsfp_7322_event()
6032 ret = qib_refresh_qsfp_cache(ppd, &qd->cache); in qsfp_7322_event()
6040 if (!ret && !ppd->dd->cspec->r1) { in qsfp_7322_event()
6050 ibsd_wr_allchans(ppd, 13, (le2 << 7), BMASK(9, 7)); in qsfp_7322_event()
6057 init_txdds_table(ppd, 0); in qsfp_7322_event()
6062 if (!ppd->cpspec->qsfp_data.modpresent && in qsfp_7322_event()
6063 (ppd->lflags & (QIBL_LINKV | QIBL_IB_LINK_DISABLED))) { in qsfp_7322_event()
6064 ppd->cpspec->qsfp_data.modpresent = 1; in qsfp_7322_event()
6065 qib_set_ib_7322_lstate(ppd, 0, in qsfp_7322_event()
6067 spin_lock_irqsave(&ppd->lflags_lock, flags); in qsfp_7322_event()
6068 ppd->lflags |= QIBL_LINKV; in qsfp_7322_event()
6069 spin_unlock_irqrestore(&ppd->lflags_lock, flags); in qsfp_7322_event()
6078 static void qib_init_7322_qsfp(struct qib_pportdata *ppd) in qib_init_7322_qsfp() argument
6081 struct qib_qsfp_data *qd = &ppd->cpspec->qsfp_data; in qib_init_7322_qsfp()
6082 struct qib_devdata *dd = ppd->dd; in qib_init_7322_qsfp()
6085 mod_prs_bit <<= (QSFP_GPIO_PORT2_SHIFT * ppd->hw_pidx); in qib_init_7322_qsfp()
6086 qd->ppd = ppd; in qib_init_7322_qsfp()
6165 struct qib_pportdata *ppd = &dd->pport[pidx]; in set_no_qsfp_atten() local
6167 if (ppd->port != port || !ppd->link_speed_supported) in set_no_qsfp_atten()
6169 ppd->cpspec->no_eep = val; in set_no_qsfp_atten()
6171 ppd->cpspec->h1_val = h1; in set_no_qsfp_atten()
6173 init_txdds_table(ppd, 1); in set_no_qsfp_atten()
6178 qib_set_ib_7322_lstate(ppd, 0, in set_no_qsfp_atten()
6263 struct qib_pportdata *ppd = dd->pport + n; in qib_late_7322_initreg() local
6265 qib_write_kreg_port(ppd, krp_senddmaprioritythld, in qib_late_7322_initreg()
6269 qib_init_7322_qsfp(ppd); in qib_late_7322_initreg()
6291 static void write_7322_init_portregs(struct qib_pportdata *ppd) in write_7322_init_portregs() argument
6296 if (!ppd->link_speed_supported) { in write_7322_init_portregs()
6299 qib_write_kreg_port(ppd, krp_rxcreditvl0 + i, 0); in write_7322_init_portregs()
6300 qib_write_kreg_port(ppd, krp_ibcctrl_b, 0); in write_7322_init_portregs()
6301 qib_write_kreg(ppd->dd, kr_scratch, 0); in write_7322_init_portregs()
6309 val = qib_read_kreg_port(ppd, krp_ibsdtestiftx); in write_7322_init_portregs()
6311 val |= (u64)(ppd->vls_supported - 1) << in write_7322_init_portregs()
6313 qib_write_kreg_port(ppd, krp_ibsdtestiftx, val); in write_7322_init_portregs()
6315 qib_write_kreg_port(ppd, krp_rcvbthqp, QIB_KD_QP); in write_7322_init_portregs()
6318 qib_write_kreg_port(ppd, krp_sendcheckcontrol, IBA7322_SENDCHK_PKEY | in write_7322_init_portregs()
6322 qib_write_kreg_port(ppd, krp_ncmodectrl, in write_7322_init_portregs()
6329 qib_write_kreg_port(ppd, krp_senddmabufmask0, 0); in write_7322_init_portregs()
6330 qib_write_kreg_port(ppd, krp_senddmabufmask1, 0); in write_7322_init_portregs()
6331 qib_write_kreg_port(ppd, krp_senddmabufmask2, 0); in write_7322_init_portregs()
6332 if (ppd->dd->cspec->r1) in write_7322_init_portregs()
6333 ppd->p_sendctrl |= SYM_MASK(SendCtrl_0, ForceCreditUpToDate); in write_7322_init_portregs()
6345 struct qib_pportdata *ppd; in write_7322_initregs() local
6360 ppd = &dd->pport[pidx]; in write_7322_initregs()
6364 ppd->p_rcvctrl |= SYM_MASK(RcvCtrl_0, RcvQPMapEnable); in write_7322_initregs()
6382 ctxt = ppd->hw_pidx; in write_7322_initregs()
6386 qib_write_kreg_port(ppd, regno, val); in write_7322_initregs()
6391 qib_write_kreg_port(ppd, regno, val); in write_7322_initregs()
6429 struct qib_pportdata *ppd; in qib_init_7322_variables() local
6436 ppd = (struct qib_pportdata *)(dd + 1); in qib_init_7322_variables()
6437 dd->pport = ppd; in qib_init_7322_variables()
6438 ppd[0].dd = dd; in qib_init_7322_variables()
6439 ppd[1].dd = dd; in qib_init_7322_variables()
6441 dd->cspec = (struct qib_chip_specific *)(ppd + 2); in qib_init_7322_variables()
6443 ppd[0].cpspec = (struct qib_chippport_specific *)(dd->cspec + 1); in qib_init_7322_variables()
6444 ppd[1].cpspec = &ppd[0].cpspec[1]; in qib_init_7322_variables()
6445 ppd[0].cpspec->ppd = &ppd[0]; /* for autoneg_7322_work() */ in qib_init_7322_variables()
6446 ppd[1].cpspec->ppd = &ppd[1]; /* for autoneg_7322_work() */ in qib_init_7322_variables()
6486 ppd = dd->pport; in qib_init_7322_variables()
6524 struct qib_chippport_specific *cp = ppd->cpspec; in qib_init_7322_variables()
6526 ppd->link_speed_supported = features & PORT_SPD_CAP; in qib_init_7322_variables()
6528 if (!ppd->link_speed_supported) { in qib_init_7322_variables()
6533 qib_write_kreg_port(ppd, krp_rcvctrl, 0); in qib_init_7322_variables()
6534 qib_write_kreg_port(ppd, krp_ibcctrl_a, 0); in qib_init_7322_variables()
6535 ppd[0] = ppd[1]; in qib_init_7322_variables()
6549 qib_write_kreg_port(ppd, krp_rcvctrl, 0); in qib_init_7322_variables()
6550 qib_write_kreg_port(ppd, krp_ibcctrl_a, 0); in qib_init_7322_variables()
6567 ret = qib_init_pportdata(ppd, dd, pidx, dd->num_pports); in qib_init_7322_variables()
6573 ppd->link_width_supported = IB_WIDTH_1X | IB_WIDTH_4X; in qib_init_7322_variables()
6574 ppd->link_width_enabled = IB_WIDTH_4X; in qib_init_7322_variables()
6575 ppd->link_speed_enabled = ppd->link_speed_supported; in qib_init_7322_variables()
6580 ppd->link_width_active = IB_WIDTH_4X; in qib_init_7322_variables()
6581 ppd->link_speed_active = QIB_IB_SDR; in qib_init_7322_variables()
6582 ppd->delay_mult = ib_rate_to_delay[IB_RATE_10_GBPS]; in qib_init_7322_variables()
6585 ppd->vls_supported = IB_VL_VL0; in qib_init_7322_variables()
6588 ppd->vls_supported = IB_VL_VL0_1; in qib_init_7322_variables()
6597 ppd->vls_supported = IB_VL_VL0_3; in qib_init_7322_variables()
6601 ppd->vls_supported = IB_VL_VL0_7; in qib_init_7322_variables()
6606 ppd->vls_supported = IB_VL_VL0_3; in qib_init_7322_variables()
6611 ppd->vls_operational = ppd->vls_supported; in qib_init_7322_variables()
6616 if (ppd->dd->cspec->r1) in qib_init_7322_variables()
6628 dd->unit, ppd->port); in qib_init_7322_variables()
6634 ppd->cpspec->no_eep = IS_QMH(dd) ? in qib_init_7322_variables()
6641 write_7322_init_portregs(ppd); in qib_init_7322_variables()
6645 cp->chase_timer.data = (unsigned long)ppd; in qib_init_7322_variables()
6647 ppd++; in qib_init_7322_variables()
6769 static u32 __iomem *qib_7322_getsendbuf(struct qib_pportdata *ppd, u64 pbc, in qib_7322_getsendbuf() argument
6773 struct qib_devdata *dd = ppd->dd; in qib_7322_getsendbuf()
6777 first = dd->piobcnt2k + dd->piobcnt4k + ppd->hw_pidx; in qib_7322_getsendbuf()
6789 static void qib_set_cntr_7322_sample(struct qib_pportdata *ppd, u32 intv, in qib_set_cntr_7322_sample() argument
6792 qib_write_kreg_port(ppd, krp_psinterval, intv); in qib_set_cntr_7322_sample()
6793 qib_write_kreg_port(ppd, krp_psstart, start); in qib_set_cntr_7322_sample()
6799 static void qib_sdma_set_7322_desc_cnt(struct qib_pportdata *ppd, unsigned cnt) in qib_sdma_set_7322_desc_cnt() argument
6801 qib_write_kreg_port(ppd, krp_senddmadesccnt, cnt); in qib_sdma_set_7322_desc_cnt()
6807 static void dump_sdma_7322_state(struct qib_pportdata *ppd) in dump_sdma_7322_state() argument
6811 reg = qib_read_kreg_port(ppd, krp_senddmastatus); in dump_sdma_7322_state()
6812 qib_dev_porterr(ppd->dd, ppd->port, in dump_sdma_7322_state()
6815 reg = qib_read_kreg_port(ppd, krp_sendctrl); in dump_sdma_7322_state()
6816 qib_dev_porterr(ppd->dd, ppd->port, in dump_sdma_7322_state()
6819 reg = qib_read_kreg_port(ppd, krp_senddmabase); in dump_sdma_7322_state()
6820 qib_dev_porterr(ppd->dd, ppd->port, in dump_sdma_7322_state()
6823 reg = qib_read_kreg_port(ppd, krp_senddmabufmask0); in dump_sdma_7322_state()
6824 reg1 = qib_read_kreg_port(ppd, krp_senddmabufmask1); in dump_sdma_7322_state()
6825 reg2 = qib_read_kreg_port(ppd, krp_senddmabufmask2); in dump_sdma_7322_state()
6826 qib_dev_porterr(ppd->dd, ppd->port, in dump_sdma_7322_state()
6831 reg = qib_read_kreg_port(ppd, krp_senddmabuf_use0); in dump_sdma_7322_state()
6832 qib_write_kreg_port(ppd, krp_senddmabuf_use0, reg); in dump_sdma_7322_state()
6833 reg1 = qib_read_kreg_port(ppd, krp_senddmabuf_use1); in dump_sdma_7322_state()
6834 qib_write_kreg_port(ppd, krp_senddmabuf_use0, reg1); in dump_sdma_7322_state()
6835 reg2 = qib_read_kreg_port(ppd, krp_senddmabuf_use2); in dump_sdma_7322_state()
6836 qib_write_kreg_port(ppd, krp_senddmabuf_use0, reg2); in dump_sdma_7322_state()
6838 qib_dev_porterr(ppd->dd, ppd->port, in dump_sdma_7322_state()
6841 reg = qib_read_kreg_port(ppd, krp_senddmabuf_use0); in dump_sdma_7322_state()
6842 reg1 = qib_read_kreg_port(ppd, krp_senddmabuf_use1); in dump_sdma_7322_state()
6843 reg2 = qib_read_kreg_port(ppd, krp_senddmabuf_use2); in dump_sdma_7322_state()
6845 qib_dev_porterr(ppd->dd, ppd->port, in dump_sdma_7322_state()
6849 reg = qib_read_kreg_port(ppd, krp_senddmatail); in dump_sdma_7322_state()
6850 qib_dev_porterr(ppd->dd, ppd->port, in dump_sdma_7322_state()
6853 reg = qib_read_kreg_port(ppd, krp_senddmahead); in dump_sdma_7322_state()
6854 qib_dev_porterr(ppd->dd, ppd->port, in dump_sdma_7322_state()
6857 reg = qib_read_kreg_port(ppd, krp_senddmaheadaddr); in dump_sdma_7322_state()
6858 qib_dev_porterr(ppd->dd, ppd->port, in dump_sdma_7322_state()
6861 reg = qib_read_kreg_port(ppd, krp_senddmalengen); in dump_sdma_7322_state()
6862 qib_dev_porterr(ppd->dd, ppd->port, in dump_sdma_7322_state()
6865 reg = qib_read_kreg_port(ppd, krp_senddmadesccnt); in dump_sdma_7322_state()
6866 qib_dev_porterr(ppd->dd, ppd->port, in dump_sdma_7322_state()
6869 reg = qib_read_kreg_port(ppd, krp_senddmaidlecnt); in dump_sdma_7322_state()
6870 qib_dev_porterr(ppd->dd, ppd->port, in dump_sdma_7322_state()
6873 reg = qib_read_kreg_port(ppd, krp_senddmaprioritythld); in dump_sdma_7322_state()
6874 qib_dev_porterr(ppd->dd, ppd->port, in dump_sdma_7322_state()
6877 reg = qib_read_kreg_port(ppd, krp_senddmareloadcnt); in dump_sdma_7322_state()
6878 qib_dev_porterr(ppd->dd, ppd->port, in dump_sdma_7322_state()
6881 dump_sdma_state(ppd); in dump_sdma_7322_state()
6931 static void qib_7322_sdma_init_early(struct qib_pportdata *ppd) in qib_7322_sdma_init_early() argument
6933 ppd->sdma_state.set_state_action = sdma_7322_action_table; in qib_7322_sdma_init_early()
6936 static int init_sdma_7322_regs(struct qib_pportdata *ppd) in init_sdma_7322_regs() argument
6938 struct qib_devdata *dd = ppd->dd; in init_sdma_7322_regs()
6943 qib_write_kreg_port(ppd, krp_senddmabase, ppd->sdma_descq_phys); in init_sdma_7322_regs()
6944 qib_sdma_7322_setlengen(ppd); in init_sdma_7322_regs()
6945 qib_sdma_update_7322_tail(ppd, 0); /* Set SendDmaTail */ in init_sdma_7322_regs()
6946 qib_write_kreg_port(ppd, krp_senddmareloadcnt, sdma_idle_cnt); in init_sdma_7322_regs()
6947 qib_write_kreg_port(ppd, krp_senddmadesccnt, 0); in init_sdma_7322_regs()
6948 qib_write_kreg_port(ppd, krp_senddmaheadaddr, ppd->sdma_head_phys); in init_sdma_7322_regs()
6955 ((dd->num_pports == 1 || ppd->port == 2) ? n : in init_sdma_7322_regs()
6959 ppd->sdma_state.first_sendbuf = erstbuf; in init_sdma_7322_regs()
6960 ppd->sdma_state.last_sendbuf = lastbuf; in init_sdma_7322_regs()
6968 qib_write_kreg_port(ppd, krp_senddmabufmask0, senddmabufmask[0]); in init_sdma_7322_regs()
6969 qib_write_kreg_port(ppd, krp_senddmabufmask1, senddmabufmask[1]); in init_sdma_7322_regs()
6970 qib_write_kreg_port(ppd, krp_senddmabufmask2, senddmabufmask[2]); in init_sdma_7322_regs()
6975 static u16 qib_sdma_7322_gethead(struct qib_pportdata *ppd) in qib_sdma_7322_gethead() argument
6977 struct qib_devdata *dd = ppd->dd; in qib_sdma_7322_gethead()
6985 use_dmahead = __qib_sdma_running(ppd) && in qib_sdma_7322_gethead()
6989 (u16) le64_to_cpu(*ppd->sdma_head_dma) : in qib_sdma_7322_gethead()
6990 (u16) qib_read_kreg_port(ppd, krp_senddmahead); in qib_sdma_7322_gethead()
6992 swhead = ppd->sdma_descq_head; in qib_sdma_7322_gethead()
6993 swtail = ppd->sdma_descq_tail; in qib_sdma_7322_gethead()
6994 cnt = ppd->sdma_descq_cnt; in qib_sdma_7322_gethead()
7020 static int qib_sdma_7322_busy(struct qib_pportdata *ppd) in qib_sdma_7322_busy() argument
7022 u64 hwstatus = qib_read_kreg_port(ppd, krp_senddmastatus); in qib_sdma_7322_busy()
7036 static u32 qib_7322_setpbc_control(struct qib_pportdata *ppd, u32 plen, in qib_7322_setpbc_control() argument
7039 u8 snd_mult = ppd->delay_mult; in qib_7322_setpbc_control()
7050 ret |= ((u32)(ppd->hw_pidx)) << PBC_PORT_SEL_LSB; in qib_7322_setpbc_control()
7412 static void set_txdds(struct qib_pportdata *ppd, int ridx, in set_txdds() argument
7415 struct qib_devdata *dd = ppd->dd; in set_txdds()
7426 if (ppd->hw_pidx) in set_txdds()
7435 qib_write_kreg(ppd->dd, kr_scratch, 0); in set_txdds()
7683 static void find_best_ent(struct qib_pportdata *ppd, in find_best_ent() argument
7688 struct qib_qsfp_cache *qd = &ppd->cpspec->qsfp_data.cache; in find_best_ent()
7708 *sdr_dds = txdds_sdr + ppd->dd->board_atten; in find_best_ent()
7709 *ddr_dds = txdds_ddr + ppd->dd->board_atten; in find_best_ent()
7710 *qdr_dds = txdds_qdr + ppd->dd->board_atten; in find_best_ent()
7720 } else if (ppd->cpspec->no_eep < TXDDS_TABLE_SZ) { in find_best_ent()
7727 idx = ppd->cpspec->no_eep; in find_best_ent()
7731 } else if (ppd->cpspec->no_eep < (TXDDS_TABLE_SZ + TXDDS_EXTRA_SZ)) { in find_best_ent()
7733 idx = ppd->cpspec->no_eep - TXDDS_TABLE_SZ; in find_best_ent()
7737 } else if ((IS_QME(ppd->dd) || IS_QMH(ppd->dd)) && in find_best_ent()
7738 ppd->cpspec->no_eep < (TXDDS_TABLE_SZ + TXDDS_EXTRA_SZ + in find_best_ent()
7740 idx = ppd->cpspec->no_eep - (TXDDS_TABLE_SZ + TXDDS_EXTRA_SZ); in find_best_ent()
7742 ppd->dd->unit, ppd->port, idx); in find_best_ent()
7754 static void init_txdds_table(struct qib_pportdata *ppd, int override) in init_txdds_table() argument
7761 find_best_ent(ppd, &sdr_dds, &ddr_dds, &qdr_dds, override); in init_txdds_table()
7764 if (!(ppd->dd->flags & QIB_HAS_QSFP) || override) in init_txdds_table()
7768 set_txdds(ppd, 0, sdr_dds); in init_txdds_table()
7769 set_txdds(ppd, TXDDS_TABLE_SZ, ddr_dds); in init_txdds_table()
7770 set_txdds(ppd, 2 * TXDDS_TABLE_SZ, qdr_dds); in init_txdds_table()
7771 if (ppd->lflags & (QIBL_LINKINIT | QIBL_LINKARMED | in init_txdds_table()
7773 dds = (struct txdds_ent *)(ppd->link_speed_active == in init_txdds_table()
7775 (ppd->link_speed_active == in init_txdds_table()
7777 write_tx_serdes_param(ppd, dds); in init_txdds_table()
7782 set_txdds(ppd, idx, single_ent ? sdr_dds : txdds_sdr + idx); in init_txdds_table()
7783 set_txdds(ppd, idx + TXDDS_TABLE_SZ, in init_txdds_table()
7785 set_txdds(ppd, idx + 2 * TXDDS_TABLE_SZ, in init_txdds_table()
7875 static void ibsd_wr_allchans(struct qib_pportdata *ppd, int addr, unsigned data, in ibsd_wr_allchans() argument
7878 struct qib_devdata *dd = ppd->dd; in ibsd_wr_allchans()
7883 ahb_mod(dd, IBSD(ppd->hw_pidx), (chan + (chan >> 1)), addr, in ibsd_wr_allchans()
7885 rbc = ahb_mod(dd, IBSD(ppd->hw_pidx), (chan + (chan >> 1)), in ibsd_wr_allchans()
7890 static void serdes_7322_los_enable(struct qib_pportdata *ppd, int enable) in serdes_7322_los_enable() argument
7892 u64 data = qib_read_kreg_port(ppd, krp_serdesctrl); in serdes_7322_los_enable()
7897 ppd->dd->unit, ppd->port); in serdes_7322_los_enable()
7901 ppd->dd->unit, ppd->port); in serdes_7322_los_enable()
7904 qib_write_kreg_port(ppd, krp_serdesctrl, data); in serdes_7322_los_enable()
7907 static int serdes_7322_init(struct qib_pportdata *ppd) in serdes_7322_init() argument
7911 if (ppd->dd->cspec->r1) in serdes_7322_init()
7912 ret = serdes_7322_init_old(ppd); in serdes_7322_init()
7914 ret = serdes_7322_init_new(ppd); in serdes_7322_init()
7918 static int serdes_7322_init_old(struct qib_pportdata *ppd) in serdes_7322_init_old() argument
7926 init_txdds_table(ppd, 0); in serdes_7322_init_old()
7929 qib_write_kreg_port(ppd, krp_tx_deemph_override, in serdes_7322_init_old()
7935 ibsd_wr_allchans(ppd, 2, 0, BMASK(11, 9)); in serdes_7322_init_old()
7938 ibsd_wr_allchans(ppd, 11, (1 << 11), BMASK(12, 11)); in serdes_7322_init_old()
7940 ibsd_wr_allchans(ppd, 13, (1 << 6), (1 << 6)); in serdes_7322_init_old()
7943 le_val = IS_QME(ppd->dd) ? LE2_QME : LE2_DEFAULT; in serdes_7322_init_old()
7944 ibsd_wr_allchans(ppd, 13, (le_val << 7), BMASK(9, 7)); in serdes_7322_init_old()
7947 le_val = IS_QME(ppd->dd) ? 0 : 1; in serdes_7322_init_old()
7948 ibsd_wr_allchans(ppd, 13, (le_val << 5), (1 << 5)); in serdes_7322_init_old()
7951 ahb_mod(ppd->dd, IBSD(ppd->hw_pidx), 5, 10, 0 << 14, 1 << 14); in serdes_7322_init_old()
7954 ibsd_wr_allchans(ppd, 5, (0 << 8), BMASK(9, 8)); in serdes_7322_init_old()
7958 ahb_mod(ppd->dd, IBSD(ppd->hw_pidx), 5, 5, 8 << 11, BMASK(14, 11)); in serdes_7322_init_old()
7959 ahb_mod(ppd->dd, IBSD(ppd->hw_pidx), 5, 7, 8 << 4, BMASK(7, 4)); in serdes_7322_init_old()
7960 ahb_mod(ppd->dd, IBSD(ppd->hw_pidx), 5, 8, 8 << 11, BMASK(14, 11)); in serdes_7322_init_old()
7961 ahb_mod(ppd->dd, IBSD(ppd->hw_pidx), 5, 10, 8 << 4, BMASK(7, 4)); in serdes_7322_init_old()
7964 ahb_mod(ppd->dd, IBSD(ppd->hw_pidx), 5, 6, 4 << 0, BMASK(3, 0)); in serdes_7322_init_old()
7965 ahb_mod(ppd->dd, IBSD(ppd->hw_pidx), 5, 7, 4 << 8, BMASK(11, 8)); in serdes_7322_init_old()
7966 ahb_mod(ppd->dd, IBSD(ppd->hw_pidx), 5, 9, 4 << 0, BMASK(3, 0)); in serdes_7322_init_old()
7967 ahb_mod(ppd->dd, IBSD(ppd->hw_pidx), 5, 10, 4 << 8, BMASK(11, 8)); in serdes_7322_init_old()
7970 ahb_mod(ppd->dd, IBSD(ppd->hw_pidx), 5, 9, 1 << 15, 1 << 15); in serdes_7322_init_old()
7973 ibsd_wr_allchans(ppd, 14, (1 << 3), BMASK(5, 3)); /* QDR */ in serdes_7322_init_old()
7974 ibsd_wr_allchans(ppd, 20, (2 << 10), BMASK(12, 10)); /* DDR */ in serdes_7322_init_old()
7975 ibsd_wr_allchans(ppd, 20, (4 << 13), BMASK(15, 13)); /* SDR */ in serdes_7322_init_old()
7977 serdes_7322_los_enable(ppd, 1); in serdes_7322_init_old()
7980 ibsd_wr_allchans(ppd, 9, 0 << 15, 1 << 15); in serdes_7322_init_old()
7983 ibsd_wr_allchans(ppd, 16, 0 << 0, BMASK(1, 0)); in serdes_7322_init_old()
7986 le_val = (ppd->dd->cspec->r1 || IS_QME(ppd->dd)) ? 0xb6c0 : 0x6bac; in serdes_7322_init_old()
7987 ibsd_wr_allchans(ppd, 21, le_val, 0xfffe); in serdes_7322_init_old()
7993 qib_write_kreg_port(ppd, krp_static_adapt_dis(0), 0ULL); in serdes_7322_init_old()
7994 qib_write_kreg_port(ppd, krp_static_adapt_dis(1), 0ULL); in serdes_7322_init_old()
7995 qib_write_kreg_port(ppd, krp_static_adapt_dis(2), in serdes_7322_init_old()
7996 ppd->dd->cspec->r1 ? in serdes_7322_init_old()
7998 ppd->cpspec->qdr_dfe_on = 1; in serdes_7322_init_old()
8001 ibsd_wr_allchans(ppd, 38, 0 << 10, 1 << 10); in serdes_7322_init_old()
8004 ibsd_wr_allchans(ppd, 12, 1 << 4, 1 << 4); in serdes_7322_init_old()
8006 if (!ppd->dd->cspec->r1) { in serdes_7322_init_old()
8007 ibsd_wr_allchans(ppd, 12, 1 << 12, 1 << 12); in serdes_7322_init_old()
8008 ibsd_wr_allchans(ppd, 12, 2 << 8, 0x0f << 8); in serdes_7322_init_old()
8012 ibsd_wr_allchans(ppd, 2, 15 << 5, BMASK(8, 5)); in serdes_7322_init_old()
8017 static int serdes_7322_init_new(struct qib_pportdata *ppd) in serdes_7322_init_new() argument
8024 ahb_mod(ppd->dd, IBSD(ppd->hw_pidx), 5, 10, 0 << 14, 1 << 14); in serdes_7322_init_new()
8027 qib_write_kreg_port(ppd, krp_tx_deemph_override, in serdes_7322_init_new()
8034 ibsd_wr_allchans(ppd, 1, 0, BMASK(9, 1)); in serdes_7322_init_new()
8036 ibsd_wr_allchans(ppd, 13, 0, BMASK(5, 5)); in serdes_7322_init_new()
8038 ibsd_wr_allchans(ppd, 1, 0, BMASK(15, 15)); in serdes_7322_init_new()
8040 ibsd_wr_allchans(ppd, 13, 0, BMASK(6, 6)); in serdes_7322_init_new()
8042 ibsd_wr_allchans(ppd, 5, 0, BMASK(0, 0)); in serdes_7322_init_new()
8044 ibsd_wr_allchans(ppd, 12, 0, BMASK(12, 12)); in serdes_7322_init_new()
8046 ibsd_wr_allchans(ppd, 2, 0, BMASK(3, 3)); in serdes_7322_init_new()
8048 ibsd_wr_allchans(ppd, 2, 0, BMASK(4, 4)); in serdes_7322_init_new()
8050 ibsd_wr_allchans(ppd, 13, 0, BMASK(13, 13)); in serdes_7322_init_new()
8052 ibsd_wr_allchans(ppd, 4, 0, BMASK(10, 10)); in serdes_7322_init_new()
8054 ibsd_wr_allchans(ppd, 12, 0, BMASK(4, 4)); in serdes_7322_init_new()
8056 ibsd_wr_allchans(ppd, 2, (1 << 15), BMASK(15, 15)); in serdes_7322_init_new()
8058 ibsd_wr_allchans(ppd, 5, 0, BMASK(9, 8)); in serdes_7322_init_new()
8060 ibsd_wr_allchans(ppd, 12, (1 << 5), BMASK(5, 5)); in serdes_7322_init_new()
8062 ibsd_wr_allchans(ppd, 2, (4 << 12), BMASK(14, 12)); in serdes_7322_init_new()
8064 ibsd_wr_allchans(ppd, 16, 0, BMASK(1, 0)); in serdes_7322_init_new()
8066 if (!ppd->dd->cspec->r1) { in serdes_7322_init_new()
8067 ibsd_wr_allchans(ppd, 12, 1 << 12, BMASK(12, 12)); in serdes_7322_init_new()
8068 ibsd_wr_allchans(ppd, 12, 2 << 8, BMASK(11, 8)); in serdes_7322_init_new()
8070 ibsd_wr_allchans(ppd, 19, (3 << 11), BMASK(13, 11)); in serdes_7322_init_new()
8081 ibsd_wr_allchans(ppd, 0, 0, BMASK(15, 13)); in serdes_7322_init_new()
8084 ibsd_wr_allchans(ppd, 0, (1 << 14), BMASK(14, 14)); in serdes_7322_init_new()
8087 ibsd_wr_allchans(ppd, 0, (1 << 13), BMASK(13, 13)); in serdes_7322_init_new()
8092 ahb_mod(ppd->dd, IBSD(ppd->hw_pidx), 5, 5, 8 << 11, BMASK(14, 11)); in serdes_7322_init_new()
8093 ahb_mod(ppd->dd, IBSD(ppd->hw_pidx), 5, 7, 8 << 4, BMASK(7, 4)); in serdes_7322_init_new()
8094 ahb_mod(ppd->dd, IBSD(ppd->hw_pidx), 5, 8, 8 << 11, BMASK(14, 11)); in serdes_7322_init_new()
8095 ahb_mod(ppd->dd, IBSD(ppd->hw_pidx), 5, 10, 8 << 4, BMASK(7, 4)); in serdes_7322_init_new()
8098 ahb_mod(ppd->dd, IBSD(ppd->hw_pidx), 5, 6, 4 << 0, BMASK(3, 0)); in serdes_7322_init_new()
8099 ahb_mod(ppd->dd, IBSD(ppd->hw_pidx), 5, 7, 4 << 8, BMASK(11, 8)); in serdes_7322_init_new()
8100 ahb_mod(ppd->dd, IBSD(ppd->hw_pidx), 5, 9, 4 << 0, BMASK(3, 0)); in serdes_7322_init_new()
8101 ahb_mod(ppd->dd, IBSD(ppd->hw_pidx), 5, 10, 4 << 8, BMASK(11, 8)); in serdes_7322_init_new()
8104 ahb_mod(ppd->dd, IBSD(ppd->hw_pidx), 5, 9, 1 << 15, 1 << 15); in serdes_7322_init_new()
8107 ibsd_wr_allchans(ppd, 14, (1 << 3), BMASK(5, 3)); /* QDR */ in serdes_7322_init_new()
8108 ibsd_wr_allchans(ppd, 20, (2 << 10), BMASK(12, 10)); /* DDR */ in serdes_7322_init_new()
8109 ibsd_wr_allchans(ppd, 20, (4 << 13), BMASK(15, 13)); /* SDR */ in serdes_7322_init_new()
8112 serdes_7322_los_enable(ppd, 1); in serdes_7322_init_new()
8114 ibsd_wr_allchans(ppd, 38, 0 << 10, 1 << 10); in serdes_7322_init_new()
8118 ibsd_wr_allchans(ppd, 15, 1, BMASK(0, 0)); in serdes_7322_init_new()
8120 ibsd_wr_allchans(ppd, 12, (1 << 4), BMASK(4, 4)); in serdes_7322_init_new()
8123 ibsd_wr_allchans(ppd, 4, (1 << 10), BMASK(10, 10)); in serdes_7322_init_new()
8128 rxcaldone = ahb_mod(ppd->dd, IBSD(ppd->hw_pidx), in serdes_7322_init_new()
8138 IBSD(ppd->hw_pidx), chan_done); in serdes_7322_init_new()
8141 rxcaldone = ahb_mod(ppd->dd, IBSD(ppd->hw_pidx), in serdes_7322_init_new()
8146 IBSD(ppd->hw_pidx), chan); in serdes_7322_init_new()
8151 ibsd_wr_allchans(ppd, 4, 0, BMASK(10, 10)); in serdes_7322_init_new()
8156 le_val = IS_QME(ppd->dd) ? LE2_QME : LE2_DEFAULT; in serdes_7322_init_new()
8157 ibsd_wr_allchans(ppd, 13, (le_val << 7), BMASK(9, 7)); in serdes_7322_init_new()
8159 ibsd_wr_allchans(ppd, 3, (7 << 5), BMASK(7, 5)); in serdes_7322_init_new()
8161 ibsd_wr_allchans(ppd, 13, (1 << 6), BMASK(6, 6)); in serdes_7322_init_new()
8164 ibsd_wr_allchans(ppd, 1, 1, BMASK(9, 1)); in serdes_7322_init_new()
8166 le_val = (ppd->dd->cspec->r1 || IS_QME(ppd->dd)) ? 0xb6c0 : 0x6bac; in serdes_7322_init_new()
8167 ibsd_wr_allchans(ppd, 21, le_val, 0xfffe); in serdes_7322_init_new()
8169 ibsd_wr_allchans(ppd, 5, 0, BMASK(0, 0)); in serdes_7322_init_new()
8172 ibsd_wr_allchans(ppd, 2, (15 << 5), BMASK(8, 5)); in serdes_7322_init_new()
8174 ibsd_wr_allchans(ppd, 2, (1 << 4), BMASK(4, 4)); in serdes_7322_init_new()
8176 ibsd_wr_allchans(ppd, 2, 0, BMASK(11, 9)); in serdes_7322_init_new()
8178 ibsd_wr_allchans(ppd, 2, (1 << 3), BMASK(3, 3)); in serdes_7322_init_new()
8184 qib_write_kreg_port(ppd, krp_static_adapt_dis(0), 0ULL); in serdes_7322_init_new()
8185 qib_write_kreg_port(ppd, krp_static_adapt_dis(1), 0ULL); in serdes_7322_init_new()
8186 qib_write_kreg_port(ppd, krp_static_adapt_dis(2), in serdes_7322_init_new()
8187 ppd->dd->cspec->r1 ? in serdes_7322_init_new()
8189 ppd->cpspec->qdr_dfe_on = 1; in serdes_7322_init_new()
8191 ibsd_wr_allchans(ppd, 13, (0 << 5), (1 << 5)); in serdes_7322_init_new()
8193 ibsd_wr_allchans(ppd, 1, (0 << 15), BMASK(15, 15)); in serdes_7322_init_new()
8196 ibsd_wr_allchans(ppd, 12, (1 << 12), BMASK(12, 12)); in serdes_7322_init_new()
8198 ibsd_wr_allchans(ppd, 12, (1 << 13), BMASK(13, 13)); in serdes_7322_init_new()
8200 ibsd_wr_allchans(ppd, 11, (1 << 11), BMASK(12, 11)); in serdes_7322_init_new()
8202 ibsd_wr_allchans(ppd, 12, (3 << 2), BMASK(3, 2)); in serdes_7322_init_new()
8208 init_txdds_table(ppd, 0); in serdes_7322_init_new()
8215 static void set_man_code(struct qib_pportdata *ppd, int chan, int code) in set_man_code() argument
8217 ahb_mod(ppd->dd, IBSD(ppd->hw_pidx), (chan + (chan >> 1)), in set_man_code()
8221 static void set_man_mode_h1(struct qib_pportdata *ppd, int chan, in set_man_mode_h1() argument
8225 ahb_mod(ppd->dd, IBSD(ppd->hw_pidx), (chan + (chan >> 1)), in set_man_mode_h1()
8228 ahb_mod(ppd->dd, IBSD(ppd->hw_pidx), (chan + (chan >> 1)), in set_man_mode_h1()
8233 static void clock_man(struct qib_pportdata *ppd, int chan) in clock_man() argument
8235 ahb_mod(ppd->dd, IBSD(ppd->hw_pidx), (chan + (chan >> 1)), in clock_man()
8237 ahb_mod(ppd->dd, IBSD(ppd->hw_pidx), (chan + (chan >> 1)), in clock_man()
8239 ahb_mod(ppd->dd, IBSD(ppd->hw_pidx), (chan + (chan >> 1)), in clock_man()
8241 ahb_mod(ppd->dd, IBSD(ppd->hw_pidx), (chan + (chan >> 1)), in clock_man()
8250 static void write_tx_serdes_param(struct qib_pportdata *ppd, in write_tx_serdes_param() argument
8255 deemph = qib_read_kreg_port(ppd, krp_tx_deemph_override); in write_tx_serdes_param()
8276 qib_write_kreg_port(ppd, krp_tx_deemph_override, deemph); in write_tx_serdes_param()
8284 static void adj_tx_serdes(struct qib_pportdata *ppd) in adj_tx_serdes() argument
8289 find_best_ent(ppd, &sdr_dds, &ddr_dds, &qdr_dds, 1); in adj_tx_serdes()
8290 dds = (struct txdds_ent *)(ppd->link_speed_active == QIB_IB_QDR ? in adj_tx_serdes()
8291 qdr_dds : (ppd->link_speed_active == QIB_IB_DDR ? in adj_tx_serdes()
8293 write_tx_serdes_param(ppd, dds); in adj_tx_serdes()
8297 static void force_h1(struct qib_pportdata *ppd) in force_h1() argument
8301 ppd->cpspec->qdr_reforce = 0; in force_h1()
8302 if (!ppd->dd->cspec->r1) in force_h1()
8306 set_man_mode_h1(ppd, chan, 1, 0); in force_h1()
8307 set_man_code(ppd, chan, ppd->cpspec->h1_val); in force_h1()
8308 clock_man(ppd, chan); in force_h1()
8309 set_man_mode_h1(ppd, chan, 0, 0); in force_h1()
8498 static void setup_7322_link_recovery(struct qib_pportdata *ppd, u32 both) in setup_7322_link_recovery() argument
8501 struct qib_devdata *dd = ppd->dd; in setup_7322_link_recovery()
8503 if (!ppd->dd->cspec->r1) in setup_7322_link_recovery()
8507 ppd->cpspec->recovery_init = 1; in setup_7322_link_recovery()
8510 portsel = ppd->port == 1 ? portsel_port1 : portsel_port2; in setup_7322_link_recovery()
8532 static void check_7322_rxe_status(struct qib_pportdata *ppd) in check_7322_rxe_status() argument
8534 struct qib_devdata *dd = ppd->dd; in check_7322_rxe_status()
8550 ppd->dd->cspec->stay_in_freeze = 1; in check_7322_rxe_status()
8551 qib_7322_set_intr_state(ppd->dd, 0); in check_7322_rxe_status()
8557 qib_write_kreg(ppd->dd, kr_hwerrclear, in check_7322_rxe_status()
8564 if (ppd->link_speed_supported) { in check_7322_rxe_status()
8565 ppd->cpspec->ibcctrl_a &= in check_7322_rxe_status()
8567 qib_write_kreg_port(ppd, krp_ibcctrl_a, in check_7322_rxe_status()
8568 ppd->cpspec->ibcctrl_a); in check_7322_rxe_status()
8570 if (ppd->lflags & QIBL_IB_LINK_DISABLED) in check_7322_rxe_status()
8571 qib_set_ib_7322_lstate(ppd, 0, in check_7322_rxe_status()