1 /* sunvdc.c: Sun LDOM Virtual Disk Client. 2 * 3 * Copyright (C) 2007, 2008 David S. Miller <davem@davemloft.net> 4 */ 5 6 #include <linux/module.h> 7 #include <linux/kernel.h> 8 #include <linux/types.h> 9 #include <linux/blkdev.h> 10 #include <linux/hdreg.h> 11 #include <linux/genhd.h> 12 #include <linux/cdrom.h> 13 #include <linux/slab.h> 14 #include <linux/spinlock.h> 15 #include <linux/completion.h> 16 #include <linux/delay.h> 17 #include <linux/init.h> 18 #include <linux/list.h> 19 #include <linux/scatterlist.h> 20 21 #include <asm/vio.h> 22 #include <asm/ldc.h> 23 24 #define DRV_MODULE_NAME "sunvdc" 25 #define PFX DRV_MODULE_NAME ": " 26 #define DRV_MODULE_VERSION "1.2" 27 #define DRV_MODULE_RELDATE "November 24, 2014" 28 29 static char version[] = 30 DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n"; 31 MODULE_AUTHOR("David S. Miller (davem@davemloft.net)"); 32 MODULE_DESCRIPTION("Sun LDOM virtual disk client driver"); 33 MODULE_LICENSE("GPL"); 34 MODULE_VERSION(DRV_MODULE_VERSION); 35 36 #define VDC_TX_RING_SIZE 512 37 #define VDC_DEFAULT_BLK_SIZE 512 38 39 #define WAITING_FOR_LINK_UP 0x01 40 #define WAITING_FOR_TX_SPACE 0x02 41 #define WAITING_FOR_GEN_CMD 0x04 42 #define WAITING_FOR_ANY -1 43 44 static struct workqueue_struct *sunvdc_wq; 45 46 struct vdc_req_entry { 47 struct request *req; 48 }; 49 50 struct vdc_port { 51 struct vio_driver_state vio; 52 53 struct gendisk *disk; 54 55 struct vdc_completion *cmp; 56 57 u64 req_id; 58 u64 seq; 59 struct vdc_req_entry rq_arr[VDC_TX_RING_SIZE]; 60 61 unsigned long ring_cookies; 62 63 u64 max_xfer_size; 64 u32 vdisk_block_size; 65 66 u64 ldc_timeout; 67 struct timer_list ldc_reset_timer; 68 struct work_struct ldc_reset_work; 69 70 /* The server fills these in for us in the disk attribute 71 * ACK packet. 72 */ 73 u64 operations; 74 u32 vdisk_size; 75 u8 vdisk_type; 76 u8 vdisk_mtype; 77 u32 vdisk_phys_blksz; 78 79 char disk_name[32]; 80 }; 81 82 static void vdc_ldc_reset(struct vdc_port *port); 83 static void vdc_ldc_reset_work(struct work_struct *work); 84 static void vdc_ldc_reset_timer(unsigned long _arg); 85 86 static inline struct vdc_port *to_vdc_port(struct vio_driver_state *vio) 87 { 88 return container_of(vio, struct vdc_port, vio); 89 } 90 91 /* Ordered from largest major to lowest */ 92 static struct vio_version vdc_versions[] = { 93 { .major = 1, .minor = 2 }, 94 { .major = 1, .minor = 1 }, 95 { .major = 1, .minor = 0 }, 96 }; 97 98 static inline int vdc_version_supported(struct vdc_port *port, 99 u16 major, u16 minor) 100 { 101 return port->vio.ver.major == major && port->vio.ver.minor >= minor; 102 } 103 104 #define VDCBLK_NAME "vdisk" 105 static int vdc_major; 106 #define PARTITION_SHIFT 3 107 108 static inline u32 vdc_tx_dring_avail(struct vio_dring_state *dr) 109 { 110 return vio_dring_avail(dr, VDC_TX_RING_SIZE); 111 } 112 113 static int vdc_getgeo(struct block_device *bdev, struct hd_geometry *geo) 114 { 115 struct gendisk *disk = bdev->bd_disk; 116 sector_t nsect = get_capacity(disk); 117 sector_t cylinders = nsect; 118 119 geo->heads = 0xff; 120 geo->sectors = 0x3f; 121 sector_div(cylinders, geo->heads * geo->sectors); 122 geo->cylinders = cylinders; 123 if ((sector_t)(geo->cylinders + 1) * geo->heads * geo->sectors < nsect) 124 geo->cylinders = 0xffff; 125 126 return 0; 127 } 128 129 /* Add ioctl/CDROM_GET_CAPABILITY to support cdrom_id in udev 130 * when vdisk_mtype is VD_MEDIA_TYPE_CD or VD_MEDIA_TYPE_DVD. 131 * Needed to be able to install inside an ldom from an iso image. 132 */ 133 static int vdc_ioctl(struct block_device *bdev, fmode_t mode, 134 unsigned command, unsigned long argument) 135 { 136 int i; 137 struct gendisk *disk; 138 139 switch (command) { 140 case CDROMMULTISESSION: 141 pr_debug(PFX "Multisession CDs not supported\n"); 142 for (i = 0; i < sizeof(struct cdrom_multisession); i++) 143 if (put_user(0, (char __user *)(argument + i))) 144 return -EFAULT; 145 return 0; 146 147 case CDROM_GET_CAPABILITY: 148 disk = bdev->bd_disk; 149 150 if (bdev->bd_disk && (disk->flags & GENHD_FL_CD)) 151 return 0; 152 return -EINVAL; 153 154 default: 155 pr_debug(PFX "ioctl %08x not supported\n", command); 156 return -EINVAL; 157 } 158 } 159 160 static const struct block_device_operations vdc_fops = { 161 .owner = THIS_MODULE, 162 .getgeo = vdc_getgeo, 163 .ioctl = vdc_ioctl, 164 }; 165 166 static void vdc_blk_queue_start(struct vdc_port *port) 167 { 168 struct vio_dring_state *dr = &port->vio.drings[VIO_DRIVER_TX_RING]; 169 170 /* restart blk queue when ring is half emptied. also called after 171 * handshake completes, so check for initial handshake before we've 172 * allocated a disk. 173 */ 174 if (port->disk && blk_queue_stopped(port->disk->queue) && 175 vdc_tx_dring_avail(dr) * 100 / VDC_TX_RING_SIZE >= 50) { 176 blk_start_queue(port->disk->queue); 177 } 178 179 } 180 181 static void vdc_finish(struct vio_driver_state *vio, int err, int waiting_for) 182 { 183 if (vio->cmp && 184 (waiting_for == -1 || 185 vio->cmp->waiting_for == waiting_for)) { 186 vio->cmp->err = err; 187 complete(&vio->cmp->com); 188 vio->cmp = NULL; 189 } 190 } 191 192 static void vdc_handshake_complete(struct vio_driver_state *vio) 193 { 194 struct vdc_port *port = to_vdc_port(vio); 195 196 del_timer(&port->ldc_reset_timer); 197 vdc_finish(vio, 0, WAITING_FOR_LINK_UP); 198 vdc_blk_queue_start(port); 199 } 200 201 static int vdc_handle_unknown(struct vdc_port *port, void *arg) 202 { 203 struct vio_msg_tag *pkt = arg; 204 205 printk(KERN_ERR PFX "Received unknown msg [%02x:%02x:%04x:%08x]\n", 206 pkt->type, pkt->stype, pkt->stype_env, pkt->sid); 207 printk(KERN_ERR PFX "Resetting connection.\n"); 208 209 ldc_disconnect(port->vio.lp); 210 211 return -ECONNRESET; 212 } 213 214 static int vdc_send_attr(struct vio_driver_state *vio) 215 { 216 struct vdc_port *port = to_vdc_port(vio); 217 struct vio_disk_attr_info pkt; 218 219 memset(&pkt, 0, sizeof(pkt)); 220 221 pkt.tag.type = VIO_TYPE_CTRL; 222 pkt.tag.stype = VIO_SUBTYPE_INFO; 223 pkt.tag.stype_env = VIO_ATTR_INFO; 224 pkt.tag.sid = vio_send_sid(vio); 225 226 pkt.xfer_mode = VIO_DRING_MODE; 227 pkt.vdisk_block_size = port->vdisk_block_size; 228 pkt.max_xfer_size = port->max_xfer_size; 229 230 viodbg(HS, "SEND ATTR xfer_mode[0x%x] blksz[%u] max_xfer[%llu]\n", 231 pkt.xfer_mode, pkt.vdisk_block_size, pkt.max_xfer_size); 232 233 return vio_ldc_send(&port->vio, &pkt, sizeof(pkt)); 234 } 235 236 static int vdc_handle_attr(struct vio_driver_state *vio, void *arg) 237 { 238 struct vdc_port *port = to_vdc_port(vio); 239 struct vio_disk_attr_info *pkt = arg; 240 241 viodbg(HS, "GOT ATTR stype[0x%x] ops[%llx] disk_size[%llu] disk_type[%x] " 242 "mtype[0x%x] xfer_mode[0x%x] blksz[%u] max_xfer[%llu]\n", 243 pkt->tag.stype, pkt->operations, 244 pkt->vdisk_size, pkt->vdisk_type, pkt->vdisk_mtype, 245 pkt->xfer_mode, pkt->vdisk_block_size, 246 pkt->max_xfer_size); 247 248 if (pkt->tag.stype == VIO_SUBTYPE_ACK) { 249 switch (pkt->vdisk_type) { 250 case VD_DISK_TYPE_DISK: 251 case VD_DISK_TYPE_SLICE: 252 break; 253 254 default: 255 printk(KERN_ERR PFX "%s: Bogus vdisk_type 0x%x\n", 256 vio->name, pkt->vdisk_type); 257 return -ECONNRESET; 258 } 259 260 if (pkt->vdisk_block_size > port->vdisk_block_size) { 261 printk(KERN_ERR PFX "%s: BLOCK size increased " 262 "%u --> %u\n", 263 vio->name, 264 port->vdisk_block_size, pkt->vdisk_block_size); 265 return -ECONNRESET; 266 } 267 268 port->operations = pkt->operations; 269 port->vdisk_type = pkt->vdisk_type; 270 if (vdc_version_supported(port, 1, 1)) { 271 port->vdisk_size = pkt->vdisk_size; 272 port->vdisk_mtype = pkt->vdisk_mtype; 273 } 274 if (pkt->max_xfer_size < port->max_xfer_size) 275 port->max_xfer_size = pkt->max_xfer_size; 276 port->vdisk_block_size = pkt->vdisk_block_size; 277 278 port->vdisk_phys_blksz = VDC_DEFAULT_BLK_SIZE; 279 if (vdc_version_supported(port, 1, 2)) 280 port->vdisk_phys_blksz = pkt->phys_block_size; 281 282 return 0; 283 } else { 284 printk(KERN_ERR PFX "%s: Attribute NACK\n", vio->name); 285 286 return -ECONNRESET; 287 } 288 } 289 290 static void vdc_end_special(struct vdc_port *port, struct vio_disk_desc *desc) 291 { 292 int err = desc->status; 293 294 vdc_finish(&port->vio, -err, WAITING_FOR_GEN_CMD); 295 } 296 297 static void vdc_end_one(struct vdc_port *port, struct vio_dring_state *dr, 298 unsigned int index) 299 { 300 struct vio_disk_desc *desc = vio_dring_entry(dr, index); 301 struct vdc_req_entry *rqe = &port->rq_arr[index]; 302 struct request *req; 303 304 if (unlikely(desc->hdr.state != VIO_DESC_DONE)) 305 return; 306 307 ldc_unmap(port->vio.lp, desc->cookies, desc->ncookies); 308 desc->hdr.state = VIO_DESC_FREE; 309 dr->cons = vio_dring_next(dr, index); 310 311 req = rqe->req; 312 if (req == NULL) { 313 vdc_end_special(port, desc); 314 return; 315 } 316 317 rqe->req = NULL; 318 319 __blk_end_request(req, (desc->status ? -EIO : 0), desc->size); 320 321 vdc_blk_queue_start(port); 322 } 323 324 static int vdc_ack(struct vdc_port *port, void *msgbuf) 325 { 326 struct vio_dring_state *dr = &port->vio.drings[VIO_DRIVER_TX_RING]; 327 struct vio_dring_data *pkt = msgbuf; 328 329 if (unlikely(pkt->dring_ident != dr->ident || 330 pkt->start_idx != pkt->end_idx || 331 pkt->start_idx >= VDC_TX_RING_SIZE)) 332 return 0; 333 334 vdc_end_one(port, dr, pkt->start_idx); 335 336 return 0; 337 } 338 339 static int vdc_nack(struct vdc_port *port, void *msgbuf) 340 { 341 /* XXX Implement me XXX */ 342 return 0; 343 } 344 345 static void vdc_event(void *arg, int event) 346 { 347 struct vdc_port *port = arg; 348 struct vio_driver_state *vio = &port->vio; 349 unsigned long flags; 350 int err; 351 352 spin_lock_irqsave(&vio->lock, flags); 353 354 if (unlikely(event == LDC_EVENT_RESET)) { 355 vio_link_state_change(vio, event); 356 queue_work(sunvdc_wq, &port->ldc_reset_work); 357 goto out; 358 } 359 360 if (unlikely(event == LDC_EVENT_UP)) { 361 vio_link_state_change(vio, event); 362 goto out; 363 } 364 365 if (unlikely(event != LDC_EVENT_DATA_READY)) { 366 pr_warn(PFX "Unexpected LDC event %d\n", event); 367 goto out; 368 } 369 370 err = 0; 371 while (1) { 372 union { 373 struct vio_msg_tag tag; 374 u64 raw[8]; 375 } msgbuf; 376 377 err = ldc_read(vio->lp, &msgbuf, sizeof(msgbuf)); 378 if (unlikely(err < 0)) { 379 if (err == -ECONNRESET) 380 vio_conn_reset(vio); 381 break; 382 } 383 if (err == 0) 384 break; 385 viodbg(DATA, "TAG [%02x:%02x:%04x:%08x]\n", 386 msgbuf.tag.type, 387 msgbuf.tag.stype, 388 msgbuf.tag.stype_env, 389 msgbuf.tag.sid); 390 err = vio_validate_sid(vio, &msgbuf.tag); 391 if (err < 0) 392 break; 393 394 if (likely(msgbuf.tag.type == VIO_TYPE_DATA)) { 395 if (msgbuf.tag.stype == VIO_SUBTYPE_ACK) 396 err = vdc_ack(port, &msgbuf); 397 else if (msgbuf.tag.stype == VIO_SUBTYPE_NACK) 398 err = vdc_nack(port, &msgbuf); 399 else 400 err = vdc_handle_unknown(port, &msgbuf); 401 } else if (msgbuf.tag.type == VIO_TYPE_CTRL) { 402 err = vio_control_pkt_engine(vio, &msgbuf); 403 } else { 404 err = vdc_handle_unknown(port, &msgbuf); 405 } 406 if (err < 0) 407 break; 408 } 409 if (err < 0) 410 vdc_finish(&port->vio, err, WAITING_FOR_ANY); 411 out: 412 spin_unlock_irqrestore(&vio->lock, flags); 413 } 414 415 static int __vdc_tx_trigger(struct vdc_port *port) 416 { 417 struct vio_dring_state *dr = &port->vio.drings[VIO_DRIVER_TX_RING]; 418 struct vio_dring_data hdr = { 419 .tag = { 420 .type = VIO_TYPE_DATA, 421 .stype = VIO_SUBTYPE_INFO, 422 .stype_env = VIO_DRING_DATA, 423 .sid = vio_send_sid(&port->vio), 424 }, 425 .dring_ident = dr->ident, 426 .start_idx = dr->prod, 427 .end_idx = dr->prod, 428 }; 429 int err, delay; 430 431 hdr.seq = dr->snd_nxt; 432 delay = 1; 433 do { 434 err = vio_ldc_send(&port->vio, &hdr, sizeof(hdr)); 435 if (err > 0) { 436 dr->snd_nxt++; 437 break; 438 } 439 udelay(delay); 440 if ((delay <<= 1) > 128) 441 delay = 128; 442 } while (err == -EAGAIN); 443 444 if (err == -ENOTCONN) 445 vdc_ldc_reset(port); 446 return err; 447 } 448 449 static int __send_request(struct request *req) 450 { 451 struct vdc_port *port = req->rq_disk->private_data; 452 struct vio_dring_state *dr = &port->vio.drings[VIO_DRIVER_TX_RING]; 453 struct scatterlist sg[port->ring_cookies]; 454 struct vdc_req_entry *rqe; 455 struct vio_disk_desc *desc; 456 unsigned int map_perm; 457 int nsg, err, i; 458 u64 len; 459 u8 op; 460 461 map_perm = LDC_MAP_SHADOW | LDC_MAP_DIRECT | LDC_MAP_IO; 462 463 if (rq_data_dir(req) == READ) { 464 map_perm |= LDC_MAP_W; 465 op = VD_OP_BREAD; 466 } else { 467 map_perm |= LDC_MAP_R; 468 op = VD_OP_BWRITE; 469 } 470 471 sg_init_table(sg, port->ring_cookies); 472 nsg = blk_rq_map_sg(req->q, req, sg); 473 474 len = 0; 475 for (i = 0; i < nsg; i++) 476 len += sg[i].length; 477 478 desc = vio_dring_cur(dr); 479 480 err = ldc_map_sg(port->vio.lp, sg, nsg, 481 desc->cookies, port->ring_cookies, 482 map_perm); 483 if (err < 0) { 484 printk(KERN_ERR PFX "ldc_map_sg() failure, err=%d.\n", err); 485 return err; 486 } 487 488 rqe = &port->rq_arr[dr->prod]; 489 rqe->req = req; 490 491 desc->hdr.ack = VIO_ACK_ENABLE; 492 desc->req_id = port->req_id; 493 desc->operation = op; 494 if (port->vdisk_type == VD_DISK_TYPE_DISK) { 495 desc->slice = 0xff; 496 } else { 497 desc->slice = 0; 498 } 499 desc->status = ~0; 500 desc->offset = (blk_rq_pos(req) << 9) / port->vdisk_block_size; 501 desc->size = len; 502 desc->ncookies = err; 503 504 /* This has to be a non-SMP write barrier because we are writing 505 * to memory which is shared with the peer LDOM. 506 */ 507 wmb(); 508 desc->hdr.state = VIO_DESC_READY; 509 510 err = __vdc_tx_trigger(port); 511 if (err < 0) { 512 printk(KERN_ERR PFX "vdc_tx_trigger() failure, err=%d\n", err); 513 } else { 514 port->req_id++; 515 dr->prod = vio_dring_next(dr, dr->prod); 516 } 517 518 return err; 519 } 520 521 static void do_vdc_request(struct request_queue *rq) 522 { 523 struct request *req; 524 525 while ((req = blk_peek_request(rq)) != NULL) { 526 struct vdc_port *port; 527 struct vio_dring_state *dr; 528 529 port = req->rq_disk->private_data; 530 dr = &port->vio.drings[VIO_DRIVER_TX_RING]; 531 if (unlikely(vdc_tx_dring_avail(dr) < 1)) 532 goto wait; 533 534 blk_start_request(req); 535 536 if (__send_request(req) < 0) { 537 blk_requeue_request(rq, req); 538 wait: 539 /* Avoid pointless unplugs. */ 540 blk_stop_queue(rq); 541 break; 542 } 543 } 544 } 545 546 static int generic_request(struct vdc_port *port, u8 op, void *buf, int len) 547 { 548 struct vio_dring_state *dr; 549 struct vio_completion comp; 550 struct vio_disk_desc *desc; 551 unsigned int map_perm; 552 unsigned long flags; 553 int op_len, err; 554 void *req_buf; 555 556 if (!(((u64)1 << (u64)op) & port->operations)) 557 return -EOPNOTSUPP; 558 559 switch (op) { 560 case VD_OP_BREAD: 561 case VD_OP_BWRITE: 562 default: 563 return -EINVAL; 564 565 case VD_OP_FLUSH: 566 op_len = 0; 567 map_perm = 0; 568 break; 569 570 case VD_OP_GET_WCE: 571 op_len = sizeof(u32); 572 map_perm = LDC_MAP_W; 573 break; 574 575 case VD_OP_SET_WCE: 576 op_len = sizeof(u32); 577 map_perm = LDC_MAP_R; 578 break; 579 580 case VD_OP_GET_VTOC: 581 op_len = sizeof(struct vio_disk_vtoc); 582 map_perm = LDC_MAP_W; 583 break; 584 585 case VD_OP_SET_VTOC: 586 op_len = sizeof(struct vio_disk_vtoc); 587 map_perm = LDC_MAP_R; 588 break; 589 590 case VD_OP_GET_DISKGEOM: 591 op_len = sizeof(struct vio_disk_geom); 592 map_perm = LDC_MAP_W; 593 break; 594 595 case VD_OP_SET_DISKGEOM: 596 op_len = sizeof(struct vio_disk_geom); 597 map_perm = LDC_MAP_R; 598 break; 599 600 case VD_OP_SCSICMD: 601 op_len = 16; 602 map_perm = LDC_MAP_RW; 603 break; 604 605 case VD_OP_GET_DEVID: 606 op_len = sizeof(struct vio_disk_devid); 607 map_perm = LDC_MAP_W; 608 break; 609 610 case VD_OP_GET_EFI: 611 case VD_OP_SET_EFI: 612 return -EOPNOTSUPP; 613 break; 614 }; 615 616 map_perm |= LDC_MAP_SHADOW | LDC_MAP_DIRECT | LDC_MAP_IO; 617 618 op_len = (op_len + 7) & ~7; 619 req_buf = kzalloc(op_len, GFP_KERNEL); 620 if (!req_buf) 621 return -ENOMEM; 622 623 if (len > op_len) 624 len = op_len; 625 626 if (map_perm & LDC_MAP_R) 627 memcpy(req_buf, buf, len); 628 629 spin_lock_irqsave(&port->vio.lock, flags); 630 631 dr = &port->vio.drings[VIO_DRIVER_TX_RING]; 632 633 /* XXX If we want to use this code generically we have to 634 * XXX handle TX ring exhaustion etc. 635 */ 636 desc = vio_dring_cur(dr); 637 638 err = ldc_map_single(port->vio.lp, req_buf, op_len, 639 desc->cookies, port->ring_cookies, 640 map_perm); 641 if (err < 0) { 642 spin_unlock_irqrestore(&port->vio.lock, flags); 643 kfree(req_buf); 644 return err; 645 } 646 647 init_completion(&comp.com); 648 comp.waiting_for = WAITING_FOR_GEN_CMD; 649 port->vio.cmp = ∁ 650 651 desc->hdr.ack = VIO_ACK_ENABLE; 652 desc->req_id = port->req_id; 653 desc->operation = op; 654 desc->slice = 0; 655 desc->status = ~0; 656 desc->offset = 0; 657 desc->size = op_len; 658 desc->ncookies = err; 659 660 /* This has to be a non-SMP write barrier because we are writing 661 * to memory which is shared with the peer LDOM. 662 */ 663 wmb(); 664 desc->hdr.state = VIO_DESC_READY; 665 666 err = __vdc_tx_trigger(port); 667 if (err >= 0) { 668 port->req_id++; 669 dr->prod = vio_dring_next(dr, dr->prod); 670 spin_unlock_irqrestore(&port->vio.lock, flags); 671 672 wait_for_completion(&comp.com); 673 err = comp.err; 674 } else { 675 port->vio.cmp = NULL; 676 spin_unlock_irqrestore(&port->vio.lock, flags); 677 } 678 679 if (map_perm & LDC_MAP_W) 680 memcpy(buf, req_buf, len); 681 682 kfree(req_buf); 683 684 return err; 685 } 686 687 static int vdc_alloc_tx_ring(struct vdc_port *port) 688 { 689 struct vio_dring_state *dr = &port->vio.drings[VIO_DRIVER_TX_RING]; 690 unsigned long len, entry_size; 691 int ncookies; 692 void *dring; 693 694 entry_size = sizeof(struct vio_disk_desc) + 695 (sizeof(struct ldc_trans_cookie) * port->ring_cookies); 696 len = (VDC_TX_RING_SIZE * entry_size); 697 698 ncookies = VIO_MAX_RING_COOKIES; 699 dring = ldc_alloc_exp_dring(port->vio.lp, len, 700 dr->cookies, &ncookies, 701 (LDC_MAP_SHADOW | 702 LDC_MAP_DIRECT | 703 LDC_MAP_RW)); 704 if (IS_ERR(dring)) 705 return PTR_ERR(dring); 706 707 dr->base = dring; 708 dr->entry_size = entry_size; 709 dr->num_entries = VDC_TX_RING_SIZE; 710 dr->prod = dr->cons = 0; 711 dr->pending = VDC_TX_RING_SIZE; 712 dr->ncookies = ncookies; 713 714 return 0; 715 } 716 717 static void vdc_free_tx_ring(struct vdc_port *port) 718 { 719 struct vio_dring_state *dr = &port->vio.drings[VIO_DRIVER_TX_RING]; 720 721 if (dr->base) { 722 ldc_free_exp_dring(port->vio.lp, dr->base, 723 (dr->entry_size * dr->num_entries), 724 dr->cookies, dr->ncookies); 725 dr->base = NULL; 726 dr->entry_size = 0; 727 dr->num_entries = 0; 728 dr->pending = 0; 729 dr->ncookies = 0; 730 } 731 } 732 733 static int vdc_port_up(struct vdc_port *port) 734 { 735 struct vio_completion comp; 736 737 init_completion(&comp.com); 738 comp.err = 0; 739 comp.waiting_for = WAITING_FOR_LINK_UP; 740 port->vio.cmp = ∁ 741 742 vio_port_up(&port->vio); 743 wait_for_completion(&comp.com); 744 return comp.err; 745 } 746 747 static void vdc_port_down(struct vdc_port *port) 748 { 749 ldc_disconnect(port->vio.lp); 750 ldc_unbind(port->vio.lp); 751 vdc_free_tx_ring(port); 752 vio_ldc_free(&port->vio); 753 } 754 755 static int probe_disk(struct vdc_port *port) 756 { 757 struct request_queue *q; 758 struct gendisk *g; 759 int err; 760 761 err = vdc_port_up(port); 762 if (err) 763 return err; 764 765 /* Using version 1.2 means vdisk_phys_blksz should be set unless the 766 * disk is reserved by another system. 767 */ 768 if (vdc_version_supported(port, 1, 2) && !port->vdisk_phys_blksz) 769 return -ENODEV; 770 771 if (vdc_version_supported(port, 1, 1)) { 772 /* vdisk_size should be set during the handshake, if it wasn't 773 * then the underlying disk is reserved by another system 774 */ 775 if (port->vdisk_size == -1) 776 return -ENODEV; 777 } else { 778 struct vio_disk_geom geom; 779 780 err = generic_request(port, VD_OP_GET_DISKGEOM, 781 &geom, sizeof(geom)); 782 if (err < 0) { 783 printk(KERN_ERR PFX "VD_OP_GET_DISKGEOM returns " 784 "error %d\n", err); 785 return err; 786 } 787 port->vdisk_size = ((u64)geom.num_cyl * 788 (u64)geom.num_hd * 789 (u64)geom.num_sec); 790 } 791 792 q = blk_init_queue(do_vdc_request, &port->vio.lock); 793 if (!q) { 794 printk(KERN_ERR PFX "%s: Could not allocate queue.\n", 795 port->vio.name); 796 return -ENOMEM; 797 } 798 g = alloc_disk(1 << PARTITION_SHIFT); 799 if (!g) { 800 printk(KERN_ERR PFX "%s: Could not allocate gendisk.\n", 801 port->vio.name); 802 blk_cleanup_queue(q); 803 return -ENOMEM; 804 } 805 806 port->disk = g; 807 808 /* Each segment in a request is up to an aligned page in size. */ 809 blk_queue_segment_boundary(q, PAGE_SIZE - 1); 810 blk_queue_max_segment_size(q, PAGE_SIZE); 811 812 blk_queue_max_segments(q, port->ring_cookies); 813 blk_queue_max_hw_sectors(q, port->max_xfer_size); 814 g->major = vdc_major; 815 g->first_minor = port->vio.vdev->dev_no << PARTITION_SHIFT; 816 strcpy(g->disk_name, port->disk_name); 817 818 g->fops = &vdc_fops; 819 g->queue = q; 820 g->private_data = port; 821 822 set_capacity(g, port->vdisk_size); 823 824 if (vdc_version_supported(port, 1, 1)) { 825 switch (port->vdisk_mtype) { 826 case VD_MEDIA_TYPE_CD: 827 pr_info(PFX "Virtual CDROM %s\n", port->disk_name); 828 g->flags |= GENHD_FL_CD; 829 g->flags |= GENHD_FL_REMOVABLE; 830 set_disk_ro(g, 1); 831 break; 832 833 case VD_MEDIA_TYPE_DVD: 834 pr_info(PFX "Virtual DVD %s\n", port->disk_name); 835 g->flags |= GENHD_FL_CD; 836 g->flags |= GENHD_FL_REMOVABLE; 837 set_disk_ro(g, 1); 838 break; 839 840 case VD_MEDIA_TYPE_FIXED: 841 pr_info(PFX "Virtual Hard disk %s\n", port->disk_name); 842 break; 843 } 844 } 845 846 blk_queue_physical_block_size(q, port->vdisk_phys_blksz); 847 848 pr_info(PFX "%s: %u sectors (%u MB) protocol %d.%d\n", 849 g->disk_name, 850 port->vdisk_size, (port->vdisk_size >> (20 - 9)), 851 port->vio.ver.major, port->vio.ver.minor); 852 853 device_add_disk(&port->vio.vdev->dev, g); 854 855 return 0; 856 } 857 858 static struct ldc_channel_config vdc_ldc_cfg = { 859 .event = vdc_event, 860 .mtu = 64, 861 .mode = LDC_MODE_UNRELIABLE, 862 }; 863 864 static struct vio_driver_ops vdc_vio_ops = { 865 .send_attr = vdc_send_attr, 866 .handle_attr = vdc_handle_attr, 867 .handshake_complete = vdc_handshake_complete, 868 }; 869 870 static void print_version(void) 871 { 872 static int version_printed; 873 874 if (version_printed++ == 0) 875 printk(KERN_INFO "%s", version); 876 } 877 878 static int vdc_port_probe(struct vio_dev *vdev, const struct vio_device_id *id) 879 { 880 struct mdesc_handle *hp; 881 struct vdc_port *port; 882 int err; 883 const u64 *ldc_timeout; 884 885 print_version(); 886 887 hp = mdesc_grab(); 888 889 err = -ENODEV; 890 if ((vdev->dev_no << PARTITION_SHIFT) & ~(u64)MINORMASK) { 891 printk(KERN_ERR PFX "Port id [%llu] too large.\n", 892 vdev->dev_no); 893 goto err_out_release_mdesc; 894 } 895 896 port = kzalloc(sizeof(*port), GFP_KERNEL); 897 err = -ENOMEM; 898 if (!port) { 899 printk(KERN_ERR PFX "Cannot allocate vdc_port.\n"); 900 goto err_out_release_mdesc; 901 } 902 903 if (vdev->dev_no >= 26) 904 snprintf(port->disk_name, sizeof(port->disk_name), 905 VDCBLK_NAME "%c%c", 906 'a' + ((int)vdev->dev_no / 26) - 1, 907 'a' + ((int)vdev->dev_no % 26)); 908 else 909 snprintf(port->disk_name, sizeof(port->disk_name), 910 VDCBLK_NAME "%c", 'a' + ((int)vdev->dev_no % 26)); 911 port->vdisk_size = -1; 912 913 /* Actual wall time may be double due to do_generic_file_read() doing 914 * a readahead I/O first, and once that fails it will try to read a 915 * single page. 916 */ 917 ldc_timeout = mdesc_get_property(hp, vdev->mp, "vdc-timeout", NULL); 918 port->ldc_timeout = ldc_timeout ? *ldc_timeout : 0; 919 setup_timer(&port->ldc_reset_timer, vdc_ldc_reset_timer, 920 (unsigned long)port); 921 INIT_WORK(&port->ldc_reset_work, vdc_ldc_reset_work); 922 923 err = vio_driver_init(&port->vio, vdev, VDEV_DISK, 924 vdc_versions, ARRAY_SIZE(vdc_versions), 925 &vdc_vio_ops, port->disk_name); 926 if (err) 927 goto err_out_free_port; 928 929 port->vdisk_block_size = VDC_DEFAULT_BLK_SIZE; 930 port->max_xfer_size = ((128 * 1024) / port->vdisk_block_size); 931 port->ring_cookies = ((port->max_xfer_size * 932 port->vdisk_block_size) / PAGE_SIZE) + 2; 933 934 err = vio_ldc_alloc(&port->vio, &vdc_ldc_cfg, port); 935 if (err) 936 goto err_out_free_port; 937 938 err = vdc_alloc_tx_ring(port); 939 if (err) 940 goto err_out_free_ldc; 941 942 err = probe_disk(port); 943 if (err) 944 goto err_out_free_tx_ring; 945 946 dev_set_drvdata(&vdev->dev, port); 947 948 mdesc_release(hp); 949 950 return 0; 951 952 err_out_free_tx_ring: 953 vdc_free_tx_ring(port); 954 955 err_out_free_ldc: 956 vio_ldc_free(&port->vio); 957 958 err_out_free_port: 959 kfree(port); 960 961 err_out_release_mdesc: 962 mdesc_release(hp); 963 return err; 964 } 965 966 static int vdc_port_remove(struct vio_dev *vdev) 967 { 968 struct vdc_port *port = dev_get_drvdata(&vdev->dev); 969 970 if (port) { 971 unsigned long flags; 972 973 spin_lock_irqsave(&port->vio.lock, flags); 974 blk_stop_queue(port->disk->queue); 975 spin_unlock_irqrestore(&port->vio.lock, flags); 976 977 flush_work(&port->ldc_reset_work); 978 del_timer_sync(&port->ldc_reset_timer); 979 del_timer_sync(&port->vio.timer); 980 981 del_gendisk(port->disk); 982 blk_cleanup_queue(port->disk->queue); 983 put_disk(port->disk); 984 port->disk = NULL; 985 986 vdc_free_tx_ring(port); 987 vio_ldc_free(&port->vio); 988 989 dev_set_drvdata(&vdev->dev, NULL); 990 991 kfree(port); 992 } 993 return 0; 994 } 995 996 static void vdc_requeue_inflight(struct vdc_port *port) 997 { 998 struct vio_dring_state *dr = &port->vio.drings[VIO_DRIVER_TX_RING]; 999 u32 idx; 1000 1001 for (idx = dr->cons; idx != dr->prod; idx = vio_dring_next(dr, idx)) { 1002 struct vio_disk_desc *desc = vio_dring_entry(dr, idx); 1003 struct vdc_req_entry *rqe = &port->rq_arr[idx]; 1004 struct request *req; 1005 1006 ldc_unmap(port->vio.lp, desc->cookies, desc->ncookies); 1007 desc->hdr.state = VIO_DESC_FREE; 1008 dr->cons = vio_dring_next(dr, idx); 1009 1010 req = rqe->req; 1011 if (req == NULL) { 1012 vdc_end_special(port, desc); 1013 continue; 1014 } 1015 1016 rqe->req = NULL; 1017 blk_requeue_request(port->disk->queue, req); 1018 } 1019 } 1020 1021 static void vdc_queue_drain(struct vdc_port *port) 1022 { 1023 struct request *req; 1024 1025 while ((req = blk_fetch_request(port->disk->queue)) != NULL) 1026 __blk_end_request_all(req, -EIO); 1027 } 1028 1029 static void vdc_ldc_reset_timer(unsigned long _arg) 1030 { 1031 struct vdc_port *port = (struct vdc_port *) _arg; 1032 struct vio_driver_state *vio = &port->vio; 1033 unsigned long flags; 1034 1035 spin_lock_irqsave(&vio->lock, flags); 1036 if (!(port->vio.hs_state & VIO_HS_COMPLETE)) { 1037 pr_warn(PFX "%s ldc down %llu seconds, draining queue\n", 1038 port->disk_name, port->ldc_timeout); 1039 vdc_queue_drain(port); 1040 vdc_blk_queue_start(port); 1041 } 1042 spin_unlock_irqrestore(&vio->lock, flags); 1043 } 1044 1045 static void vdc_ldc_reset_work(struct work_struct *work) 1046 { 1047 struct vdc_port *port; 1048 struct vio_driver_state *vio; 1049 unsigned long flags; 1050 1051 port = container_of(work, struct vdc_port, ldc_reset_work); 1052 vio = &port->vio; 1053 1054 spin_lock_irqsave(&vio->lock, flags); 1055 vdc_ldc_reset(port); 1056 spin_unlock_irqrestore(&vio->lock, flags); 1057 } 1058 1059 static void vdc_ldc_reset(struct vdc_port *port) 1060 { 1061 int err; 1062 1063 assert_spin_locked(&port->vio.lock); 1064 1065 pr_warn(PFX "%s ldc link reset\n", port->disk_name); 1066 blk_stop_queue(port->disk->queue); 1067 vdc_requeue_inflight(port); 1068 vdc_port_down(port); 1069 1070 err = vio_ldc_alloc(&port->vio, &vdc_ldc_cfg, port); 1071 if (err) { 1072 pr_err(PFX "%s vio_ldc_alloc:%d\n", port->disk_name, err); 1073 return; 1074 } 1075 1076 err = vdc_alloc_tx_ring(port); 1077 if (err) { 1078 pr_err(PFX "%s vio_alloc_tx_ring:%d\n", port->disk_name, err); 1079 goto err_free_ldc; 1080 } 1081 1082 if (port->ldc_timeout) 1083 mod_timer(&port->ldc_reset_timer, 1084 round_jiffies(jiffies + HZ * port->ldc_timeout)); 1085 mod_timer(&port->vio.timer, round_jiffies(jiffies + HZ)); 1086 return; 1087 1088 err_free_ldc: 1089 vio_ldc_free(&port->vio); 1090 } 1091 1092 static const struct vio_device_id vdc_port_match[] = { 1093 { 1094 .type = "vdc-port", 1095 }, 1096 {}, 1097 }; 1098 MODULE_DEVICE_TABLE(vio, vdc_port_match); 1099 1100 static struct vio_driver vdc_port_driver = { 1101 .id_table = vdc_port_match, 1102 .probe = vdc_port_probe, 1103 .remove = vdc_port_remove, 1104 .name = "vdc_port", 1105 }; 1106 1107 static int __init vdc_init(void) 1108 { 1109 int err; 1110 1111 sunvdc_wq = alloc_workqueue("sunvdc", 0, 0); 1112 if (!sunvdc_wq) 1113 return -ENOMEM; 1114 1115 err = register_blkdev(0, VDCBLK_NAME); 1116 if (err < 0) 1117 goto out_free_wq; 1118 1119 vdc_major = err; 1120 1121 err = vio_register_driver(&vdc_port_driver); 1122 if (err) 1123 goto out_unregister_blkdev; 1124 1125 return 0; 1126 1127 out_unregister_blkdev: 1128 unregister_blkdev(vdc_major, VDCBLK_NAME); 1129 vdc_major = 0; 1130 1131 out_free_wq: 1132 destroy_workqueue(sunvdc_wq); 1133 return err; 1134 } 1135 1136 static void __exit vdc_exit(void) 1137 { 1138 vio_unregister_driver(&vdc_port_driver); 1139 unregister_blkdev(vdc_major, VDCBLK_NAME); 1140 destroy_workqueue(sunvdc_wq); 1141 } 1142 1143 module_init(vdc_init); 1144 module_exit(vdc_exit); 1145