Lines Matching full:pf

2         pf.c    (c) 1997-8  Grant R. Guenther <grant@torque.net>
12 The behaviour of the pf driver can be altered by setting
70 (default "pf").
91 pf.drive0
92 pf.drive1
93 pf.drive2
94 pf.drive3
95 pf.cluster
96 pf.nice
98 In addition, you can use the parameter pf.disable to disable
118 #define PF_NAME "pf"
248 static int pf_identify(struct pf_unit *pf);
249 static void pf_lock(struct pf_unit *pf, int func);
250 static void pf_eject(struct pf_unit *pf);
290 struct pf_unit *pf; in pf_init_units() local
294 for (unit = 0, pf = units; unit < PF_UNITS; unit++, pf++) { in pf_init_units()
301 disk->queue = blk_mq_init_sq_queue(&pf->tag_set, &pf_mq_ops, in pf_init_units()
309 INIT_LIST_HEAD(&pf->rq_list); in pf_init_units()
310 disk->queue->queuedata = pf; in pf_init_units()
313 pf->disk = disk; in pf_init_units()
314 pf->pi = &pf->pia; in pf_init_units()
315 pf->media_status = PF_NM; in pf_init_units()
316 pf->drive = (*drives[unit])[D_SLV]; in pf_init_units()
317 pf->lun = (*drives[unit])[D_LUN]; in pf_init_units()
318 snprintf(pf->name, PF_NAMELEN, "%s%d", name, unit); in pf_init_units()
321 strcpy(disk->disk_name, pf->name); in pf_init_units()
331 struct pf_unit *pf = bdev->bd_disk->private_data; in pf_open() local
335 pf_identify(pf); in pf_open()
338 if (pf->media_status == PF_NM) in pf_open()
342 if ((pf->media_status == PF_RO) && (mode & FMODE_WRITE)) in pf_open()
346 pf->access++; in pf_open()
347 if (pf->removable) in pf_open()
348 pf_lock(pf, 1); in pf_open()
356 struct pf_unit *pf = bdev->bd_disk->private_data; in pf_getgeo() local
357 sector_t capacity = get_capacity(pf->disk); in pf_getgeo()
374 struct pf_unit *pf = bdev->bd_disk->private_data; in pf_ioctl() local
379 if (pf->access != 1) in pf_ioctl()
382 pf_eject(pf); in pf_ioctl()
390 struct pf_unit *pf = disk->private_data; in pf_release() local
393 if (pf->access <= 0) { in pf_release()
399 pf->access--; in pf_release()
401 if (!pf->access && pf->removable) in pf_release()
402 pf_lock(pf, 0); in pf_release()
412 static inline int status_reg(struct pf_unit *pf) in status_reg() argument
414 return pi_read_regr(pf->pi, 1, 6); in status_reg()
417 static inline int read_reg(struct pf_unit *pf, int reg) in read_reg() argument
419 return pi_read_regr(pf->pi, 0, reg); in read_reg()
422 static inline void write_reg(struct pf_unit *pf, int reg, int val) in write_reg() argument
424 pi_write_regr(pf->pi, 0, reg, val); in write_reg()
427 static int pf_wait(struct pf_unit *pf, int go, int stop, char *fun, char *msg) in pf_wait() argument
432 while ((((r = status_reg(pf)) & go) || (stop && (!(r & stop)))) in pf_wait()
437 s = read_reg(pf, 7); in pf_wait()
438 e = read_reg(pf, 1); in pf_wait()
439 p = read_reg(pf, 2); in pf_wait()
445 pf->name, fun, msg, r, s, e, j, p); in pf_wait()
451 static int pf_command(struct pf_unit *pf, char *cmd, int dlen, char *fun) in pf_command() argument
453 pi_connect(pf->pi); in pf_command()
455 write_reg(pf, 6, 0xa0+0x10*pf->drive); in pf_command()
457 if (pf_wait(pf, STAT_BUSY | STAT_DRQ, 0, fun, "before command")) { in pf_command()
458 pi_disconnect(pf->pi); in pf_command()
462 write_reg(pf, 4, dlen % 256); in pf_command()
463 write_reg(pf, 5, dlen / 256); in pf_command()
464 write_reg(pf, 7, 0xa0); /* ATAPI packet command */ in pf_command()
466 if (pf_wait(pf, STAT_BUSY, STAT_DRQ, fun, "command DRQ")) { in pf_command()
467 pi_disconnect(pf->pi); in pf_command()
471 if (read_reg(pf, 2) != 1) { in pf_command()
472 printk("%s: %s: command phase error\n", pf->name, fun); in pf_command()
473 pi_disconnect(pf->pi); in pf_command()
477 pi_write_block(pf->pi, cmd, 12); in pf_command()
482 static int pf_completion(struct pf_unit *pf, char *buf, char *fun) in pf_completion() argument
486 r = pf_wait(pf, STAT_BUSY, STAT_DRQ | STAT_READY | STAT_ERR, in pf_completion()
489 if ((read_reg(pf, 2) & 2) && (read_reg(pf, 7) & STAT_DRQ)) { in pf_completion()
490 n = (((read_reg(pf, 4) + 256 * read_reg(pf, 5)) + in pf_completion()
492 pi_read_block(pf->pi, buf, n); in pf_completion()
495 s = pf_wait(pf, STAT_BUSY, STAT_READY | STAT_ERR, fun, "data done"); in pf_completion()
497 pi_disconnect(pf->pi); in pf_completion()
502 static void pf_req_sense(struct pf_unit *pf, int quiet) in pf_req_sense() argument
505 { ATAPI_REQ_SENSE, pf->lun << 5, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0 }; in pf_req_sense()
509 r = pf_command(pf, rs_cmd, 16, "Request sense"); in pf_req_sense()
512 pf_completion(pf, buf, "Request sense"); in pf_req_sense()
516 pf->name, buf[2] & 0xf, buf[12], buf[13]); in pf_req_sense()
519 static int pf_atapi(struct pf_unit *pf, char *cmd, int dlen, char *buf, char *fun) in pf_atapi() argument
523 r = pf_command(pf, cmd, dlen, fun); in pf_atapi()
526 r = pf_completion(pf, buf, fun); in pf_atapi()
528 pf_req_sense(pf, !fun); in pf_atapi()
533 static void pf_lock(struct pf_unit *pf, int func) in pf_lock() argument
535 char lo_cmd[12] = { ATAPI_LOCK, pf->lun << 5, 0, 0, func, 0, 0, 0, 0, 0, 0, 0 }; in pf_lock()
537 pf_atapi(pf, lo_cmd, 0, pf_scratch, func ? "lock" : "unlock"); in pf_lock()
540 static void pf_eject(struct pf_unit *pf) in pf_eject() argument
542 char ej_cmd[12] = { ATAPI_DOOR, pf->lun << 5, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0 }; in pf_eject()
544 pf_lock(pf, 0); in pf_eject()
545 pf_atapi(pf, ej_cmd, 0, pf_scratch, "eject"); in pf_eject()
560 static int pf_reset(struct pf_unit *pf) in pf_reset() argument
565 pi_connect(pf->pi); in pf_reset()
566 write_reg(pf, 6, 0xa0+0x10*pf->drive); in pf_reset()
567 write_reg(pf, 7, 8); in pf_reset()
572 while ((k++ < PF_RESET_TMO) && (status_reg(pf) & STAT_BUSY)) in pf_reset()
577 flg &= (read_reg(pf, i + 1) == expect[i]); in pf_reset()
580 printk("%s: Reset (%d) signature = ", pf->name, k); in pf_reset()
582 printk("%3x", read_reg(pf, i + 1)); in pf_reset()
588 pi_disconnect(pf->pi); in pf_reset()
592 static void pf_mode_sense(struct pf_unit *pf) in pf_mode_sense() argument
595 { ATAPI_MODE_SENSE, pf->lun << 5, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0 }; in pf_mode_sense()
598 pf_atapi(pf, ms_cmd, 8, buf, "mode sense"); in pf_mode_sense()
599 pf->media_status = PF_RW; in pf_mode_sense()
601 pf->media_status = PF_RO; in pf_mode_sense()
628 static void pf_get_capacity(struct pf_unit *pf) in pf_get_capacity() argument
630 char rc_cmd[12] = { ATAPI_CAPACITY, pf->lun << 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; in pf_get_capacity()
634 if (pf_atapi(pf, rc_cmd, 8, buf, "get capacity")) { in pf_get_capacity()
635 pf->media_status = PF_NM; in pf_get_capacity()
638 set_capacity(pf->disk, xl(buf, 0) + 1); in pf_get_capacity()
641 set_capacity(pf->disk, 0); in pf_get_capacity()
645 pf->name, pf->drive, pf->lun, bs); in pf_get_capacity()
649 static int pf_identify(struct pf_unit *pf) in pf_identify() argument
655 { ATAPI_IDENTIFY, pf->lun << 5, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0 }; in pf_identify()
658 s = pf_atapi(pf, id_cmd, 36, buf, "identify"); in pf_identify()
666 pf->name, pf->drive, pf->lun, dt); in pf_identify()
673 pf->removable = (buf[1] & 0x80); in pf_identify()
675 pf_mode_sense(pf); in pf_identify()
676 pf_mode_sense(pf); in pf_identify()
677 pf_mode_sense(pf); in pf_identify()
679 pf_get_capacity(pf); in pf_identify()
682 pf->name, mf, id, ms[pf->drive], pf->lun, dt); in pf_identify()
683 if (pf->removable) in pf_identify()
685 if (pf->media_status == PF_NM) in pf_identify()
688 if (pf->media_status == PF_RO) in pf_identify()
691 (unsigned long long)get_capacity(pf->disk)); in pf_identify()
699 static int pf_probe(struct pf_unit *pf) in pf_probe() argument
701 if (pf->drive == -1) { in pf_probe()
702 for (pf->drive = 0; pf->drive <= 1; pf->drive++) in pf_probe()
703 if (!pf_reset(pf)) { in pf_probe()
704 if (pf->lun != -1) in pf_probe()
705 return pf_identify(pf); in pf_probe()
707 for (pf->lun = 0; pf->lun < 8; pf->lun++) in pf_probe()
708 if (!pf_identify(pf)) in pf_probe()
712 if (pf_reset(pf)) in pf_probe()
714 if (pf->lun != -1) in pf_probe()
715 return pf_identify(pf); in pf_probe()
716 for (pf->lun = 0; pf->lun < 8; pf->lun++) in pf_probe()
717 if (!pf_identify(pf)) in pf_probe()
725 struct pf_unit *pf = units; in pf_detect() local
738 if (pi_init(pf->pi, 1, -1, -1, -1, -1, -1, pf_scratch, PI_PF, in pf_detect()
739 verbose, pf->name)) { in pf_detect()
740 if (!pf_probe(pf) && pf->disk) { in pf_detect()
741 pf->present = 1; in pf_detect()
744 pi_release(pf->pi); in pf_detect()
748 for (unit = 0; unit < PF_UNITS; unit++, pf++) { in pf_detect()
752 if (pi_init(pf->pi, 0, conf[D_PRT], conf[D_MOD], in pf_detect()
754 pf_scratch, PI_PF, verbose, pf->name)) { in pf_detect()
755 if (pf->disk && !pf_probe(pf)) { in pf_detect()
756 pf->present = 1; in pf_detect()
759 pi_release(pf->pi); in pf_detect()
766 for (pf = units, unit = 0; unit < PF_UNITS; pf++, unit++) { in pf_detect()
767 if (!pf->disk) in pf_detect()
769 blk_cleanup_queue(pf->disk->queue); in pf_detect()
770 pf->disk->queue = NULL; in pf_detect()
771 blk_mq_free_tag_set(&pf->tag_set); in pf_detect()
772 put_disk(pf->disk); in pf_detect()
780 static int pf_start(struct pf_unit *pf, int cmd, int b, int c) in pf_start() argument
783 char io_cmd[12] = { cmd, pf->lun << 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; in pf_start()
793 i = pf_command(pf, io_cmd, c * 512, "start i/o"); in pf_start()
809 struct pf_unit *pf; in set_next_request() local
813 pf = &units[pf_queue]; in set_next_request()
816 if (pf->present && !list_empty(&pf->rq_list)) { in set_next_request()
817 pf_req = list_first_entry(&pf->rq_list, struct request, in set_next_request()
875 struct pf_unit *pf = hctx->queue->queuedata; in pf_queue_rq() local
878 list_add_tail(&bd->rq->queuelist, &pf->rq_list); in pf_queue_rq()
1023 struct pf_unit *pf; in pf_init() local
1036 for (pf = units, unit = 0; unit < PF_UNITS; pf++, unit++) { in pf_init()
1037 if (!pf->disk) in pf_init()
1039 blk_cleanup_queue(pf->disk->queue); in pf_init()
1040 blk_mq_free_tag_set(&pf->tag_set); in pf_init()
1041 put_disk(pf->disk); in pf_init()
1046 for (pf = units, unit = 0; unit < PF_UNITS; pf++, unit++) { in pf_init()
1047 struct gendisk *disk = pf->disk; in pf_init()
1049 if (!pf->present) in pf_init()
1051 disk->private_data = pf; in pf_init()
1059 struct pf_unit *pf; in pf_exit() local
1062 for (pf = units, unit = 0; unit < PF_UNITS; pf++, unit++) { in pf_exit()
1063 if (!pf->disk) in pf_exit()
1066 if (pf->present) in pf_exit()
1067 del_gendisk(pf->disk); in pf_exit()
1069 blk_cleanup_queue(pf->disk->queue); in pf_exit()
1070 blk_mq_free_tag_set(&pf->tag_set); in pf_exit()
1071 put_disk(pf->disk); in pf_exit()
1073 if (pf->present) in pf_exit()
1074 pi_release(pf->pi); in pf_exit()