Commit 5e65a31037e03c9ccbc4df156ddb11b36108a0a6

Authored by blueswir1
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 532 outbuf[2] = 0x80; /* Readonly. */
533 533 }
534 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 605 /* Caching page. */
537 606 memset(p,0,20);
538 607 p[0] = 8;
... ...