Changeset 38c9505 in mainline for uspace/drv/bus/usb/usbmast/scsi_ms.c
- Timestamp:
- 2011-07-06T21:38:42Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 026793d
- Parents:
- ff65e91
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/usbmast/scsi_ms.c
rff65e91 r38c9505 239 239 } 240 240 241 /** Perform SCSI Write command on USB mass storage device. 242 * 243 * @param dev USB device 244 * @param ba Address of first block 245 * @param nblocks Number of blocks to read 246 * @param bsize Block size 247 * @param data Data to write 248 * 249 * @return Error code 250 */ 251 int usbmast_write(usb_device_t *dev, uint64_t ba, size_t nblocks, size_t bsize, 252 const void *data) 253 { 254 scsi_cdb_write_12_t cdb; 255 size_t sent_len; 256 int rc; 257 258 /* XXX Need softstate to store block size. */ 259 260 if (ba > UINT32_MAX) 261 return ELIMIT; 262 263 if ((uint64_t)nblocks * bsize > UINT32_MAX) 264 return ELIMIT; 265 266 memset(&cdb, 0, sizeof(cdb)); 267 cdb.op_code = SCSI_CMD_WRITE_12; 268 cdb.lba = host2uint32_t_be(ba); 269 cdb.xfer_len = host2uint32_t_be(nblocks); 270 271 rc = usb_massstor_data_out(dev, 0xDEADBEEF, 0, (uint8_t *) &cdb, 272 sizeof(cdb), data, nblocks * bsize, &sent_len); 273 274 if (rc != EOK) { 275 usb_log_error("Write (12) failed, device %s: %s.\n", 276 dev->ddf_dev->name, str_error(rc)); 277 return rc; 278 } 279 280 if (sent_len < nblocks * bsize) { 281 usb_log_error("SCSI Write not all bytes transferred (%zu).\n", 282 sent_len); 283 return EIO; 284 } 285 286 return EOK; 287 } 288 241 289 /** 242 290 * @}
Note:
See TracChangeset
for help on using the changeset viewer.