Lines Matching refs:dd

98 static int qib_sd7220_reg_mod(struct qib_devdata *dd, int sdnum, u32 loc,
100 static int ibsd_mod_allchnls(struct qib_devdata *dd, int loc, int val,
102 static int qib_sd_trimdone_poll(struct qib_devdata *dd);
103 static void qib_sd_trimdone_monitor(struct qib_devdata *dd, const char *where);
104 static int qib_sd_setvals(struct qib_devdata *dd);
105 static int qib_sd_early(struct qib_devdata *dd);
106 static int qib_sd_dactrim(struct qib_devdata *dd);
107 static int qib_internal_presets(struct qib_devdata *dd);
109 static int qib_sd_trimself(struct qib_devdata *dd, int val);
110 static int epb_access(struct qib_devdata *dd, int sdnum, int claim);
111 static int qib_sd7220_ib_load(struct qib_devdata *dd,
113 static int qib_sd7220_ib_vfy(struct qib_devdata *dd,
126 struct qib_devdata *dd = ppd->dd; in qib_ibsd_ucode_loaded() local
128 if (!dd->cspec->serdes_first_init_done && in qib_ibsd_ucode_loaded()
129 qib_sd7220_ib_vfy(dd, fw) > 0) in qib_ibsd_ucode_loaded()
130 dd->cspec->serdes_first_init_done = 1; in qib_ibsd_ucode_loaded()
131 return dd->cspec->serdes_first_init_done; in qib_ibsd_ucode_loaded()
143 void qib_sd7220_clr_ibpar(struct qib_devdata *dd) in qib_sd7220_clr_ibpar() argument
148 ret = qib_sd7220_reg_mod(dd, IB_7220_SERDES, IB_MPREG6, in qib_sd7220_clr_ibpar()
151 qib_dev_err(dd, "Failed clearing IBSerDes Parity err\n"); in qib_sd7220_clr_ibpar()
154 ret = qib_sd7220_reg_mod(dd, IB_7220_SERDES, IB_MPREG6, 0, in qib_sd7220_clr_ibpar()
157 qib_read_kreg32(dd, kr_scratch); in qib_sd7220_clr_ibpar()
159 qib_write_kreg(dd, kr_hwerrclear, in qib_sd7220_clr_ibpar()
161 qib_read_kreg32(dd, kr_scratch); in qib_sd7220_clr_ibpar()
175 static int qib_resync_ibepb(struct qib_devdata *dd) in qib_resync_ibepb() argument
184 ret = qib_sd7220_reg_mod(dd, IB_7220_SERDES, loc, 0, 0); in qib_resync_ibepb()
186 qib_dev_err(dd, "Failed read in resync\n"); in qib_resync_ibepb()
190 qib_dev_err(dd, "unexpected pattern in resync\n"); in qib_resync_ibepb()
192 ret = qib_sd7220_reg_mod(dd, IB_7220_SERDES, loc, pat, 0xFF); in qib_resync_ibepb()
194 qib_dev_err(dd, "Failed write in resync\n"); in qib_resync_ibepb()
197 ret = qib_sd7220_reg_mod(dd, IB_7220_SERDES, loc, 0, 0); in qib_resync_ibepb()
199 qib_dev_err(dd, "Failed re-read in resync\n"); in qib_resync_ibepb()
203 qib_dev_err(dd, "Failed compare1 in resync\n"); in qib_resync_ibepb()
207 ret = qib_sd7220_reg_mod(dd, IB_7220_SERDES, loc, 0, 0); in qib_resync_ibepb()
209 qib_dev_err(dd, "Failed CMUDONE rd in resync\n"); in qib_resync_ibepb()
213 qib_dev_err(dd, "Bad CMUDONE value %02X, chn %d\n", in qib_resync_ibepb()
227 static int qib_ibsd_reset(struct qib_devdata *dd, int assert_rst) in qib_ibsd_reset() argument
233 rst_val = qib_read_kreg64(dd, kr_ibserdesctrl); in qib_ibsd_reset()
239 spin_lock_irqsave(&dd->cspec->sdepb_lock, flags); in qib_ibsd_reset()
240 epb_access(dd, IB_7220_SERDES, 1); in qib_ibsd_reset()
243 qib_write_kreg(dd, kr_hwerrmask, in qib_ibsd_reset()
244 dd->cspec->hwerrmask & in qib_ibsd_reset()
246 qib_write_kreg(dd, kr_ibserdesctrl, rst_val); in qib_ibsd_reset()
248 qib_read_kreg32(dd, kr_scratch); in qib_ibsd_reset()
251 epb_access(dd, IB_7220_SERDES, -1); in qib_ibsd_reset()
252 spin_unlock_irqrestore(&dd->cspec->sdepb_lock, flags); in qib_ibsd_reset()
264 qib_write_kreg(dd, kr_hwerrmask, in qib_ibsd_reset()
265 dd->cspec->hwerrmask & in qib_ibsd_reset()
268 ret = qib_resync_ibepb(dd); in qib_ibsd_reset()
270 qib_dev_err(dd, "unable to re-sync IB EPB\n"); in qib_ibsd_reset()
273 ret = qib_sd7220_reg_mod(dd, IB_7220_SERDES, IB_MPREG5, 1, 1); in qib_ibsd_reset()
277 ret = qib_sd7220_reg_mod(dd, IB_7220_SERDES, IB_MPREG6, 0x80, in qib_ibsd_reset()
280 qib_dev_err(dd, "Failed to set WDOG disable\n"); in qib_ibsd_reset()
283 qib_write_kreg(dd, kr_ibserdesctrl, rst_val); in qib_ibsd_reset()
285 qib_read_kreg32(dd, kr_scratch); in qib_ibsd_reset()
288 qib_sd7220_clr_ibpar(dd); in qib_ibsd_reset()
289 val = qib_read_kreg64(dd, kr_hwerrstatus); in qib_ibsd_reset()
291 qib_dev_err(dd, "IBUC Parity still set after RST\n"); in qib_ibsd_reset()
292 dd->cspec->hwerrmask &= in qib_ibsd_reset()
295 qib_write_kreg(dd, kr_hwerrmask, in qib_ibsd_reset()
296 dd->cspec->hwerrmask); in qib_ibsd_reset()
303 static void qib_sd_trimdone_monitor(struct qib_devdata *dd, in qib_sd_trimdone_monitor() argument
315 ret = qib_resync_ibepb(dd); in qib_sd_trimdone_monitor()
317 qib_dev_err(dd, "not able to re-sync IB EPB (%s)\n", where); in qib_sd_trimdone_monitor()
320 ret = qib_sd7220_reg_mod(dd, IB_7220_SERDES, IB_CTRL2(0), 0, 0); in qib_sd_trimdone_monitor()
322 qib_dev_err(dd, "Failed TRIMDONE 1st read, (%s)\n", where); in qib_sd_trimdone_monitor()
325 val = qib_read_kreg64(dd, kr_ibcstatus); in qib_sd_trimdone_monitor()
327 qib_dev_err(dd, "IBCS TRIMDONE clear (%s)\n", where); in qib_sd_trimdone_monitor()
334 ret = qib_sd7220_reg_mod(dd, IB_7220_SERDES, IB_MPREG6, 0x80, 0x80); in qib_sd_trimdone_monitor()
336 qib_dev_err(dd, "Failed Dummy RMW, (%s)\n", where); in qib_sd_trimdone_monitor()
343 ret = qib_sd7220_reg_mod(dd, IB_7220_SERDES, in qib_sd_trimdone_monitor()
346 qib_dev_err(dd, in qib_sd_trimdone_monitor()
354 qib_dev_err(dd, in qib_sd_trimdone_monitor()
357 probe = qib_sd7220_reg_mod(dd, IB_7220_SERDES, in qib_sd_trimdone_monitor()
359 qib_dev_err(dd, "probe is %d (%02X)\n", in qib_sd_trimdone_monitor()
361 probe = qib_sd7220_reg_mod(dd, IB_7220_SERDES, in qib_sd_trimdone_monitor()
363 qib_dev_err(dd, "re-read: %d (%02X)\n", in qib_sd_trimdone_monitor()
365 ret = qib_sd7220_reg_mod(dd, IB_7220_SERDES, in qib_sd_trimdone_monitor()
368 qib_dev_err(dd, in qib_sd_trimdone_monitor()
375 qib_dev_err(dd, in qib_sd_trimdone_monitor()
378 ret = qib_sd7220_reg_mod(dd, IB_7220_SERDES, in qib_sd_trimdone_monitor()
381 qib_dev_err(dd, in qib_sd_trimdone_monitor()
394 int qib_sd7220_init(struct qib_devdata *dd) in qib_sd7220_init() argument
401 was_reset = (qib_read_kreg64(dd, kr_ibserdesctrl) & 1); in qib_sd7220_init()
404 qib_ibsd_reset(dd, 1); in qib_sd7220_init()
405 qib_sd_trimdone_monitor(dd, "Driver-reload"); in qib_sd7220_init()
408 ret = request_firmware(&fw, SD7220_FW_NAME, &dd->pcidev->dev); in qib_sd7220_init()
410 qib_dev_err(dd, "Failed to load IB SERDES image\n"); in qib_sd7220_init()
415 ret = qib_ibsd_ucode_loaded(dd->pport, fw); in qib_sd7220_init()
424 ret = qib_sd_early(dd); in qib_sd7220_init()
426 qib_dev_err(dd, "Failed to set IB SERDES early defaults\n"); in qib_sd7220_init()
435 ret = qib_sd_dactrim(dd); in qib_sd7220_init()
437 qib_dev_err(dd, "Failed IB SERDES DAC trim\n"); in qib_sd7220_init()
447 ret = qib_internal_presets(dd); in qib_sd7220_init()
449 qib_dev_err(dd, "Failed to set IB SERDES presets\n"); in qib_sd7220_init()
452 ret = qib_sd_trimself(dd, 0x80); in qib_sd7220_init()
454 qib_dev_err(dd, "Failed to set IB SERDES TRIMSELF\n"); in qib_sd7220_init()
464 ret = qib_sd7220_ib_load(dd, fw); in qib_sd7220_init()
466 qib_dev_err(dd, "Failed to load IB SERDES image\n"); in qib_sd7220_init()
470 vfy = qib_sd7220_ib_vfy(dd, fw); in qib_sd7220_init()
472 qib_dev_err(dd, "SERDES PRAM VFY failed\n"); in qib_sd7220_init()
490 ret = ibsd_mod_allchnls(dd, START_EQ1(0), 0, 0x38); in qib_sd7220_init()
492 qib_dev_err(dd, "Failed clearing START_EQ1\n"); in qib_sd7220_init()
496 qib_ibsd_reset(dd, 0); in qib_sd7220_init()
501 trim_done = qib_sd_trimdone_poll(dd); in qib_sd7220_init()
507 qib_ibsd_reset(dd, 1); in qib_sd7220_init()
510 qib_dev_err(dd, "No TRIMDONE seen\n"); in qib_sd7220_init()
517 qib_sd_trimdone_monitor(dd, "First-reset"); in qib_sd7220_init()
519 dd->cspec->serdes_first_init_done = 1; in qib_sd7220_init()
526 if (qib_sd_setvals(dd) >= 0) in qib_sd7220_init()
532 set_7220_relock_poll(dd, -1); in qib_sd7220_init()
552 static int epb_access(struct qib_devdata *dd, int sdnum, int claim) in epb_access() argument
580 qib_read_kreg32(dd, kr_scratch); in epb_access()
583 accval = qib_read_kreg32(dd, acc); in epb_access()
595 qib_write_kreg(dd, acc, newval); in epb_access()
597 pollval = qib_read_kreg32(dd, acc); in epb_access()
599 pollval = qib_read_kreg32(dd, acc); in epb_access()
607 qib_write_kreg(dd, acc, newval); in epb_access()
609 pollval = qib_read_kreg32(dd, acc); in epb_access()
611 pollval = qib_read_kreg32(dd, acc); in epb_access()
621 static int epb_trans(struct qib_devdata *dd, u16 reg, u64 i_val, u64 *o_vp) in epb_trans() argument
626 qib_write_kreg(dd, reg, i_val); in epb_trans()
628 transval = qib_read_kreg64(dd, reg); in epb_trans()
631 transval = qib_read_kreg32(dd, reg); in epb_trans()
656 static int qib_sd7220_reg_mod(struct qib_devdata *dd, int sdnum, u32 loc, in qib_sd7220_reg_mod() argument
683 spin_lock_irqsave(&dd->cspec->sdepb_lock, flags); in qib_sd7220_reg_mod()
685 owned = epb_access(dd, sdnum, 1); in qib_sd7220_reg_mod()
687 spin_unlock_irqrestore(&dd->cspec->sdepb_lock, flags); in qib_sd7220_reg_mod()
691 transval = qib_read_kreg32(dd, trans); in qib_sd7220_reg_mod()
705 tries = epb_trans(dd, trans, transval, &transval); in qib_sd7220_reg_mod()
713 tries = epb_trans(dd, trans, transval, &transval); in qib_sd7220_reg_mod()
721 if (epb_access(dd, sdnum, -1) < 0) in qib_sd7220_reg_mod()
726 spin_unlock_irqrestore(&dd->cspec->sdepb_lock, flags); in qib_sd7220_reg_mod()
745 static int qib_sd7220_ram_xfer(struct qib_devdata *dd, int sdnum, u32 loc, in qib_sd7220_ram_xfer() argument
776 spin_lock_irqsave(&dd->cspec->sdepb_lock, flags); in qib_sd7220_ram_xfer()
778 owned = epb_access(dd, sdnum, 1); in qib_sd7220_ram_xfer()
780 spin_unlock_irqrestore(&dd->cspec->sdepb_lock, flags); in qib_sd7220_ram_xfer()
793 transval = qib_read_kreg32(dd, trans); in qib_sd7220_ram_xfer()
810 tries = epb_trans(dd, trans, transval, &transval); in qib_sd7220_ram_xfer()
817 tries = epb_trans(dd, trans, transval, in qib_sd7220_ram_xfer()
823 tries = epb_trans(dd, trans, transval, in qib_sd7220_ram_xfer()
833 tries = epb_trans(dd, trans, transval, &transval); in qib_sd7220_ram_xfer()
842 tries = epb_trans(dd, trans, transval, &transval); in qib_sd7220_ram_xfer()
847 if (epb_access(dd, sdnum, -1) < 0) in qib_sd7220_ram_xfer()
850 spin_unlock_irqrestore(&dd->cspec->sdepb_lock, flags); in qib_sd7220_ram_xfer()
858 static int qib_sd7220_prog_ld(struct qib_devdata *dd, int sdnum, in qib_sd7220_prog_ld() argument
868 cnt = qib_sd7220_ram_xfer(dd, sdnum, offset + sofar, in qib_sd7220_prog_ld()
882 static int qib_sd7220_prog_vfy(struct qib_devdata *dd, int sdnum, in qib_sd7220_prog_vfy() argument
894 cnt = qib_sd7220_ram_xfer(dd, sdnum, sofar + offset, in qib_sd7220_prog_vfy()
911 qib_sd7220_ib_load(struct qib_devdata *dd, const struct firmware *fw) in qib_sd7220_ib_load() argument
913 return qib_sd7220_prog_ld(dd, IB_7220_SERDES, fw->data, fw->size, 0); in qib_sd7220_ib_load()
917 qib_sd7220_ib_vfy(struct qib_devdata *dd, const struct firmware *fw) in qib_sd7220_ib_vfy() argument
919 return qib_sd7220_prog_vfy(dd, IB_7220_SERDES, fw->data, fw->size, 0); in qib_sd7220_ib_vfy()
928 static int qib_sd_trimdone_poll(struct qib_devdata *dd) in qib_sd_trimdone_poll() argument
939 val = qib_read_kreg64(dd, kr_ibcstatus); in qib_sd_trimdone_poll()
947 qib_dev_err(dd, "No TRIMDONE in %d tries\n", trim_tmo); in qib_sd_trimdone_poll()
1041 static int qib_sd_setvals(struct qib_devdata *dd) in qib_sd_setvals() argument
1050 taddr = dd->kregbase + kr_serdes_maptable; in qib_sd_setvals()
1051 iaddr = dd->kregbase + kr_serdes_ddsrxeq0; in qib_sd_setvals()
1058 sdctl = qib_read_kreg64(dd, kr_ibserdesctrl); in qib_sd_setvals()
1061 qib_write_kreg(dd, kr_ibserdesctrl, sdctl); in qib_sd_setvals()
1070 qib_read_kreg32(dd, kr_scratch); in qib_sd_setvals()
1077 qib_read_kreg32(dd, kr_scratch); in qib_sd_setvals()
1098 qib_read_kreg32(dd, kr_scratch); in qib_sd_setvals()
1103 qib_read_kreg32(dd, kr_scratch); in qib_sd_setvals()
1126 static int ibsd_mod_allchnls(struct qib_devdata *dd, int loc, int val, in ibsd_mod_allchnls() argument
1142 ret = qib_sd7220_reg_mod(dd, IB_7220_SERDES, in ibsd_mod_allchnls()
1147 qib_dev_err(dd, in ibsd_mod_allchnls()
1156 ret = qib_sd7220_reg_mod(dd, IB_7220_SERDES, loc, val, 0xFF); in ibsd_mod_allchnls()
1160 qib_dev_err(dd, in ibsd_mod_allchnls()
1172 ret = qib_sd7220_reg_mod(dd, IB_7220_SERDES, cloc, val, mask); in ibsd_mod_allchnls()
1176 qib_dev_err(dd, in ibsd_mod_allchnls()
1190 static int set_dds_vals(struct qib_devdata *dd, struct dds_init *ddi) in set_dds_vals() argument
1202 ret = ibsd_mod_allchnls(dd, EPB_LOC(0, 9, reg), data, 0xFF); in set_dds_vals()
1213 static int set_rxeq_vals(struct qib_devdata *dd, int vsel) in set_rxeq_vals() argument
1227 ret = ibsd_mod_allchnls(dd, loc, val, 0xFF); in set_rxeq_vals()
1249 static int qib_internal_presets(struct qib_devdata *dd) in qib_internal_presets() argument
1253 ret = set_dds_vals(dd, dds_init_vals + DDS_3M); in qib_internal_presets()
1256 qib_dev_err(dd, "Failed to set default DDS values\n"); in qib_internal_presets()
1257 ret = set_rxeq_vals(dd, qib_rxeq_set & 3); in qib_internal_presets()
1259 qib_dev_err(dd, "Failed to set default RXEQ values\n"); in qib_internal_presets()
1263 int qib_sd7220_presets(struct qib_devdata *dd) in qib_sd7220_presets() argument
1267 if (!dd->cspec->presets_needed) in qib_sd7220_presets()
1269 dd->cspec->presets_needed = 0; in qib_sd7220_presets()
1271 qib_ibsd_reset(dd, 1); in qib_sd7220_presets()
1273 qib_sd_trimdone_monitor(dd, "link-down"); in qib_sd7220_presets()
1275 ret = qib_internal_presets(dd); in qib_sd7220_presets()
1279 static int qib_sd_trimself(struct qib_devdata *dd, int val) in qib_sd_trimself() argument
1283 return qib_sd7220_reg_mod(dd, IB_7220_SERDES, loc, val, 0xFF); in qib_sd_trimself()
1286 static int qib_sd_early(struct qib_devdata *dd) in qib_sd_early() argument
1290 ret = ibsd_mod_allchnls(dd, RXHSCTRL0(0) | EPB_GLOBAL_WR, 0xD4, 0xFF); in qib_sd_early()
1293 ret = ibsd_mod_allchnls(dd, START_EQ1(0) | EPB_GLOBAL_WR, 0x10, 0xFF); in qib_sd_early()
1296 ret = ibsd_mod_allchnls(dd, START_EQ2(0) | EPB_GLOBAL_WR, 0x30, 0xFF); in qib_sd_early()
1305 static int qib_sd_dactrim(struct qib_devdata *dd) in qib_sd_dactrim() argument
1309 ret = ibsd_mod_allchnls(dd, VCDL_DAC2(0) | EPB_GLOBAL_WR, 0x2D, 0xFF); in qib_sd_dactrim()
1314 ret = ibsd_mod_allchnls(dd, VCDL_CTRL2(0), 3, 0xF); in qib_sd_dactrim()
1318 ret = ibsd_mod_allchnls(dd, BACTRL(0) | EPB_GLOBAL_WR, 0x40, 0xFF); in qib_sd_dactrim()
1322 ret = ibsd_mod_allchnls(dd, LDOUTCTRL1(0) | EPB_GLOBAL_WR, 0x04, 0xFF); in qib_sd_dactrim()
1326 ret = ibsd_mod_allchnls(dd, RXHSSTATUS(0) | EPB_GLOBAL_WR, 0x04, 0xFF); in qib_sd_dactrim()
1336 ret = ibsd_mod_allchnls(dd, LDOUTCTRL1(0) | EPB_GLOBAL_WR, 0x00, 0xFF); in qib_sd_dactrim()
1344 void toggle_7220_rclkrls(struct qib_devdata *dd) in toggle_7220_rclkrls() argument
1349 ret = ibsd_mod_allchnls(dd, loc, 0, 0x80); in toggle_7220_rclkrls()
1351 qib_dev_err(dd, "RCLKRLS failed to clear D7\n"); in toggle_7220_rclkrls()
1354 ibsd_mod_allchnls(dd, loc, 0x80, 0x80); in toggle_7220_rclkrls()
1358 ret = ibsd_mod_allchnls(dd, loc, 0, 0x80); in toggle_7220_rclkrls()
1360 qib_dev_err(dd, "RCLKRLS failed to clear D7\n"); in toggle_7220_rclkrls()
1363 ibsd_mod_allchnls(dd, loc, 0x80, 0x80); in toggle_7220_rclkrls()
1366 dd->f_xgxs_reset(dd->pport); in toggle_7220_rclkrls()
1375 void shutdown_7220_relock_poll(struct qib_devdata *dd) in shutdown_7220_relock_poll() argument
1377 if (dd->cspec->relock_timer_active) in shutdown_7220_relock_poll()
1378 del_timer_sync(&dd->cspec->relock_timer); in shutdown_7220_relock_poll()
1389 struct qib_devdata *dd = cs->dd; in qib_run_relock() local
1390 struct qib_pportdata *ppd = dd->pport; in qib_run_relock()
1399 if ((dd->flags & QIB_INITTED) && !(ppd->lflags & in qib_run_relock()
1404 toggle_7220_rclkrls(dd); in qib_run_relock()
1416 void set_7220_relock_poll(struct qib_devdata *dd, int ibup) in set_7220_relock_poll() argument
1418 struct qib_chip_specific *cs = dd->cspec; in set_7220_relock_poll()