1 /* 2 * Copyright 2017 Rockchip Electronics Co., Ltd 3 * Frank Wang <frank.wang@rock-chips.com> 4 * 5 * SPDX-License-Identifier: GPL-2.0+ 6 */ 7 8 #include <rockusb.h> 9 10 #define ROCKUSB_INTERFACE_CLASS 0xff 11 #define ROCKUSB_INTERFACE_SUB_CLASS 0x06 12 #define ROCKUSB_INTERFACE_PROTOCOL 0x05 13 14 static struct usb_interface_descriptor rkusb_intf_desc = { 15 .bLength = USB_DT_INTERFACE_SIZE, 16 .bDescriptorType = USB_DT_INTERFACE, 17 .bInterfaceNumber = 0x00, 18 .bAlternateSetting = 0x00, 19 .bNumEndpoints = 0x02, 20 .bInterfaceClass = ROCKUSB_INTERFACE_CLASS, 21 .bInterfaceSubClass = ROCKUSB_INTERFACE_SUB_CLASS, 22 .bInterfaceProtocol = ROCKUSB_INTERFACE_PROTOCOL, 23 }; 24 25 static struct usb_descriptor_header *rkusb_fs_function[] = { 26 (struct usb_descriptor_header *)&rkusb_intf_desc, 27 (struct usb_descriptor_header *)&fsg_fs_bulk_in_desc, 28 (struct usb_descriptor_header *)&fsg_fs_bulk_out_desc, 29 NULL, 30 }; 31 32 static struct usb_descriptor_header *rkusb_hs_function[] = { 33 (struct usb_descriptor_header *)&rkusb_intf_desc, 34 (struct usb_descriptor_header *)&fsg_hs_bulk_in_desc, 35 (struct usb_descriptor_header *)&fsg_hs_bulk_out_desc, 36 NULL, 37 }; 38 39 struct rk_flash_info { 40 u32 flash_size; 41 u16 block_size; 42 u8 page_size; 43 u8 ecc_bits; 44 u8 access_time; 45 u8 manufacturer; 46 u8 flash_mask; 47 } __packed; 48 49 int g_dnl_bind_fixup(struct usb_device_descriptor *dev, const char *name) 50 { 51 if (IS_RKUSB_UMS_DNL(name)) { 52 /* Fix to Rockchip VID and PID */ 53 dev->idVendor = __constant_cpu_to_le16(0x2207); 54 dev->idProduct = __constant_cpu_to_le16(CONFIG_ROCKUSB_G_DNL_PID); 55 56 /* Enumerate as a loader device */ 57 dev->bcdUSB = cpu_to_le16(0x0201); 58 } 59 60 return 0; 61 } 62 63 __maybe_unused 64 static inline void dump_cbw(struct fsg_bulk_cb_wrap *cbw) 65 { 66 assert(!cbw); 67 68 debug("%s:\n", __func__); 69 debug("Signature %x\n", cbw->Signature); 70 debug("Tag %x\n", cbw->Tag); 71 debug("DataTransferLength %x\n", cbw->DataTransferLength); 72 debug("Flags %x\n", cbw->Flags); 73 debug("LUN %x\n", cbw->Lun); 74 debug("Length %x\n", cbw->Length); 75 debug("OptionCode %x\n", cbw->CDB[0]); 76 debug("SubCode %x\n", cbw->CDB[1]); 77 debug("SectorAddr %x\n", get_unaligned_be32(&cbw->CDB[2])); 78 debug("BlkSectors %x\n\n", get_unaligned_be16(&cbw->CDB[7])); 79 } 80 81 static int rkusb_check_lun(struct fsg_common *common) 82 { 83 struct fsg_lun *curlun; 84 85 /* Check the LUN */ 86 if (common->lun >= 0 && common->lun < common->nluns) { 87 curlun = &common->luns[common->lun]; 88 if (common->cmnd[0] != SC_REQUEST_SENSE) { 89 curlun->sense_data = SS_NO_SENSE; 90 curlun->info_valid = 0; 91 } 92 } else { 93 curlun = NULL; 94 common->bad_lun_okay = 0; 95 96 /* 97 * INQUIRY and REQUEST SENSE commands are explicitly allowed 98 * to use unsupported LUNs; all others may not. 99 */ 100 if (common->cmnd[0] != SC_INQUIRY && 101 common->cmnd[0] != SC_REQUEST_SENSE) { 102 debug("unsupported LUN %d\n", common->lun); 103 return -EINVAL; 104 } 105 } 106 107 return 0; 108 } 109 110 static void __do_reset(struct usb_ep *ep, struct usb_request *req) 111 { 112 do_reset(NULL, 0, 0, NULL); 113 } 114 115 static int rkusb_do_reset(struct fsg_common *common, 116 struct fsg_buffhd *bh) 117 { 118 common->data_size_from_cmnd = common->cmnd[4]; 119 common->residue = 0; 120 bh->inreq->complete = __do_reset; 121 bh->state = BUF_STATE_EMPTY; 122 123 return 0; 124 } 125 126 static int rkusb_do_test_unit_ready(struct fsg_common *common, 127 struct fsg_buffhd *bh) 128 { 129 common->residue = 0x06 << 24; /* Max block xfer support from host */ 130 common->data_dir = DATA_DIR_NONE; 131 bh->state = BUF_STATE_EMPTY; 132 133 return 0; 134 } 135 136 static int rkusb_do_read_flash_id(struct fsg_common *common, 137 struct fsg_buffhd *bh) 138 { 139 u8 *buf = (u8 *)bh->buf; 140 u32 len = common->data_size; 141 142 memcpy((void *)&buf[0], "EMMC ", 5); 143 144 /* Set data xfer size */ 145 common->residue = common->data_size_from_cmnd = len; 146 147 return len; 148 } 149 150 static int rkusb_do_test_bad_block(struct fsg_common *common, 151 struct fsg_buffhd *bh) 152 { 153 u8 *buf = (u8 *)bh->buf; 154 u32 len = common->data_size; 155 156 memset((void *)&buf[0], 0, len); 157 158 /* Set data xfer size */ 159 common->residue = common->data_size_from_cmnd = len; 160 161 return len; 162 } 163 164 static int rkusb_do_read_flash_info(struct fsg_common *common, 165 struct fsg_buffhd *bh) 166 { 167 u8 *buf = (u8 *)bh->buf; 168 u32 len = common->data_size; 169 struct rk_flash_info finfo = { 170 .block_size = 1024, 171 .ecc_bits = 0, 172 .page_size = 4, 173 .access_time = 40, 174 .manufacturer = 0, 175 .flash_mask = 0 176 }; 177 178 finfo.flash_size = (u32)ums[common->lun].block_dev.lba; 179 if (finfo.flash_size) 180 finfo.flash_mask = 1; 181 182 memset((void *)&buf[0], 0, len); 183 memcpy((void *)&buf[0], (void *)&finfo, len); 184 185 /* Set data xfer size */ 186 common->residue = common->data_size_from_cmnd = len; 187 188 return len; 189 } 190 191 static int rkusb_do_lba_erase(struct fsg_common *common, 192 struct fsg_buffhd *bh) 193 { 194 struct fsg_lun *curlun = &common->luns[common->lun]; 195 u32 lba, amount; 196 loff_t file_offset; 197 int rc; 198 199 lba = get_unaligned_be32(&common->cmnd[2]); 200 if (lba >= curlun->num_sectors) { 201 curlun->sense_data = SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE; 202 rc = -EINVAL; 203 goto out; 204 } 205 206 file_offset = ((loff_t) lba) << 9; 207 amount = get_unaligned_be16(&common->cmnd[7]) << 9; 208 if (unlikely(amount == 0)) { 209 curlun->sense_data = SS_INVALID_FIELD_IN_CDB; 210 rc = -EIO; 211 goto out; 212 } 213 214 /* Perform the erase */ 215 rc = ums[common->lun].erase_sector(&ums[common->lun], 216 file_offset / SECTOR_SIZE, 217 amount / SECTOR_SIZE); 218 if (!rc) { 219 curlun->sense_data = SS_MEDIUM_NOT_PRESENT; 220 rc = -EIO; 221 } 222 223 out: 224 common->data_dir = DATA_DIR_NONE; 225 bh->state = BUF_STATE_EMPTY; 226 227 return rc; 228 } 229 230 static int rkusb_do_read_capacity(struct fsg_common *common, 231 struct fsg_buffhd *bh) 232 { 233 u8 *buf = (u8 *)bh->buf; 234 u32 len = common->data_size; 235 236 /* 237 * bit[0]: Direct LBA, 0: Disabled; 238 * bit[1:63}: Reserved. 239 */ 240 memset((void *)&buf[0], 0, len); 241 242 /* Set data xfer size */ 243 common->residue = common->data_size_from_cmnd = len; 244 245 return len; 246 } 247 248 static int rkusb_cmd_process(struct fsg_common *common, 249 struct fsg_buffhd *bh, int *reply) 250 { 251 struct usb_request *req = bh->outreq; 252 struct fsg_bulk_cb_wrap *cbw = req->buf; 253 int rc; 254 255 dump_cbw(cbw); 256 257 if (rkusb_check_lun(common)) { 258 *reply = -EINVAL; 259 return RKUSB_RC_ERROR; 260 } 261 262 switch (common->cmnd[0]) { 263 case RKUSB_TEST_UNIT_READY: 264 *reply = rkusb_do_test_unit_ready(common, bh); 265 rc = RKUSB_RC_FINISHED; 266 break; 267 268 case RKUSB_READ_FLASH_ID: 269 *reply = rkusb_do_read_flash_id(common, bh); 270 rc = RKUSB_RC_FINISHED; 271 break; 272 273 case RKUSB_TEST_BAD_BLOCK: 274 *reply = rkusb_do_test_bad_block(common, bh); 275 rc = RKUSB_RC_FINISHED; 276 break; 277 278 case RKUSB_LBA_READ_10: 279 common->cmnd[0] = SC_READ_10; 280 common->cmnd[1] = 0; /* Not support */ 281 rc = RKUSB_RC_CONTINUE; 282 break; 283 284 case RKUSB_LBA_WRITE_10: 285 common->cmnd[0] = SC_WRITE_10; 286 common->cmnd[1] = 0; /* Not support */ 287 rc = RKUSB_RC_CONTINUE; 288 break; 289 290 case RKUSB_READ_FLASH_INFO: 291 *reply = rkusb_do_read_flash_info(common, bh); 292 rc = RKUSB_RC_FINISHED; 293 break; 294 295 case RKUSB_LBA_ERASE: 296 *reply = rkusb_do_lba_erase(common, bh); 297 rc = RKUSB_RC_FINISHED; 298 break; 299 300 case RKUSB_READ_CAPACITY: 301 *reply = rkusb_do_read_capacity(common, bh); 302 rc = RKUSB_RC_FINISHED; 303 break; 304 305 case RKUSB_RESET: 306 *reply = rkusb_do_reset(common, bh); 307 rc = RKUSB_RC_FINISHED; 308 break; 309 310 case RKUSB_SET_DEVICE_ID: 311 case RKUSB_READ_10: 312 case RKUSB_WRITE_10: 313 case RKUSB_ERASE_10: 314 case RKUSB_WRITE_SPARE: 315 case RKUSB_READ_SPARE: 316 case RKUSB_ERASE_10_FORCE: 317 case RKUSB_GET_VERSION: 318 case RKUSB_ERASE_SYS_DISK: 319 case RKUSB_SDRAM_READ_10: 320 case RKUSB_SDRAM_WRITE_10: 321 case RKUSB_SDRAM_EXECUTE: 322 case RKUSB_GET_CHIP_VER: 323 case RKUSB_LOW_FORMAT: 324 case RKUSB_SET_RESET_FLAG: 325 case RKUSB_SPI_READ_10: 326 case RKUSB_SPI_WRITE_10: 327 case RKUSB_SESSION: 328 /* Fall through */ 329 default: 330 rc = RKUSB_RC_UNKNOWN_CMND; 331 break; 332 } 333 334 return rc; 335 } 336 337 DECLARE_GADGET_BIND_CALLBACK(rkusb_ums_dnl, fsg_add); 338