Lines Matching refs:pd
68 nextreq(struct pud_dev *pd)
72 mutex_enter(&pd->pd_mtx);
73 rv = pd->pd_nextreq++;
74 mutex_exit(&pd->pd_mtx);
83 struct pud_dev *pd = this;
87 mutex_enter(&pd->pd_mtx);
89 if (TAILQ_EMPTY(&pd->pd_waitq_req)) {
95 error = cv_wait_sig(&pd->pd_waitq_req_cv, &pd->pd_mtx);
102 putp = TAILQ_FIRST(&pd->pd_waitq_req);
103 TAILQ_REMOVE(&pd->pd_waitq_req, putp, pt_entries);
107 mutex_exit(&pd->pd_mtx);
121 struct pud_dev *pd = this;
124 mutex_enter(&pd->pd_mtx);
125 TAILQ_INSERT_TAIL(&pd->pd_waitq_resp, putp, pt_entries);
126 mutex_exit(&pd->pd_mtx);
133 struct pud_dev *pd = this;
136 mutex_enter(&pd->pd_mtx);
137 rv = pd->pd_waitcount;
138 mutex_exit(&pd->pd_mtx);
144 pudop_dev(struct pud_dev *pd, struct pud_req *pdr)
149 mutex_enter(&pd->pd_mtx);
150 TAILQ_FOREACH(putp, &pd->pd_waitq_resp, pt_entries)
154 mutex_exit(&pd->pd_mtx);
157 TAILQ_REMOVE(&pd->pd_waitq_resp, putp, pt_entries);
158 mutex_exit(&pd->pd_mtx);
176 pudconf_reg(struct pud_dev *pd, struct pud_conf_reg *pcr)
201 pd->pd_dev = pcr->pm_regdev;
207 pudop_conf(struct pud_dev *pd, struct pud_req *pdr)
213 rv = pudconf_reg(pd, (struct pud_conf_reg *)pdr);
230 struct pud_dev *pd = this;
240 rv = pudop_dev(pd, pdr);
243 rv = pudop_conf(pd, pdr);
257 struct pud_dev *pd = this;
261 LIST_REMOVE(pd, pd_entries);
264 mutex_enter(&pd->pd_mtx);
265 while ((putp = TAILQ_FIRST(&pd->pd_waitq_req)) != NULL) {
268 TAILQ_REMOVE(&pd->pd_waitq_req, putp, pt_entries);
271 while ((putp = TAILQ_FIRST(&pd->pd_waitq_resp)) != NULL) {
274 TAILQ_REMOVE(&pd->pd_waitq_resp, putp, pt_entries);
276 if (pd->pd_waitcount)
277 cv_wait(&pd->pd_draincv, &pd->pd_mtx);
278 KASSERT(pd->pd_waitcount == 0);
280 mutex_exit(&pd->pd_mtx);
282 if (pd->pd_dev)
285 putter_detach(pd->pd_pi);
287 mutex_destroy(&pd->pd_mtx);
288 cv_destroy(&pd->pd_draincv);
289 cv_destroy(&pd->pd_waitq_req_cv);
290 kmem_free(pd, sizeof(struct pud_dev));
298 struct pud_dev *pd;
301 LIST_FOREACH(pd, &pudlist, pd_entries)
302 if (major(pd->pd_dev) == major(dev))
306 return pd;
315 struct pud_dev *pd;
317 pd = pud_dev2pud(dev);
318 if (pd == NULL)
323 pdr->pdr_reqid = nextreq(pd);
331 mutex_enter(&pd->pd_mtx);
332 pd->pd_waitcount++;
334 TAILQ_INSERT_TAIL(&pd->pd_waitq_req, &put, pt_entries);
335 putter_notify(pd->pd_pi);
336 cv_broadcast(&pd->pd_waitq_req_cv);
337 cv_wait(&put.pt_cv, &pd->pd_mtx);
339 if (--pd->pd_waitcount == 0)
340 cv_signal(&pd->pd_draincv);
341 mutex_exit(&pd->pd_mtx);
351 struct pud_dev *pd;
353 pd = kmem_zalloc(sizeof(struct pud_dev), KM_SLEEP);
354 pd->pd_pi = putter_attach(curlwp->l_proc->p_pid, fd, pd, &pud_putter);
355 if (pd->pd_pi == NULL) {
356 kmem_free(pd, sizeof(struct pud_dev));
359 pd->pd_dev = NODEV;
361 mutex_init(&pd->pd_mtx, MUTEX_DEFAULT, IPL_NONE);
362 TAILQ_INIT(&pd->pd_waitq_req);
363 TAILQ_INIT(&pd->pd_waitq_resp);
364 cv_init(&pd->pd_waitq_req_cv, "pudreq");
365 cv_init(&pd->pd_draincv, "pudrain");
368 LIST_INSERT_HEAD(&pudlist, pd, pd_entries);