Home | History | Annotate | Download | only in usb

Lines Matching refs:cn

328 	struct ucom_cnstate * const cn = sc->sc_cn;
333 KASSERT(ucom_xfer_done(cn->cn_xfer_out));
335 usbd_get_xfer_status(cn->cn_xfer_out, NULL, NULL, &cnt, &err);
337 u_int cnconsout = atomic_load_relaxed(&cn->cn_cons_out);
347 * Do not move cn->cn_cons_out so that this output is
354 callout_schedule(&cn->cn_callout, 10);
359 atomic_store_release(&cn->cn_cons_out, cnconsout);
381 KASSERT(db_active || atomic_load_relaxed(&cn->cn_sending) == 1);
396 struct ucom_cnstate * const cn = sc->sc_cn;
397 u_char *ub_out = usbd_get_buffer(cn->cn_xfer_out);
400 u_int prodout = atomic_load_acquire(&cn->cn_prod_out);
401 u_int consout = atomic_load_relaxed(&cn->cn_cons_out);
402 u_int consout_idx = consout % cn->cn_buf_out_size;
408 KASSERT(db_active || atomic_load_relaxed(&cn->cn_sending) == 1);
413 atomic_store_relaxed(&cn->cn_sending, 0);
417 u_int cntidx = (consout_idx + cnt) % cn->cn_buf_out_size;
419 out = cn->cn_buf_out + consout_idx;
428 u_int top_size = cn->cn_buf_out_size - consout_idx;
430 memcpy(cn->cn_linear_buf_out,
431 cn->cn_buf_out + consout_idx, top_size);
433 memcpy(cn->cn_linear_buf_out + top_size,
434 cn->cn_buf_out, cntidx);
436 out = cn->cn_linear_buf_out;
445 KASSERT(ucom_xfer_done(cn->cn_xfer_out));
448 * cn->cn_cons_out is increased after output succeeds,
451 usbd_setup_xfer(cn->cn_xfer_out, sc, ub_out, cnt,
453 err = usbd_transfer(cn->cn_xfer_out);
460 * Otherwise rely on cn->cn_sending to serialize transfers
463 !ucom_xfer_done(cn->cn_xfer_out))
483 struct ucom_cnstate * const cn = sc->sc_cn;
487 * hence we only proceed if cn->cn_sending was 0.
489 * reuse cn->cn_xfer_out before it completes the
492 if (atomic_cas_32(&cn->cn_sending, 0, 1) == 0)
500 struct ucom_cnstate * const cn = sc->sc_cn;
503 softint_schedule(cn->cn_si);
510 struct ucom_cnstate * const cn = sc->sc_cn;
512 if (cn == NULL)
515 return cn->cn_polling;
560 struct ucom_cnstate * const cn = sc->sc_cn;
562 cn->cn_dev = ucom_cnops.cn_dev;
564 cn->cn_si = softint_establish(SOFTINT_USB, ucom_cnput_softintr, sc);
566 callout_init(&cn->cn_callout, CALLOUT_MPSAFE);
567 callout_setfunc(&cn->cn_callout, ucom_cnput_callout, sc);
569 cn->cn_buf_in = kmem_alloc(sc->sc_ibufsize, KM_SLEEP);
570 cn->cn_prod_in = 0;
571 cn->cn_cons_in = 0;
579 cn->cn_buf_out_size = MAX(sc->sc_obufsize, PAGE_SIZE);
580 cn->cn_buf_out = kmem_alloc(cn->cn_buf_out_size, KM_SLEEP);
581 cn->cn_prod_out = 0;
582 cn->cn_cons_out = 0;
584 sc->sc_obufsize, 0, 0, &cn->cn_xfer_out) != 0) {
589 cn->cn_linear_buf_out = kmem_alloc(sc->sc_obufsize, KM_SLEEP);
592 cn_init_magic(&cn->cn_magic_state);
855 * cn->cn_xfer_out is properly aborted.
1791 struct ucom_cnstate *cn = sc->sc_cn;
1793 if (cn && cn->cn_magic_req) {
1795 cn->cn_magic_req = false;
1889 struct ucom_cnstate * const cn = sc->sc_cn;
1890 u_int prodin = cn->cn_prod_in;
1891 u_int consin = cn->cn_cons_in;
1916 memcpy(cn->cn_buf_in + prodin_idx, cp, cnt);
1917 cn->cn_prod_in += cnt;
1931 memcpy(cn->cn_buf_in + prodin_idx, cp, cnt);
1932 cn->cn_prod_in += cnt;
1947 KASSERT(cn->cn_prod_in + cnt <= sc->sc_ibufsize);
1949 memcpy(cn->cn_buf_in + prodin_idx, cp, cnt);
1950 cn->cn_prod_in += cnt;
2132 struct ucom_cnstate * const cn = sc->sc_cn;
2135 if (cn->cn_cons_in == cn->cn_prod_in) {
2156 if (cn->cn_cons_in != cn->cn_prod_in) {
2157 c = cn->cn_buf_in[cn->cn_cons_in % sc->sc_ibufsize];
2158 cn->cn_cons_in++;
2182 struct ucom_cnstate * const cn = sc->sc_cn;
2184 u_int cnprodout = cn->cn_prod_out;
2185 u_int cnconsout = atomic_load_relaxed(&cn->cn_cons_out);
2186 size_t bufsz = cn->cn_buf_out_size;
2189 * Check for cn->cn_buf_out rini buffer overflow.
2193 cn->cn_buf_out[cnprodout % bufsz] = (u_char)(out & 0xff);
2197 * incrementing cn->cn_prod_out
2199 atomic_store_release(&cn->cn_prod_out, cnprodout + 1);
2222 softint_schedule(cn->cn_si);
2237 struct ucom_cnstate * const cn = sc->sc_cn;
2241 cn->cn_polling = true;
2249 while(!db_active && atomic_load_relaxed(&cn->cn_sending) == 1)
2252 cn->cn_polling = false;
2259 struct ucom_cnstate * const cn = sc->sc_cn;
2261 usbd_destroy_xfer(cn->cn_xfer_out);
2263 callout_halt(&cn->cn_callout, NULL);
2264 callout_destroy(&cn->cn_callout);
2266 softint_disestablish(cn->cn_si);
2268 if (cn->cn_buf_in)
2269 kmem_free(cn->cn_buf_in, sc->sc_ibufsize);
2271 if (cn->cn_buf_out)
2272 kmem_free(cn->cn_buf_out, cn->cn_buf_out_size);
2274 if (cn->cn_linear_buf_out)
2275 kmem_free(cn->cn_linear_buf_out, sc->sc_obufsize);
2277 kmem_free(cn, sizeof(*cn));
2287 struct ucom_cnstate * const cn = sc->sc_cn;
2297 while (atomic_load_relaxed(&cn->cn_sending) == 1)
2300 cn_destroy_magic(&cn->cn_magic_state);
2313 struct ucom_cnstate *cn = sc->sc_cn;
2314 struct cnm_state *s = &cn->cn_magic_state;
2316 if (cn == NULL || db_active)
2324 cn->cn_magic_req = true;