MODULE_VERSION(DRV_MODULE_VERSION);
 
 #define VDC_TX_RING_SIZE       512
+#define VDC_DEFAULT_BLK_SIZE   512
 
 #define WAITING_FOR_LINK_UP    0x01
 #define WAITING_FOR_TX_SPACE   0x02
        u32                     vdisk_size;
        u8                      vdisk_type;
        u8                      vdisk_mtype;
+       u32                     vdisk_phys_blksz;
 
        char                    disk_name[32];
 };
 
 /* Ordered from largest major to lowest */
 static struct vio_version vdc_versions[] = {
+       { .major = 1, .minor = 2 },
        { .major = 1, .minor = 1 },
        { .major = 1, .minor = 0 },
 };
                if (pkt->max_xfer_size < port->max_xfer_size)
                        port->max_xfer_size = pkt->max_xfer_size;
                port->vdisk_block_size = pkt->vdisk_block_size;
+
+               port->vdisk_phys_blksz = VDC_DEFAULT_BLK_SIZE;
+               if (vdc_version_supported(port, 1, 2))
+                       port->vdisk_phys_blksz = pkt->phys_block_size;
+
                return 0;
        } else {
                printk(KERN_ERR PFX "%s: Attribute NACK\n", vio->name);
        if (err)
                return err;
 
+       /* Using version 1.2 means vdisk_phys_blksz should be set unless the
+        * disk is reserved by another system.
+        */
+       if (vdc_version_supported(port, 1, 2) && !port->vdisk_phys_blksz)
+               return -ENODEV;
+
        if (vdc_version_supported(port, 1, 1)) {
                /* vdisk_size should be set during the handshake, if it wasn't
                 * then the underlying disk is reserved by another system
                }
        }
 
+       blk_queue_physical_block_size(q, port->vdisk_phys_blksz);
+
        pr_info(PFX "%s: %u sectors (%u MB) protocol %d.%d\n",
               g->disk_name,
               port->vdisk_size, (port->vdisk_size >> (20 - 9)),
        if (err)
                goto err_out_free_port;
 
-       port->vdisk_block_size = 512;
+       port->vdisk_block_size = VDC_DEFAULT_BLK_SIZE;
        port->max_xfer_size = ((128 * 1024) / port->vdisk_block_size);
        port->ring_cookies = ((port->max_xfer_size *
                               port->vdisk_block_size) / PAGE_SIZE) + 2;