Commit 5e65a31037e03c9ccbc4df156ddb11b36108a0a6
1 parent
c701b35b
Add rigid and flexible disk geometry page support
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4821 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
70 additions
and
1 deletions
hw/scsi-disk.c
| @@ -532,7 +532,76 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, | @@ -532,7 +532,76 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, | ||
| 532 | outbuf[2] = 0x80; /* Readonly. */ | 532 | outbuf[2] = 0x80; /* Readonly. */ |
| 533 | } | 533 | } |
| 534 | p += 4; | 534 | p += 4; |
| 535 | - if ((page == 8 || page == 0x3f)) { | 535 | + if (page == 4) { |
| 536 | + int cylinders, heads, secs; | ||
| 537 | + | ||
| 538 | + /* Rigid disk device geometry page. */ | ||
| 539 | + p[0] = 4; | ||
| 540 | + p[1] = 0x16; | ||
| 541 | + /* if a geometry hint is available, use it */ | ||
| 542 | + bdrv_get_geometry_hint(s->bdrv, &cylinders, &heads, &secs); | ||
| 543 | + p[2] = (cylinders >> 16) & 0xff; | ||
| 544 | + p[3] = (cylinders >> 8) & 0xff; | ||
| 545 | + p[4] = cylinders & 0xff; | ||
| 546 | + p[5] = heads & 0xff; | ||
| 547 | + /* Write precomp start cylinder, disabled */ | ||
| 548 | + p[6] = (cylinders >> 16) & 0xff; | ||
| 549 | + p[7] = (cylinders >> 8) & 0xff; | ||
| 550 | + p[8] = cylinders & 0xff; | ||
| 551 | + /* Reduced current start cylinder, disabled */ | ||
| 552 | + p[9] = (cylinders >> 16) & 0xff; | ||
| 553 | + p[10] = (cylinders >> 8) & 0xff; | ||
| 554 | + p[11] = cylinders & 0xff; | ||
| 555 | + /* Device step rate [ns], 200ns */ | ||
| 556 | + p[12] = 0; | ||
| 557 | + p[13] = 200; | ||
| 558 | + /* Landing zone cylinder */ | ||
| 559 | + p[14] = 0xff; | ||
| 560 | + p[15] = 0xff; | ||
| 561 | + p[16] = 0xff; | ||
| 562 | + /* Medium rotation rate [rpm], 5400 rpm */ | ||
| 563 | + p[20] = (5400 >> 8) & 0xff; | ||
| 564 | + p[21] = 5400 & 0xff; | ||
| 565 | + p += 0x16; | ||
| 566 | + } else if (page == 5) { | ||
| 567 | + int cylinders, heads, secs; | ||
| 568 | + | ||
| 569 | + /* Flexible disk device geometry page. */ | ||
| 570 | + p[0] = 5; | ||
| 571 | + p[1] = 0x1e; | ||
| 572 | + /* Transfer rate [kbit/s], 5Mbit/s */ | ||
| 573 | + p[2] = 5000 >> 8; | ||
| 574 | + p[3] = 5000 & 0xff; | ||
| 575 | + /* if a geometry hint is available, use it */ | ||
| 576 | + bdrv_get_geometry_hint(s->bdrv, &cylinders, &heads, &secs); | ||
| 577 | + p[4] = heads & 0xff; | ||
| 578 | + p[5] = secs & 0xff; | ||
| 579 | + p[6] = s->cluster_size * 2; | ||
| 580 | + p[8] = (cylinders >> 8) & 0xff; | ||
| 581 | + p[9] = cylinders & 0xff; | ||
| 582 | + /* Write precomp start cylinder, disabled */ | ||
| 583 | + p[10] = (cylinders >> 8) & 0xff; | ||
| 584 | + p[11] = cylinders & 0xff; | ||
| 585 | + /* Reduced current start cylinder, disabled */ | ||
| 586 | + p[12] = (cylinders >> 8) & 0xff; | ||
| 587 | + p[13] = cylinders & 0xff; | ||
| 588 | + /* Device step rate [100us], 100us */ | ||
| 589 | + p[14] = 0; | ||
| 590 | + p[15] = 1; | ||
| 591 | + /* Device step pulse width [us], 1us */ | ||
| 592 | + p[16] = 1; | ||
| 593 | + /* Device head settle delay [100us], 100us */ | ||
| 594 | + p[17] = 0; | ||
| 595 | + p[18] = 1; | ||
| 596 | + /* Motor on delay [0.1s], 0.1s */ | ||
| 597 | + p[19] = 1; | ||
| 598 | + /* Motor off delay [0.1s], 0.1s */ | ||
| 599 | + p[20] = 1; | ||
| 600 | + /* Medium rotation rate [rpm], 5400 rpm */ | ||
| 601 | + p[28] = (5400 >> 8) & 0xff; | ||
| 602 | + p[29] = 5400 & 0xff; | ||
| 603 | + p += 0x1e; | ||
| 604 | + } else if ((page == 8 || page == 0x3f)) { | ||
| 536 | /* Caching page. */ | 605 | /* Caching page. */ |
| 537 | memset(p,0,20); | 606 | memset(p,0,20); |
| 538 | p[0] = 8; | 607 | p[0] = 8; |