usb-msc: support commands without payload
[seabios.git] / src / usb-msc.c
index d5fe7bad95803bc69523f1083034d97c210e83fb..52b41b0db0caa18448716e78c4569b68f9f170f4 100644 (file)
@@ -79,9 +79,11 @@ usb_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize)
         goto fail;
 
     // Transfer data from device.
-    ret = usb_send_bulk(bulkin, USB_DIR_IN, op->buf_fl, bytes);
-    if (ret)
-        goto fail;
+    if (bytes) {
+        ret = usb_send_bulk(bulkin, USB_DIR_IN, op->buf_fl, bytes);
+        if (ret)
+            goto fail;
+    }
 
     // Transfer csw info.
     struct csw_s csw;
@@ -95,7 +97,8 @@ usb_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize)
     if (csw.bCSWStatus == 2)
         goto fail;
 
-    op->count -= csw.dCSWDataResidue / blocksize;
+    if (blocksize)
+        op->count -= csw.dCSWDataResidue / blocksize;
     return DISK_RET_EBADTRACK;
 
 fail:
@@ -143,7 +146,10 @@ setup_drive_cdrom(struct disk_op_s *op, char *desc)
 {
     op->drive_g->blksize = CDROM_SECTOR_SIZE;
     op->drive_g->sectors = (u64)-1;
-    boot_add_cd(op->drive_g, desc, -1);
+    struct usb_pipe *pipe = container_of(
+        op->drive_g, struct usbdrive_s, drive)->bulkout;
+    int prio = bootprio_find_usb(pipe->cntl->pci, pipe->path);
+    boot_add_cd(op->drive_g, desc, prio);
     return 0;
 }
 
@@ -168,7 +174,10 @@ setup_drive_hd(struct disk_op_s *op, char *desc)
     dprintf(1, "USB MSC blksize=%d sectors=%d\n", blksize, sectors);
 
     // Register with bcv system.
-    boot_add_hd(op->drive_g, desc, -1);
+    struct usb_pipe *pipe = container_of(
+        op->drive_g, struct usbdrive_s, drive)->bulkout;
+    int prio = bootprio_find_usb(pipe->cntl->pci, pipe->path);
+    boot_add_hd(op->drive_g, desc, prio);
 
     return 0;
 }
@@ -222,14 +231,16 @@ usb_msc_init(struct usb_pipe *pipe
         goto fail;
     char vendor[sizeof(data.vendor)+1], product[sizeof(data.product)+1];
     char rev[sizeof(data.rev)+1];
+    strtcpy(vendor, data.vendor, sizeof(vendor));
+    nullTrailingSpace(vendor);
+    strtcpy(product, data.product, sizeof(product));
+    nullTrailingSpace(product);
+    strtcpy(rev, data.rev, sizeof(rev));
+    nullTrailingSpace(rev);
     int pdt = data.pdt & 0x1f;
     int removable = !!(data.removable & 0x80);
-    dprintf(1, "USB MSC vendor='%s' product='%s' rev='%s'"
-            " type=%d removable=%d\n"
-            , strtcpy(vendor, data.vendor, sizeof(vendor))
-            , strtcpy(product, data.product, sizeof(product))
-            , strtcpy(rev, data.rev, sizeof(rev))
-            , pdt, removable);
+    dprintf(1, "USB MSC vendor='%s' product='%s' rev='%s' type=%d removable=%d\n"
+            , vendor, product, rev, pdt, removable);
     udrive_g->drive.removable = removable;
 
     if (pdt == USB_MSC_TYPE_CDROM) {