Anyone know why older USB drive cases have a 2TB size limit

hard drivesatausb

I recently upgraded a home-built external hard drive from 1TB to 3TB. In doing so, I learned that it's bridge board doesn't support drives larger than 2TB. I had to get a newer case in order to support this drive.

Does anyone know why this should be true?

From the standpoint of the SATA interface, there should be no problem. The LBA-28 system of identifying blocks imposed a 128GiB limit (assuming the usual 512 byte blocks), but that hasn't been a serious concern for over 10 years. Everything since then (including all SATA devices) supports LBA-48, which tops out at 128PiB and therefore should easily support 3TB.

I am aware of the MBR partition table issue with its 2TB limit, but that shouldn't affect a SATA-USB bridge chip, since it is (or should be) just translating disk blocks between two protocols.

I'm thinking that this might simply be a case of chip makers getting lazy, using 32-bit integers for an application that really needs to support 48-bit values. Is it really that simple (and IMO, inexcusable) or is there something else I'm missing?

Just curious, but I haven't been able to Google an answer from anywhere yet.

Best Answer

OK, I'm answering my own question 30 minutes later. I couldn't stop searching for a reason and I think I found it. It's not the ATA spec, which supports 48-bit block addresses. It's actually the USB spec.

According to Wikipedia (http://en.wikipedia.org/wiki/USB_mass_storage_device_class#Device_access) the USB mass storage class implements the SCSI transparent command set. Looking at the various SCSI Read commands (https://www.seagate.com/files/staticfiles/support/docs/manual/Interface%20manuals/100293068j.pdf, sections 3.15 through 3.19) I see that there are several different versions of the command:

  • READ(6) uses 21-bit block address, imposing a 1 GiB limit for devices with 512 byte blocks.
  • READ(10) and READ(12) use 32-bit block addresses, imposing a 2 TiB limit for devices with 512 byte blocks.
  • READ(16) and READ(32) use 64-bit block addresses, imposing an 8 ZiB limit (8 giga-terabytes).

At this point, I think the answer is clear. The original chips didn't implement the calls with 64-bit addresses, figuring that there was no point. Then when 3TB drives became available, they were enhanced to support the 64-bit address calls.