Changeset a35b458 in mainline for uspace/lib/drv/generic/remote_ahci.c
- Timestamp:
- 2018-03-02T20:10:49Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f1380b7
- Parents:
- 3061bc1
- git-author:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-02-28 17:38:31)
- git-committer:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-03-02 20:10:49)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/drv/generic/remote_ahci.c
r3061bc1 ra35b458 62 62 { 63 63 // FIXME: Use a better way than substring match 64 64 65 65 *name = NULL; 66 66 67 67 char devn[MAX_NAME_LENGTH]; 68 68 errno_t rc = devman_fun_get_name(funh, devn, MAX_NAME_LENGTH); 69 69 if (rc != EOK) 70 70 return NULL; 71 71 72 72 size_t devn_size = str_size(devn); 73 73 74 74 if ((devn_size > 5) && (str_lcmp(devn, "ahci_", 5) == 0)) { 75 75 async_sess_t *sess = devman_device_connect(funh, IPC_FLAG_BLOCKING); 76 76 77 77 if (sess) { 78 78 *name = str_dup(devn); … … 80 80 } 81 81 } 82 82 83 83 return NULL; 84 84 } … … 90 90 if (!exch) 91 91 return EINVAL; 92 92 93 93 aid_t req = async_send_2(exch, DEV_IFACE_ID(AHCI_DEV_IFACE), 94 94 IPC_M_AHCI_GET_SATA_DEVICE_NAME, sata_dev_name_length, NULL); 95 95 96 96 async_data_read_start(exch, sata_dev_name, sata_dev_name_length); 97 97 98 98 errno_t rc; 99 99 async_wait_for(req, &rc); 100 100 101 101 return rc; 102 102 } … … 107 107 if (!exch) 108 108 return EINVAL; 109 109 110 110 sysarg_t blocks_hi; 111 111 sysarg_t blocks_lo; 112 112 errno_t rc = async_req_1_2(exch, DEV_IFACE_ID(AHCI_DEV_IFACE), 113 113 IPC_M_AHCI_GET_NUM_BLOCKS, &blocks_hi, &blocks_lo); 114 114 115 115 async_exchange_end(exch); 116 116 117 117 if (rc == EOK) { 118 118 *blocks = (((uint64_t) blocks_hi) << 32) 119 119 | (((uint64_t) blocks_lo) & 0xffffffff); 120 120 } 121 121 122 122 return rc; 123 123 } … … 128 128 if (!exch) 129 129 return EINVAL; 130 130 131 131 sysarg_t bs; 132 132 errno_t rc = async_req_1_1(exch, DEV_IFACE_ID(AHCI_DEV_IFACE), 133 133 IPC_M_AHCI_GET_BLOCK_SIZE, &bs); 134 134 135 135 async_exchange_end(exch); 136 136 137 137 if (rc == EOK) 138 138 *blocks_size = (size_t) bs; 139 139 140 140 return rc; 141 141 } … … 147 147 if (!exch) 148 148 return EINVAL; 149 149 150 150 aid_t req; 151 151 req = async_send_4(exch, DEV_IFACE_ID(AHCI_DEV_IFACE), 152 152 IPC_M_AHCI_READ_BLOCKS, HI(blocknum), LO(blocknum), count, NULL); 153 153 154 154 async_share_out_start(exch, buf, AS_AREA_READ | AS_AREA_WRITE); 155 155 156 156 async_exchange_end(exch); 157 157 158 158 errno_t rc; 159 159 async_wait_for(req, &rc); 160 160 161 161 return rc; 162 162 } … … 168 168 if (!exch) 169 169 return EINVAL; 170 170 171 171 aid_t req = async_send_4(exch, DEV_IFACE_ID(AHCI_DEV_IFACE), 172 172 IPC_M_AHCI_WRITE_BLOCKS, HI(blocknum), LO(blocknum), count, NULL); 173 173 174 174 async_share_out_start(exch, buf, AS_AREA_READ | AS_AREA_WRITE); 175 175 176 176 async_exchange_end(exch); 177 177 178 178 errno_t rc; 179 179 async_wait_for(req, &rc); 180 180 181 181 return rc; 182 182 } … … 213 213 { 214 214 const ahci_iface_t *ahci_iface = (ahci_iface_t *) iface; 215 215 216 216 if (ahci_iface->get_sata_device_name == NULL) { 217 217 async_answer_0(callid, ENOTSUP); 218 218 return; 219 219 } 220 220 221 221 const size_t sata_dev_name_length = 222 222 (size_t) DEV_IPC_GET_ARG1(*call); 223 223 224 224 char* sata_dev_name = malloc(sata_dev_name_length); 225 225 if (sata_dev_name == NULL) { … … 227 227 return; 228 228 } 229 229 230 230 const errno_t ret = ahci_iface->get_sata_device_name(fun, 231 231 sata_dev_name_length, sata_dev_name); 232 232 233 233 size_t real_size; 234 234 ipc_callid_t cid; … … 236 236 (real_size == sata_dev_name_length)) 237 237 async_data_read_finalize(cid, sata_dev_name, sata_dev_name_length); 238 238 239 239 free(sata_dev_name); 240 240 async_answer_0(callid, ret); … … 245 245 { 246 246 const ahci_iface_t *ahci_iface = (ahci_iface_t *) iface; 247 247 248 248 if (ahci_iface->get_num_blocks == NULL) { 249 249 async_answer_0(callid, ENOTSUP); 250 250 return; 251 251 } 252 252 253 253 uint64_t blocks; 254 254 const errno_t ret = ahci_iface->get_num_blocks(fun, &blocks); 255 255 256 256 if (ret != EOK) 257 257 async_answer_0(callid, ret); … … 264 264 { 265 265 const ahci_iface_t *ahci_iface = (ahci_iface_t *) iface; 266 266 267 267 if (ahci_iface->get_block_size == NULL) { 268 268 async_answer_0(callid, ENOTSUP); 269 269 return; 270 270 } 271 271 272 272 size_t blocks; 273 273 const errno_t ret = ahci_iface->get_block_size(fun, &blocks); 274 274 275 275 if (ret != EOK) 276 276 async_answer_0(callid, ret); … … 283 283 { 284 284 const ahci_iface_t *ahci_iface = (ahci_iface_t *) iface; 285 285 286 286 if (ahci_iface->read_blocks == NULL) { 287 287 async_answer_0(callid, ENOTSUP); 288 288 return; 289 289 } 290 290 291 291 size_t maxblock_size; 292 292 unsigned int flags; 293 293 294 294 ipc_callid_t cid; 295 295 async_share_out_receive(&cid, &maxblock_size, &flags); 296 296 297 297 void *buf; 298 298 async_share_out_finalize(cid, &buf); 299 299 300 300 const uint64_t blocknum = 301 301 (((uint64_t) (DEV_IPC_GET_ARG1(*call))) << 32) | 302 302 (((uint64_t) (DEV_IPC_GET_ARG2(*call))) & 0xffffffff); 303 303 const size_t cnt = (size_t) DEV_IPC_GET_ARG3(*call); 304 304 305 305 const errno_t ret = ahci_iface->read_blocks(fun, blocknum, cnt, buf); 306 306 307 307 async_answer_0(callid, ret); 308 308 } … … 312 312 { 313 313 const ahci_iface_t *ahci_iface = (ahci_iface_t *) iface; 314 314 315 315 if (ahci_iface->read_blocks == NULL) { 316 316 async_answer_0(callid, ENOTSUP); 317 317 return; 318 318 } 319 319 320 320 size_t maxblock_size; 321 321 unsigned int flags; 322 322 323 323 ipc_callid_t cid; 324 324 async_share_out_receive(&cid, &maxblock_size, &flags); 325 325 326 326 void *buf; 327 327 async_share_out_finalize(cid, &buf); 328 328 329 329 const uint64_t blocknum = 330 330 (((uint64_t)(DEV_IPC_GET_ARG1(*call))) << 32) | 331 331 (((uint64_t)(DEV_IPC_GET_ARG2(*call))) & 0xffffffff); 332 332 const size_t cnt = (size_t) DEV_IPC_GET_ARG3(*call); 333 333 334 334 const errno_t ret = ahci_iface->write_blocks(fun, blocknum, cnt, buf); 335 335 336 336 async_answer_0(callid, ret); 337 337 }
Note:
See TracChangeset
for help on using the changeset viewer.