Lines 435-447
enc_ioctl(struct cdev *dev, u_long cmd, caddr_t arg_addr, int flag,
Link Here
|
435 |
* configuration generation. We need these ioctls |
435 |
* configuration generation. We need these ioctls |
436 |
* to also pass in/out a generation number. |
436 |
* to also pass in/out a generation number. |
437 |
*/ |
437 |
*/ |
438 |
sx_slock(&enc->enc_cache_lock); |
|
|
439 |
switch (cmd) { |
438 |
switch (cmd) { |
440 |
case ENCIOC_GETNELM: |
439 |
case ENCIOC_GETNELM: |
|
|
440 |
sx_slock(&enc->enc_cache_lock); |
441 |
error = copyout(&cache->nelms, addr, sizeof (cache->nelms)); |
441 |
error = copyout(&cache->nelms, addr, sizeof (cache->nelms)); |
442 |
break; |
442 |
break; |
443 |
|
443 |
|
444 |
case ENCIOC_GETELMMAP: |
444 |
case ENCIOC_GETELMMAP: |
|
|
445 |
sx_slock(&enc->enc_cache_lock); |
445 |
for (uelm = addr, i = 0; i != cache->nelms; i++) { |
446 |
for (uelm = addr, i = 0; i != cache->nelms; i++) { |
446 |
encioc_element_t kelm; |
447 |
encioc_element_t kelm; |
447 |
kelm.elm_idx = i; |
448 |
kelm.elm_idx = i; |
Lines 454-459
enc_ioctl(struct cdev *dev, u_long cmd, caddr_t arg_addr, int flag,
Link Here
|
454 |
break; |
455 |
break; |
455 |
|
456 |
|
456 |
case ENCIOC_GETENCSTAT: |
457 |
case ENCIOC_GETENCSTAT: |
|
|
458 |
sx_slock(&enc->enc_cache_lock); |
457 |
cam_periph_lock(periph); |
459 |
cam_periph_lock(periph); |
458 |
error = enc->enc_vec.get_enc_status(enc, 1); |
460 |
error = enc->enc_vec.get_enc_status(enc, 1); |
459 |
if (error) { |
461 |
if (error) { |
Lines 463-484
enc_ioctl(struct cdev *dev, u_long cmd, caddr_t arg_addr, int flag,
Link Here
|
463 |
tmp = cache->enc_status; |
465 |
tmp = cache->enc_status; |
464 |
cam_periph_unlock(periph); |
466 |
cam_periph_unlock(periph); |
465 |
error = copyout(&tmp, addr, sizeof(tmp)); |
467 |
error = copyout(&tmp, addr, sizeof(tmp)); |
|
|
468 |
// XXX Why this next line? |
466 |
cache->enc_status = tmp; |
469 |
cache->enc_status = tmp; |
467 |
break; |
470 |
break; |
468 |
|
471 |
|
469 |
case ENCIOC_SETENCSTAT: |
472 |
case ENCIOC_SETENCSTAT: |
470 |
error = copyin(addr, &tmp, sizeof(tmp)); |
473 |
error = copyin(addr, &tmp, sizeof(tmp)); |
471 |
if (error) |
474 |
if (error) |
472 |
break; |
475 |
return (error); |
473 |
cam_periph_lock(periph); |
476 |
cam_periph_lock(periph); |
474 |
error = enc->enc_vec.set_enc_status(enc, tmp, 1); |
477 |
error = enc->enc_vec.set_enc_status(enc, tmp, 1); |
475 |
cam_periph_unlock(periph); |
478 |
cam_periph_unlock(periph); |
476 |
break; |
479 |
return (error); /* Return early so as not to double-unlock */ |
477 |
|
480 |
|
478 |
case ENCIOC_GETSTRING: |
481 |
case ENCIOC_GETSTRING: |
479 |
case ENCIOC_SETSTRING: |
482 |
case ENCIOC_SETSTRING: |
480 |
case ENCIOC_GETENCNAME: |
483 |
case ENCIOC_GETENCNAME: |
481 |
case ENCIOC_GETENCID: |
484 |
case ENCIOC_GETENCID: |
|
|
485 |
sx_slock(&enc->enc_cache_lock); |
482 |
if (enc->enc_vec.handle_string == NULL) { |
486 |
if (enc->enc_vec.handle_string == NULL) { |
483 |
error = EINVAL; |
487 |
error = EINVAL; |
484 |
break; |
488 |
break; |
Lines 496-501
enc_ioctl(struct cdev *dev, u_long cmd, caddr_t arg_addr, int flag,
Link Here
|
496 |
break; |
500 |
break; |
497 |
|
501 |
|
498 |
case ENCIOC_GETELMSTAT: |
502 |
case ENCIOC_GETELMSTAT: |
|
|
503 |
sx_slock(&enc->enc_cache_lock); |
499 |
error = copyin(addr, &elms, sizeof(elms)); |
504 |
error = copyin(addr, &elms, sizeof(elms)); |
500 |
if (error) |
505 |
if (error) |
501 |
break; |
506 |
break; |
Lines 512-517
enc_ioctl(struct cdev *dev, u_long cmd, caddr_t arg_addr, int flag,
Link Here
|
512 |
break; |
517 |
break; |
513 |
|
518 |
|
514 |
case ENCIOC_GETELMDESC: |
519 |
case ENCIOC_GETELMDESC: |
|
|
520 |
sx_slock(&enc->enc_cache_lock); |
515 |
error = copyin(addr, &elmd, sizeof(elmd)); |
521 |
error = copyin(addr, &elmd, sizeof(elmd)); |
516 |
if (error) |
522 |
if (error) |
517 |
break; |
523 |
break; |
Lines 529-534
enc_ioctl(struct cdev *dev, u_long cmd, caddr_t arg_addr, int flag,
Link Here
|
529 |
break; |
535 |
break; |
530 |
|
536 |
|
531 |
case ENCIOC_GETELMDEVNAMES: |
537 |
case ENCIOC_GETELMDEVNAMES: |
|
|
538 |
sx_slock(&enc->enc_cache_lock); |
532 |
if (enc->enc_vec.get_elm_devnames == NULL) { |
539 |
if (enc->enc_vec.get_elm_devnames == NULL) { |
533 |
error = EINVAL; |
540 |
error = EINVAL; |
534 |
break; |
541 |
break; |
Lines 549-554
enc_ioctl(struct cdev *dev, u_long cmd, caddr_t arg_addr, int flag,
Link Here
|
549 |
break; |
556 |
break; |
550 |
|
557 |
|
551 |
case ENCIOC_SETELMSTAT: |
558 |
case ENCIOC_SETELMSTAT: |
|
|
559 |
sx_slock(&enc->enc_cache_lock); |
552 |
error = copyin(addr, &elms, sizeof(elms)); |
560 |
error = copyin(addr, &elms, sizeof(elms)); |
553 |
if (error) |
561 |
if (error) |
554 |
break; |
562 |
break; |
Lines 557-570
enc_ioctl(struct cdev *dev, u_long cmd, caddr_t arg_addr, int flag,
Link Here
|
557 |
error = EINVAL; |
565 |
error = EINVAL; |
558 |
break; |
566 |
break; |
559 |
} |
567 |
} |
|
|
568 |
sx_sunlock(&enc->enc_cache_lock); |
560 |
cam_periph_lock(periph); |
569 |
cam_periph_lock(periph); |
561 |
error = enc->enc_vec.set_elm_status(enc, &elms, 1); |
570 |
error = enc->enc_vec.set_elm_status(enc, &elms, 1); |
562 |
cam_periph_unlock(periph); |
571 |
cam_periph_unlock(periph); |
563 |
|
572 |
|
564 |
break; |
573 |
return (error); /* Return early so as not to double-unlock */ |
565 |
|
574 |
|
566 |
case ENCIOC_INIT: |
575 |
case ENCIOC_INIT: |
567 |
|
576 |
sx_slock(&enc->enc_cache_lock); |
568 |
cam_periph_lock(periph); |
577 |
cam_periph_lock(periph); |
569 |
error = enc->enc_vec.init_enc(enc); |
578 |
error = enc->enc_vec.init_enc(enc); |
570 |
cam_periph_unlock(periph); |
579 |
cam_periph_unlock(periph); |
Lines 574-580
enc_ioctl(struct cdev *dev, u_long cmd, caddr_t arg_addr, int flag,
Link Here
|
574 |
cam_periph_lock(periph); |
583 |
cam_periph_lock(periph); |
575 |
error = cam_periph_ioctl(periph, cmd, arg_addr, enc_error); |
584 |
error = cam_periph_ioctl(periph, cmd, arg_addr, enc_error); |
576 |
cam_periph_unlock(periph); |
585 |
cam_periph_unlock(periph); |
577 |
break; |
586 |
return (error); |
578 |
} |
587 |
} |
579 |
sx_sunlock(&enc->enc_cache_lock); |
588 |
sx_sunlock(&enc->enc_cache_lock); |
580 |
return (error); |
589 |
return (error); |
Lines 802-807
enc_fsm_step(enc_softc_t *enc)
Link Here
|
802 |
} else |
811 |
} else |
803 |
xfer_len = 0; |
812 |
xfer_len = 0; |
804 |
|
813 |
|
|
|
814 |
// Why unlock enc->periph here? I think it's responsible for missed |
815 |
// wakeups. |
805 |
cam_periph_unlock(enc->periph); |
816 |
cam_periph_unlock(enc->periph); |
806 |
cur_state->done(enc, cur_state, ccb, &buf, error, xfer_len); |
817 |
cur_state->done(enc, cur_state, ccb, &buf, error, xfer_len); |
807 |
cam_periph_lock(enc->periph); |
818 |
cam_periph_lock(enc->periph); |