Lines Matching refs:sdkp

30 static void sd_zbc_parse_report(struct scsi_disk *sdkp, u8 *buf,  in sd_zbc_parse_report()  argument
33 struct scsi_device *sdp = sdkp->device; in sd_zbc_parse_report()
66 static int sd_zbc_do_report_zones(struct scsi_disk *sdkp, unsigned char *buf, in sd_zbc_do_report_zones() argument
70 struct scsi_device *sdp = sdkp->device; in sd_zbc_do_report_zones()
89 sd_printk(KERN_ERR, sdkp, in sd_zbc_do_report_zones()
98 sd_printk(KERN_ERR, sdkp, in sd_zbc_do_report_zones()
125 static void *sd_zbc_alloc_report_buffer(struct scsi_disk *sdkp, in sd_zbc_alloc_report_buffer() argument
128 struct request_queue *q = sdkp->disk->queue; in sd_zbc_alloc_report_buffer()
166 struct scsi_disk *sdkp = scsi_disk(disk); in sd_zbc_report_zones() local
172 if (!sd_is_zoned(sdkp)) in sd_zbc_report_zones()
176 buf = sd_zbc_alloc_report_buffer(sdkp, nrz, &buflen); in sd_zbc_report_zones()
180 ret = sd_zbc_do_report_zones(sdkp, buf, buflen, in sd_zbc_report_zones()
181 sectors_to_logical(sdkp->device, sector), true); in sd_zbc_report_zones()
188 sd_zbc_parse_report(sdkp, buf + offset, zones); in sd_zbc_report_zones()
204 static inline sector_t sd_zbc_zone_sectors(struct scsi_disk *sdkp) in sd_zbc_zone_sectors() argument
206 return logical_to_sectors(sdkp->device, sdkp->zone_blocks); in sd_zbc_zone_sectors()
219 struct scsi_disk *sdkp = scsi_disk(rq->rq_disk); in sd_zbc_setup_reset_cmnd() local
221 sector_t block = sectors_to_logical(sdkp->device, sector); in sd_zbc_setup_reset_cmnd()
223 if (!sd_is_zoned(sdkp)) in sd_zbc_setup_reset_cmnd()
227 if (sdkp->device->changed) in sd_zbc_setup_reset_cmnd()
230 if (sector & (sd_zbc_zone_sectors(sdkp) - 1)) in sd_zbc_setup_reset_cmnd()
286 static int sd_zbc_check_zoned_characteristics(struct scsi_disk *sdkp, in sd_zbc_check_zoned_characteristics() argument
290 if (scsi_get_vpd_page(sdkp->device, 0xb6, buf, 64)) { in sd_zbc_check_zoned_characteristics()
291 sd_printk(KERN_NOTICE, sdkp, in sd_zbc_check_zoned_characteristics()
296 if (sdkp->device->type != TYPE_ZBC) { in sd_zbc_check_zoned_characteristics()
298 sdkp->urswrz = 1; in sd_zbc_check_zoned_characteristics()
299 sdkp->zones_optimal_open = get_unaligned_be32(&buf[8]); in sd_zbc_check_zoned_characteristics()
300 sdkp->zones_optimal_nonseq = get_unaligned_be32(&buf[12]); in sd_zbc_check_zoned_characteristics()
301 sdkp->zones_max_open = 0; in sd_zbc_check_zoned_characteristics()
304 sdkp->urswrz = buf[4] & 1; in sd_zbc_check_zoned_characteristics()
305 sdkp->zones_optimal_open = 0; in sd_zbc_check_zoned_characteristics()
306 sdkp->zones_optimal_nonseq = 0; in sd_zbc_check_zoned_characteristics()
307 sdkp->zones_max_open = get_unaligned_be32(&buf[16]); in sd_zbc_check_zoned_characteristics()
315 if (!sdkp->urswrz) { in sd_zbc_check_zoned_characteristics()
316 if (sdkp->first_scan) in sd_zbc_check_zoned_characteristics()
317 sd_printk(KERN_NOTICE, sdkp, in sd_zbc_check_zoned_characteristics()
338 static int sd_zbc_check_zones(struct scsi_disk *sdkp, u32 *zblocks) in sd_zbc_check_zones() argument
353 buf = sd_zbc_alloc_report_buffer(sdkp, SD_ZBC_REPORT_MAX_ZONES, in sd_zbc_check_zones()
361 ret = sd_zbc_do_report_zones(sdkp, buf, bufsize, 0, false); in sd_zbc_check_zones()
365 if (sdkp->rc_basis == 0) { in sd_zbc_check_zones()
368 if (sdkp->capacity != max_lba + 1) { in sd_zbc_check_zones()
369 if (sdkp->first_scan) in sd_zbc_check_zones()
370 sd_printk(KERN_WARNING, sdkp, in sd_zbc_check_zones()
372 (unsigned long long)sdkp->capacity, in sd_zbc_check_zones()
374 sdkp->capacity = max_lba + 1; in sd_zbc_check_zones()
408 (block + this_zone_blocks < sdkp->capacity in sd_zbc_check_zones()
417 if (block < sdkp->capacity) { in sd_zbc_check_zones()
418 ret = sd_zbc_do_report_zones(sdkp, buf, bufsize, block, in sd_zbc_check_zones()
424 } while (block < sdkp->capacity); in sd_zbc_check_zones()
428 if (sdkp->first_scan) in sd_zbc_check_zones()
429 sd_printk(KERN_NOTICE, sdkp, in sd_zbc_check_zones()
434 if (sdkp->first_scan) in sd_zbc_check_zones()
435 sd_printk(KERN_NOTICE, sdkp, in sd_zbc_check_zones()
439 } else if (logical_to_sectors(sdkp->device, zone_blocks) > UINT_MAX) { in sd_zbc_check_zones()
440 if (sdkp->first_scan) in sd_zbc_check_zones()
441 sd_printk(KERN_NOTICE, sdkp, in sd_zbc_check_zones()
456 int sd_zbc_read_zones(struct scsi_disk *sdkp, unsigned char *buf) in sd_zbc_read_zones() argument
458 struct gendisk *disk = sdkp->disk; in sd_zbc_read_zones()
463 if (!sd_is_zoned(sdkp)) in sd_zbc_read_zones()
471 ret = sd_zbc_check_zoned_characteristics(sdkp, buf); in sd_zbc_read_zones()
479 ret = sd_zbc_check_zones(sdkp, &zone_blocks); in sd_zbc_read_zones()
484 blk_queue_chunk_sectors(sdkp->disk->queue, in sd_zbc_read_zones()
485 logical_to_sectors(sdkp->device, zone_blocks)); in sd_zbc_read_zones()
486 blk_queue_flag_set(QUEUE_FLAG_ZONE_RESETALL, sdkp->disk->queue); in sd_zbc_read_zones()
487 blk_queue_required_elevator_features(sdkp->disk->queue, in sd_zbc_read_zones()
489 nr_zones = round_up(sdkp->capacity, zone_blocks) >> ilog2(zone_blocks); in sd_zbc_read_zones()
492 sdkp->device->use_16_for_rw = 1; in sd_zbc_read_zones()
493 sdkp->device->use_10_for_rw = 0; in sd_zbc_read_zones()
500 if (sdkp->first_scan) { in sd_zbc_read_zones()
501 sdkp->zone_blocks = zone_blocks; in sd_zbc_read_zones()
502 sdkp->nr_zones = nr_zones; in sd_zbc_read_zones()
506 if (sdkp->zone_blocks != zone_blocks || in sd_zbc_read_zones()
507 sdkp->nr_zones != nr_zones || in sd_zbc_read_zones()
512 sdkp->zone_blocks = zone_blocks; in sd_zbc_read_zones()
513 sdkp->nr_zones = nr_zones; in sd_zbc_read_zones()
519 sdkp->capacity = 0; in sd_zbc_read_zones()
524 void sd_zbc_print_zones(struct scsi_disk *sdkp) in sd_zbc_print_zones() argument
526 if (!sd_is_zoned(sdkp) || !sdkp->capacity) in sd_zbc_print_zones()
529 if (sdkp->capacity & (sdkp->zone_blocks - 1)) in sd_zbc_print_zones()
530 sd_printk(KERN_NOTICE, sdkp, in sd_zbc_print_zones()
532 sdkp->nr_zones - 1, in sd_zbc_print_zones()
533 sdkp->zone_blocks); in sd_zbc_print_zones()
535 sd_printk(KERN_NOTICE, sdkp, in sd_zbc_print_zones()
537 sdkp->nr_zones, in sd_zbc_print_zones()
538 sdkp->zone_blocks); in sd_zbc_print_zones()