Lines Matching +full:multi +full:- +full:cluster
2 pf.c (c) 1997-8 Grant R. Guenther <grant@torque.net>
5 This is the high-level driver for parallel port ATAPI disk
17 drive1 1-7 integers as follows:
37 <mod> this can be -1 to choose the best mode, or one
39 (-1 if not given)
43 choose the slave, -1 (the default) to choose the
53 LUN. (default -1)
56 go more slowly. -1 sets a default value that
60 this to zero will speed up the device. (default -1)
72 cluster The driver will attempt to aggregate requests
73 for adjacent blocks into larger multi-block
74 clusters. The maximum cluster size (in 512
95 pf.cluster
132 static int cluster = 64; variable
136 static int drive0[7] = { 0, 0, 0, -1, -1, -1, -1 };
137 static int drive1[7] = { 0, 0, 0, -1, -1, -1, -1 };
138 static int drive2[7] = { 0, 0, 0, -1, -1, -1, -1 };
139 static int drive3[7] = { 0, 0, 0, -1, -1, -1, -1 };
155 #include <linux/blk-mq.h>
166 module_param(cluster, int, 0);
186 #define PF_SPIN_DEL 50 /* spin delay in micro-seconds */
264 static int pf_run; /* sectors in current cluster */
267 static int pf_mask; /* stopper for pseudo-int */
289 struct pf_unit *pf = bdev->bd_disk->private_data; in pf_open()
295 ret = -ENODEV; in pf_open()
296 if (pf->media_status == PF_NM) in pf_open()
299 ret = -EROFS; in pf_open()
300 if ((pf->media_status == PF_RO) && (mode & FMODE_WRITE)) in pf_open()
304 pf->access++; in pf_open()
305 if (pf->removable) in pf_open()
314 struct pf_unit *pf = bdev->bd_disk->private_data; in pf_getgeo()
315 sector_t capacity = get_capacity(pf->disk); in pf_getgeo()
318 geo->cylinders = sector_div(capacity, PF_FD_HDS * PF_FD_SPT); in pf_getgeo()
319 geo->heads = PF_FD_HDS; in pf_getgeo()
320 geo->sectors = PF_FD_SPT; in pf_getgeo()
322 geo->cylinders = sector_div(capacity, PF_HD_HDS * PF_HD_SPT); in pf_getgeo()
323 geo->heads = PF_HD_HDS; in pf_getgeo()
324 geo->sectors = PF_HD_SPT; in pf_getgeo()
332 struct pf_unit *pf = bdev->bd_disk->private_data; in pf_ioctl()
335 return -EINVAL; in pf_ioctl()
337 if (pf->access != 1) in pf_ioctl()
338 return -EBUSY; in pf_ioctl()
348 struct pf_unit *pf = disk->private_data; in pf_release()
351 if (pf->access <= 0) { in pf_release()
357 pf->access--; in pf_release()
359 if (!pf->access && pf->removable) in pf_release()
372 return pi_read_regr(pf->pi, 1, 6); in status_reg()
377 return pi_read_regr(pf->pi, 0, reg); in read_reg()
382 pi_write_regr(pf->pi, 0, reg, val); in write_reg()
403 pf->name, fun, msg, r, s, e, j, p); in pf_wait()
411 pi_connect(pf->pi); in pf_command()
413 write_reg(pf, 6, 0xa0+0x10*pf->drive); in pf_command()
416 pi_disconnect(pf->pi); in pf_command()
417 return -1; in pf_command()
425 pi_disconnect(pf->pi); in pf_command()
426 return -1; in pf_command()
430 printk("%s: %s: command phase error\n", pf->name, fun); in pf_command()
431 pi_disconnect(pf->pi); in pf_command()
432 return -1; in pf_command()
435 pi_write_block(pf->pi, cmd, 12); in pf_command()
450 pi_read_block(pf->pi, buf, n); in pf_completion()
455 pi_disconnect(pf->pi); in pf_completion()
463 { ATAPI_REQ_SENSE, pf->lun << 5, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0 }; in pf_req_sense()
474 pf->name, buf[2] & 0xf, buf[12], buf[13]); in pf_req_sense()
493 char lo_cmd[12] = { ATAPI_LOCK, pf->lun << 5, 0, 0, func, 0, 0, 0, 0, 0, 0, 0 }; in pf_lock()
500 char ej_cmd[12] = { ATAPI_DOOR, pf->lun << 5, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0 }; in pf_eject()
523 pi_connect(pf->pi); in pf_reset()
524 write_reg(pf, 6, 0xa0+0x10*pf->drive); in pf_reset()
538 printk("%s: Reset (%d) signature = ", pf->name, k); in pf_reset()
546 pi_disconnect(pf->pi); in pf_reset()
547 return flg - 1; in pf_reset()
553 { ATAPI_MODE_SENSE, pf->lun << 5, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0 }; in pf_mode_sense()
557 pf->media_status = PF_RW; in pf_mode_sense()
559 pf->media_status = PF_RO; in pf_mode_sense()
572 j--; in xs()
588 char rc_cmd[12] = { ATAPI_CAPACITY, pf->lun << 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; in pf_get_capacity()
593 pf->media_status = PF_NM; in pf_get_capacity()
596 set_capacity(pf->disk, xl(buf, 0) + 1); in pf_get_capacity()
599 set_capacity(pf->disk, 0); in pf_get_capacity()
603 pf->name, pf->drive, pf->lun, bs); in pf_get_capacity()
613 { ATAPI_IDENTIFY, pf->lun << 5, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0 }; in pf_identify()
618 return -1; in pf_identify()
624 pf->name, pf->drive, pf->lun, dt); in pf_identify()
625 return -1; in pf_identify()
631 pf->removable = (buf[1] & 0x80); in pf_identify()
640 pf->name, mf, id, ms[pf->drive], pf->lun, dt); in pf_identify()
641 if (pf->removable) in pf_identify()
643 if (pf->media_status == PF_NM) in pf_identify()
646 if (pf->media_status == PF_RO) in pf_identify()
649 (unsigned long long)get_capacity(pf->disk)); in pf_identify()
659 if (pf->drive == -1) { in pf_probe()
660 for (pf->drive = 0; pf->drive <= 1; pf->drive++) in pf_probe()
662 if (pf->lun != -1) in pf_probe()
665 for (pf->lun = 0; pf->lun < 8; pf->lun++) in pf_probe()
671 return -1; in pf_probe()
672 if (pf->lun != -1) in pf_probe()
674 for (pf->lun = 0; pf->lun < 8; pf->lun++) in pf_probe()
678 return -ENODEV; in pf_probe()
686 char io_cmd[12] = { cmd, pf->lun << 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; in pf_start()
689 io_cmd[5 - i] = b & 0xff; in pf_start()
719 if (pf->present && !list_empty(&pf->rq_list)) { in set_next_request()
720 pf_req = list_first_entry(&pf->rq_list, struct request, in set_next_request()
722 list_del_init(&pf_req->queuelist); in set_next_request()
749 pf_current = pf_req->q->disk->private_data; in pf_request()
754 if (pf_block + pf_count > get_capacity(pf_req->q->disk)) { in pf_request()
760 pf_buf = bio_data(pf_req->bio); in pf_request()
765 pi_do_claimed(pf_current->pi, do_pf_read); in pf_request()
767 pi_do_claimed(pf_current->pi, do_pf_write); in pf_request()
778 struct pf_unit *pf = hctx->queue->queuedata; in pf_queue_rq()
781 list_add_tail(&bd->rq->queuelist, &pf->rq_list); in pf_queue_rq()
792 pf_count--; in pf_next_buf()
793 pf_run--; in pf_next_buf()
805 pf_buf = bio_data(pf_req->bio); in pf_next_buf()
821 /* detach from the calling context - in case the spinlock is held */
832 pi_disconnect(pf_current->pi); in do_pf_read_start()
835 pi_do_claimed(pf_current->pi, do_pf_read_start); in do_pf_read_start()
850 pi_disconnect(pf_current->pi); in do_pf_read_drq()
854 pi_do_claimed(pf_current->pi, do_pf_read_start); in do_pf_read_drq()
860 pi_read_block(pf_current->pi, pf_buf, 512); in do_pf_read_drq()
864 pi_disconnect(pf_current->pi); in do_pf_read_drq()
878 pi_disconnect(pf_current->pi); in do_pf_write_start()
881 pi_do_claimed(pf_current->pi, do_pf_write_start); in do_pf_write_start()
891 pi_disconnect(pf_current->pi); in do_pf_write_start()
894 pi_do_claimed(pf_current->pi, do_pf_write_start); in do_pf_write_start()
900 pi_write_block(pf_current->pi, pf_buf, 512); in do_pf_write_start()
911 pi_disconnect(pf_current->pi); in do_pf_write_done()
914 pi_do_claimed(pf_current->pi, do_pf_write_start); in do_pf_write_done()
920 pi_disconnect(pf_current->pi); in do_pf_write_done()
930 ret = blk_mq_alloc_sq_tag_set(&pf->tag_set, &pf_mq_ops, 1, in pf_init_unit()
935 disk = blk_mq_alloc_disk(&pf->tag_set, pf); in pf_init_unit()
940 disk->major = major; in pf_init_unit()
941 disk->first_minor = pf - units; in pf_init_unit()
942 disk->minors = 1; in pf_init_unit()
943 strcpy(disk->disk_name, pf->name); in pf_init_unit()
944 disk->fops = &pf_fops; in pf_init_unit()
945 disk->flags |= GENHD_FL_NO_PART; in pf_init_unit()
946 disk->events = DISK_EVENT_MEDIA_CHANGE; in pf_init_unit()
947 disk->private_data = pf; in pf_init_unit()
949 blk_queue_max_segments(disk->queue, cluster); in pf_init_unit()
950 blk_queue_bounce_limit(disk->queue, BLK_BOUNCE_HIGH); in pf_init_unit()
952 INIT_LIST_HEAD(&pf->rq_list); in pf_init_unit()
953 pf->disk = disk; in pf_init_unit()
954 pf->pi = &pf->pia; in pf_init_unit()
955 pf->media_status = PF_NM; in pf_init_unit()
956 pf->drive = (*drives[disk->first_minor])[D_SLV]; in pf_init_unit()
957 pf->lun = (*drives[disk->first_minor])[D_LUN]; in pf_init_unit()
958 snprintf(pf->name, PF_NAMELEN, "%s%d", name, disk->first_minor); in pf_init_unit()
960 if (!pi_init(pf->pi, autoprobe, port, mode, unit, protocol, delay, in pf_init_unit()
961 pf_scratch, PI_PF, verbose, pf->name)) { in pf_init_unit()
962 ret = -ENODEV; in pf_init_unit()
972 pf->present = 1; in pf_init_unit()
976 pi_release(pf->pi); in pf_init_unit()
978 put_disk(pf->disk); in pf_init_unit()
980 blk_mq_free_tag_set(&pf->tag_set); in pf_init_unit()
990 return -EINVAL; in pf_init()
993 return -EBUSY; in pf_init()
995 printk("%s: %s version %s, major %d, cluster %d, nice %d\n", in pf_init()
996 name, name, PF_VERSION, major, cluster, nice); in pf_init()
1011 if (pf_init_unit(pf, 1, -1, -1, -1, -1, -1, verbose)) in pf_init()
1035 return -ENODEV; in pf_init()
1044 if (!pf->present) in pf_exit()
1046 del_gendisk(pf->disk); in pf_exit()
1047 put_disk(pf->disk); in pf_exit()
1048 blk_mq_free_tag_set(&pf->tag_set); in pf_exit()
1049 pi_release(pf->pi); in pf_exit()