Lines Matching refs:tp
76 static int sbp2_agent_init(sbp2_agent_t *, uint64_t, sbp2_tgt_t *tp);
151 sbp2_tgt_t *tp;
154 tp = kmem_zalloc(sizeof (sbp2_tgt_t), KM_SLEEP);
155 tp->t_bus = bus;
156 tp->t_bus_hdl = bus_hdl;
158 sbp2_tgt_init_sobj(tp);
160 if ((ret = sbp2_cfgrom_parse(tp, &tp->t_cfgrom)) != SBP2_SUCCESS) {
161 sbp2_tgt_fini_sobj(tp);
162 kmem_free(tp, sizeof (sbp2_tgt_t));
166 if ((ret = sbp2_tgt_init_params(tp)) != SBP2_SUCCESS) {
167 sbp2_cfgrom_free(tp, &tp->t_cfgrom);
168 sbp2_tgt_fini_sobj(tp);
169 kmem_free(tp, sizeof (sbp2_tgt_t));
173 if ((ret = sbp2_tgt_init_luns(tp, maxluns)) != SBP2_SUCCESS) {
174 sbp2_cfgrom_free(tp, &tp->t_cfgrom);
175 sbp2_tgt_fini_sobj(tp);
176 kmem_free(tp, sizeof (sbp2_tgt_t));
180 if ((ret = sbp2_tgt_init_bus(tp)) != SBP2_SUCCESS) {
181 sbp2_tgt_fini_luns(tp);
182 sbp2_cfgrom_free(tp, &tp->t_cfgrom);
183 sbp2_tgt_fini_sobj(tp);
184 kmem_free(tp, sizeof (sbp2_tgt_t));
188 *tpp = tp;
193 sbp2_tgt_fini(sbp2_tgt_t *tp)
195 sbp2_tgt_fini_bus(tp);
196 sbp2_tgt_fini_luns(tp);
197 sbp2_cfgrom_free(tp, &tp->t_cfgrom);
198 sbp2_tgt_fini_sobj(tp);
199 kmem_free(tp, sizeof (sbp2_tgt_t));
203 sbp2_tgt_init_sobj(sbp2_tgt_t *tp)
205 mutex_init(&tp->t_mutex, NULL, MUTEX_DRIVER, NULL);
206 cv_init(&tp->t_mgt_agent_cv, NULL, CV_DRIVER, NULL);
207 cv_init(&tp->t_mgt_status_cv, NULL, CV_DRIVER, NULL);
211 sbp2_tgt_fini_sobj(sbp2_tgt_t *tp)
213 cv_destroy(&tp->t_mgt_status_cv);
214 cv_destroy(&tp->t_mgt_agent_cv);
215 mutex_destroy(&tp->t_mutex);
219 sbp2_tgt_init_params(sbp2_tgt_t *tp)
221 sbp2_cfgrom_ent_t *root = &tp->t_cfgrom.cr_root;
230 tp->t_mgt_agent = SBP2_CSR_BASE(tp) + ent->ce_data.offset * 4;
240 tp->t_mot = ((q & SBP2_UNCHAR_MOT) >> SBP2_UNCHAR_MOT_SHIFT) * 500;
243 tp->t_orb_size = (q & SBP2_UNCHAR_ORB_SIZE) * 4;
246 if (tp->t_mot < SBP2_MOT_MIN) {
247 tp->t_mot = SBP2_MOT_DFLT;
249 if (tp->t_orb_size < SBP2_ORB_SIZE_MIN) {
250 tp->t_orb_size = SBP2_ORB_SIZE_MIN;
259 sbp2_tgt_init_luns(sbp2_tgt_t *tp, int maxluns)
261 sbp2_cfgrom_ent_t *root = &tp->t_cfgrom.cr_root;
266 ASSERT(tp->t_nluns == 0);
268 tp->t_lun = kmem_zalloc(maxluns * sizeof (sbp2_lun_t), KM_SLEEP);
269 tp->t_nluns_alloc = maxluns;
272 for (tp->t_nluns = 0; tp->t_nluns < maxluns; tp->t_nluns++) {
274 SBP2_KV_LUN, tp->t_nluns)) == NULL) {
278 lp = &tp->t_lun[tp->t_nluns];
279 lp->l_tgt = tp;
286 if (tp->t_nluns > 0) {
289 kmem_free(tp->t_lun, tp->t_nluns_alloc * sizeof (sbp2_lun_t));
297 sbp2_tgt_fini_luns(sbp2_tgt_t *tp)
303 for (i = 0; i < tp->t_nluns; i++) {
304 lp = &tp->t_lun[i];
309 kmem_free(tp->t_lun, tp->t_nluns_alloc * sizeof (sbp2_lun_t));
316 sbp2_tgt_init_bus(sbp2_tgt_t *tp)
325 tp->t_mgt_orb_buf.bb_len =
326 SBP2_ORB_SIZE_ROUNDUP(tp, sizeof (sbp2_mgt_orb_t));
327 tp->t_mgt_orb_buf.bb_flags = SBP2_BUS_BUF_DMA | SBP2_BUS_BUF_RD;
328 if ((ret = SBP2_ALLOC_BUF(tp, &tp->t_mgt_orb_buf)) != SBP2_SUCCESS) {
329 sbp2_tgt_fini_bus(tp);
336 tp->t_mgt_status_fifo_buf.bb_len = sizeof (sbp2_status_t);
337 tp->t_mgt_status_fifo_buf.bb_flags = SBP2_BUS_BUF_WR_POSTED;
338 tp->t_mgt_status_fifo_buf.bb_wb_cb = sbp2_mgt_status_fifo_wb_cb;
339 tp->t_mgt_status_fifo_buf.bb_sbp2_priv = tp;
340 if ((ret = SBP2_ALLOC_BUF(tp, &tp->t_mgt_status_fifo_buf)) !=
348 tp->t_mgt_login_resp_buf.bb_len =
349 SBP2_ORB_SIZE_ROUNDUP(tp, sizeof (sbp2_login_resp_t));
354 tp->t_mgt_login_resp_buf.bb_flags = SBP2_BUS_BUF_DMA | SBP2_BUS_BUF_RW;
355 if ((ret = SBP2_ALLOC_BUF(tp, &tp->t_mgt_login_resp_buf)) !=
357 sbp2_tgt_fini_bus(tp);
364 if ((ret = SBP2_ALLOC_CMD(tp, &tp->t_mgt_cmd, 0)) != SBP2_SUCCESS) {
365 sbp2_tgt_fini_bus(tp);
368 if ((tp->t_mgt_cmd_data = allocb(8, BPRI_HI)) == NULL) {
369 sbp2_tgt_fini_bus(tp);
377 sbp2_tgt_fini_bus(sbp2_tgt_t *tp)
379 if (tp->t_mgt_status_fifo_buf.bb_hdl != NULL) {
380 SBP2_FREE_BUF(tp, &tp->t_mgt_status_fifo_buf);
382 if (tp->t_mgt_orb_buf.bb_hdl != NULL) {
383 SBP2_FREE_BUF(tp, &tp->t_mgt_orb_buf);
385 if (tp->t_mgt_login_resp_buf.bb_hdl != NULL) {
386 SBP2_FREE_BUF(tp, &tp->t_mgt_login_resp_buf);
388 if (tp->t_mgt_cmd) {
389 SBP2_FREE_CMD(tp, tp->t_mgt_cmd);
390 tp->t_mgt_cmd = NULL;
392 if (tp->t_mgt_cmd_data) {
393 freeb(tp->t_mgt_cmd_data);
394 tp->t_mgt_cmd_data = NULL;
399 sbp2_tgt_disconnect(sbp2_tgt_t *tp)
401 sbp2_tgt_fini_bus(tp);
405 sbp2_tgt_reconnect(sbp2_tgt_t *tp)
407 return (sbp2_tgt_init_bus(tp));
416 sbp2_tgt_mgt_request(sbp2_tgt_t *tp, int *berr)
430 if (tp->t_mgt_cmd_data == 0) {
434 tp->t_mgt_status_rcvd = B_FALSE;
437 SBP2_ADDR_SET(tp->t_mgt_cmd_data->b_rptr, tp->t_mgt_orb_buf.bb_baddr,
439 tp->t_mgt_cmd_data->b_wptr = tp->t_mgt_cmd_data->b_rptr + 8;
441 if ((ret = SBP2_WB(tp, tp->t_mgt_cmd, tp->t_mgt_agent,
442 tp->t_mgt_cmd_data, 8, berr)) != SBP2_SUCCESS) {
447 mutex_enter(&tp->t_mutex);
448 until = ddi_get_lbolt() + drv_usectohz(tp->t_mot * 1000);
451 while (!tp->t_mgt_status_rcvd && (ret > 0)) {
452 ret = cv_timedwait(&tp->t_mgt_status_cv, &tp->t_mutex, until);
455 if (!tp->t_mgt_status_rcvd) {
457 } else if ((tp->t_mgt_status.st_param & SBP2_ST_RESP) ==
463 mutex_exit(&tp->t_mutex);
474 sbp2_tgt_task_mgt_request(sbp2_tgt_t *tp, uint16_t id, int func, uint64_t orbp,
480 sbp2_mgt_agent_acquire(tp);
482 torb = (sbp2_task_mgt_orb_t *)tp->t_mgt_orb_buf.bb_kaddr;
488 SBP2_ADDR_SET(torb->to_status_fifo, tp->t_mgt_status_fifo_buf.bb_baddr,
491 ret = sbp2_tgt_mgt_request(tp, berr);
493 sbp2_mgt_agent_release(tp);
499 sbp2_tgt_reset(sbp2_tgt_t *tp, int *berr)
501 sbp2_lun_t *lp = &tp->t_lun[0];
505 if ((ret = sbp2_tgt_task_mgt_request(tp, lp->l_login_resp.lr_login_id,
514 sbp2_tgt_get_cfgrom(sbp2_tgt_t *tp, sbp2_cfgrom_t **crpp)
516 *crpp = &tp->t_cfgrom;
521 sbp2_tgt_get_lun_cnt(sbp2_tgt_t *tp)
523 return (tp->t_nluns);
527 sbp2_tgt_get_lun(sbp2_tgt_t *tp, int num)
529 if (num < tp->t_nluns) {
530 return (&tp->t_lun[num]);
544 sbp2_tgt_t *tp = lp->l_tgt;
550 if ((ret = sbp2_tgt_task_mgt_request(tp, lp->l_login_resp.lr_login_id,
574 sbp2_tgt_t *tp = lp->l_tgt;
593 sbp2_mgt_agent_acquire(tp);
596 mutex_enter(&tp->t_mutex);
597 lorb = (sbp2_login_orb_t *)tp->t_mgt_orb_buf.bb_kaddr;
599 SBP2_ADDR_SET(lorb->lo_resp, tp->t_mgt_login_resp_buf.bb_baddr, 0);
603 lorb->lo_resp_len = SBP2_SWAP16(tp->t_mgt_login_resp_buf.bb_len);
606 bzero(tp->t_mgt_login_resp_buf.bb_kaddr, sizeof (sbp2_login_resp_t));
609 mutex_exit(&tp->t_mutex);
612 if ((ret = sbp2_tgt_mgt_request(tp, berr)) != SBP2_SUCCESS) {
613 sbp2_mgt_agent_release(tp);
620 mutex_enter(&tp->t_mutex);
621 (void) SBP2_SYNC_BUF(tp, &tp->t_mgt_login_resp_buf, 0, 0,
623 bcopy(tp->t_mgt_login_resp_buf.bb_kaddr, &lp->l_login_resp,
636 mutex_exit(&tp->t_mutex);
638 sbp2_mgt_agent_release(tp);
640 if ((ret = sbp2_agent_init(&sp->s_agent, sp->s_agent_offset, tp)) !=
655 sbp2_tgt_t *tp = lp->l_tgt;
659 mutex_enter(&tp->t_mutex);
664 mutex_exit(&tp->t_mutex);
665 sbp2_lun_logout_orb(lp, tp, berr);
666 mutex_enter(&tp->t_mutex);
674 mutex_exit(&tp->t_mutex);
685 sbp2_lun_logout_orb(sbp2_lun_t *lp, sbp2_tgt_t *tp, int *berr)
689 sbp2_mgt_agent_acquire(tp);
692 lorb = (sbp2_logout_orb_t *)tp->t_mgt_orb_buf.bb_kaddr;
697 SBP2_ADDR_SET(lorb->lo_status_fifo, tp->t_mgt_status_fifo_buf.bb_baddr,
701 (void) sbp2_tgt_mgt_request(tp, berr);
703 sbp2_mgt_agent_release(tp);
709 sbp2_tgt_t *tp = lp->l_tgt;
712 mutex_enter(&tp->t_mutex);
714 mutex_exit(&tp->t_mutex);
727 sbp2_tgt_t *tp = lp->l_tgt;
733 sp->s_tgt = tp;
739 SBP2_GET_IBLOCK_COOKIE(tp));
741 SBP2_GET_IBLOCK_COOKIE(tp));
750 if ((ret = SBP2_ALLOC_BUF(tp, &sp->s_status_fifo_buf)) !=
764 sbp2_tgt_t *tp = sp->s_lun->l_tgt;
767 SBP2_FREE_BUF(tp, &sp->s_status_fifo_buf);
779 sbp2_tgt_t *tp = sp->s_tgt;
784 mutex_enter(&tp->t_mutex);
786 mutex_exit(&tp->t_mutex);
801 mutex_enter(&tp->t_mutex);
803 mutex_exit(&tp->t_mutex);
814 sbp2_tgt_t *tp = sp->s_tgt;
820 sbp2_mgt_agent_acquire(tp);
823 rorb = (sbp2_reconnect_orb_t *)tp->t_mgt_orb_buf.bb_kaddr;
828 SBP2_ADDR_SET(rorb->ro_status_fifo, tp->t_mgt_status_fifo_buf.bb_baddr,
832 if ((ret = sbp2_tgt_mgt_request(tp, berr)) != SBP2_SUCCESS) {
833 mutex_enter(&tp->t_mutex);
835 mutex_exit(&tp->t_mutex);
843 sbp2_mgt_agent_release(tp);
878 sbp2_tgt_t *tp = sp->s_tgt;
950 tp->t_stat.stat_submit_orbp++;
955 tp->t_stat.stat_status_dead++;
1012 sbp2_tgt_t *tp = sp->s_tgt;
1031 if (sp->s_task_cnt > tp->t_stat.stat_task_max) {
1032 tp->t_stat.stat_task_max = sp->s_task_cnt;
1202 sbp2_tgt_t *tp = sp->s_tgt;
1211 (void) SBP2_SYNC_BUF(tp, task->ts_buf, 0, 0, DDI_DMA_SYNC_FORDEV);
1213 ret = sbp2_tgt_task_mgt_request(tp, lp->l_login_resp.lr_login_id,
1223 sbp2_tgt_t *tp = sp->s_tgt;
1227 ret = sbp2_tgt_task_mgt_request(tp, lp->l_login_resp.lr_login_id,
1294 sbp2_tgt_t *tp = lp->l_tgt;
1300 SBP2_FREE_BUF(tp, buf);
1312 sbp2_tgt_t *tp = lp->l_tgt;
1316 buf_len = SBP2_ORB_SIZE_ROUNDUP(tp, len);
1327 if ((ret = SBP2_ALLOC_BUF(tp, task->ts_buf)) != SBP2_SUCCESS) {
1338 sbp2_tgt_t *tp = lp->l_tgt;
1342 SBP2_FREE_BUF(tp, task->ts_buf);
1367 sbp2_agent_init(sbp2_agent_t *ap, uint64_t offset, sbp2_tgt_t *tp)
1376 ap->a_tgt = tp;
1388 if ((ret = SBP2_ALLOC_CMD(tp, &ap->a_cmd, 0)) != SBP2_SUCCESS) {
1398 SBP2_GET_IBLOCK_COOKIE(tp));
1412 sbp2_tgt_t *tp = ap->a_tgt;
1416 SBP2_FREE_CMD(tp, ap->a_cmd);
1576 sbp2_tgt_t *tp = buf->bb_sbp2_priv;
1585 SBP2_BUF_WR_DONE(tp, buf, reqh, SBP2_BUS_BUF_ELENGTH);
1586 tp->t_stat.stat_status_short++;
1596 if (orbp != tp->t_mgt_orb_buf.bb_baddr) {
1597 SBP2_BUF_WR_DONE(tp, buf, reqh, SBP2_BUS_BUF_FAILURE);
1598 tp->t_stat.stat_status_mgt_notask++;
1603 bzero(&tp->t_mgt_status, sizeof (sbp2_status_t));
1604 bcopy((*bpp)->b_rptr, &tp->t_mgt_status, len);
1606 SBP2_BUF_WR_DONE(tp, buf, reqh, SBP2_BUS_BUF_SUCCESS);
1609 mutex_enter(&tp->t_mutex);
1610 tp->t_mgt_status_rcvd = B_TRUE;
1611 cv_signal(&tp->t_mgt_status_cv);
1612 mutex_exit(&tp->t_mutex);
1660 sbp2_tgt_t *tp = sp->s_tgt;
1673 SBP2_BUF_WR_DONE(tp, buf, reqh, SBP2_BUS_BUF_ELENGTH);
1674 tp->t_stat.stat_status_short++;
1686 if (orbp == tp->t_mgt_orb_buf.bb_baddr) {
1687 bzero(&tp->t_mgt_status, sizeof (sbp2_status_t));
1688 bcopy((*bpp)->b_rptr, &tp->t_mgt_status, len);
1690 SBP2_BUF_WR_DONE(tp, buf, reqh, SBP2_BUS_BUF_SUCCESS);
1693 mutex_enter(&tp->t_mutex);
1694 tp->t_mgt_status_rcvd = B_TRUE;
1695 cv_signal(&tp->t_mgt_status_cv);
1696 mutex_exit(&tp->t_mutex);
1703 SBP2_BUF_WR_DONE(tp, buf, reqh, SBP2_BUS_BUF_FAILURE);
1704 tp->t_stat.stat_status_unsolicited++;
1710 SBP2_BUF_WR_DONE(tp, buf, reqh, SBP2_BUS_BUF_FAILURE);
1711 tp->t_stat.stat_status_notask++;
1726 SBP2_BUF_WR_DONE(tp, buf, reqh, SBP2_BUS_BUF_SUCCESS);
1738 tp->t_stat.stat_status_dead++;
1766 sbp2_mgt_agent_acquire(sbp2_tgt_t *tp)
1768 mutex_enter(&tp->t_mutex);
1769 while (tp->t_mgt_agent_acquired) {
1770 cv_wait(&tp->t_mgt_agent_cv, &tp->t_mutex);
1772 tp->t_mgt_agent_acquired = B_TRUE;
1773 mutex_exit(&tp->t_mutex);
1777 sbp2_mgt_agent_release(sbp2_tgt_t *tp)
1779 mutex_enter(&tp->t_mutex);
1780 tp->t_mgt_agent_acquired = B_FALSE;
1781 cv_signal(&tp->t_mgt_agent_cv); /* wake next waiter */
1782 mutex_exit(&tp->t_mutex);