Changeset 1b973dc in mainline for uspace/lib/drv/generic/remote_ahci.c
- Timestamp:
- 2013-12-31T21:41:45Z (11 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 1bb9833
- Parents:
- 4c14b88 (diff), 8a84484 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/drv/generic/remote_ahci.c
r4c14b88 r1b973dc 33 33 */ 34 34 35 #include <as.h> 35 36 #include <async.h> 37 #include <devman.h> 36 38 #include <errno.h> 37 39 #include <stdio.h> 40 #include <macros.h> 38 41 #include "ahci_iface.h" 39 42 #include "ddf/driver.h" … … 47 50 } ahci_iface_funcs_t; 48 51 52 #define MAX_NAME_LENGTH 1024 53 49 54 #define LO(ptr) \ 50 55 ((uint32_t) (((uint64_t) ((uintptr_t) (ptr))) & 0xffffffff)) … … 53 58 ((uint32_t) (((uint64_t) ((uintptr_t) (ptr))) >> 32)) 54 59 60 async_sess_t* ahci_get_sess(devman_handle_t funh, char **name) 61 { 62 // FIXME: Use a better way than substring match 63 64 *name = NULL; 65 66 char devn[MAX_NAME_LENGTH]; 67 int rc = devman_fun_get_name(funh, devn, MAX_NAME_LENGTH); 68 if (rc != EOK) 69 return NULL; 70 71 size_t devn_size = str_size(devn); 72 73 if ((devn_size > 5) && (str_lcmp(devn, "ahci_", 5) == 0)) { 74 async_sess_t *sess = devman_device_connect(EXCHANGE_PARALLEL, 75 funh, IPC_FLAG_BLOCKING); 76 77 if (sess) { 78 *name = str_dup(devn); 79 return sess; 80 } 81 } 82 83 return NULL; 84 } 85 86 int ahci_get_sata_device_name(async_sess_t *sess, size_t sata_dev_name_length, 87 char *sata_dev_name) 88 { 89 async_exch_t *exch = async_exchange_begin(sess); 90 if (!exch) 91 return EINVAL; 92 93 aid_t req = async_send_2(exch, DEV_IFACE_ID(AHCI_DEV_IFACE), 94 IPC_M_AHCI_GET_SATA_DEVICE_NAME, sata_dev_name_length, NULL); 95 96 async_data_read_start(exch, sata_dev_name, sata_dev_name_length); 97 98 sysarg_t rc; 99 async_wait_for(req, &rc); 100 101 return rc; 102 } 103 104 int ahci_get_num_blocks(async_sess_t *sess, uint64_t *blocks) 105 { 106 async_exch_t *exch = async_exchange_begin(sess); 107 if (!exch) 108 return EINVAL; 109 110 sysarg_t blocks_hi; 111 sysarg_t blocks_lo; 112 int rc = async_req_1_2(exch, DEV_IFACE_ID(AHCI_DEV_IFACE), 113 IPC_M_AHCI_GET_NUM_BLOCKS, &blocks_hi, &blocks_lo); 114 115 async_exchange_end(exch); 116 117 if (rc == EOK) { 118 *blocks = (((uint64_t) blocks_hi) << 32) 119 | (((uint64_t) blocks_lo) & 0xffffffff); 120 } 121 122 return rc; 123 } 124 125 int ahci_get_block_size(async_sess_t *sess, size_t *blocks_size) 126 { 127 async_exch_t *exch = async_exchange_begin(sess); 128 if (!exch) 129 return EINVAL; 130 131 sysarg_t bs; 132 int rc = async_req_1_1(exch, DEV_IFACE_ID(AHCI_DEV_IFACE), 133 IPC_M_AHCI_GET_BLOCK_SIZE, &bs); 134 135 async_exchange_end(exch); 136 137 if (rc == EOK) 138 *blocks_size = (size_t) bs; 139 140 return rc; 141 } 142 143 int ahci_read_blocks(async_sess_t *sess, uint64_t blocknum, size_t count, 144 void *buf) 145 { 146 async_exch_t *exch = async_exchange_begin(sess); 147 if (!exch) 148 return EINVAL; 149 150 aid_t req; 151 req = async_send_4(exch, DEV_IFACE_ID(AHCI_DEV_IFACE), 152 IPC_M_AHCI_READ_BLOCKS, HI(blocknum), LO(blocknum), count, NULL); 153 154 async_share_out_start(exch, buf, AS_AREA_READ | AS_AREA_WRITE); 155 156 async_exchange_end(exch); 157 158 sysarg_t rc; 159 async_wait_for(req, &rc); 160 161 return rc; 162 } 163 164 int ahci_write_blocks(async_sess_t *sess, uint64_t blocknum, size_t count, 165 void* buf) 166 { 167 async_exch_t *exch = async_exchange_begin(sess); 168 if (!exch) 169 return EINVAL; 170 171 aid_t req = async_send_4(exch, DEV_IFACE_ID(AHCI_DEV_IFACE), 172 IPC_M_AHCI_WRITE_BLOCKS, HI(blocknum), LO(blocknum), count, NULL); 173 174 async_share_out_start(exch, buf, AS_AREA_READ | AS_AREA_WRITE); 175 176 async_exchange_end(exch); 177 178 sysarg_t rc; 179 async_wait_for(req, &rc); 180 181 return rc; 182 } 183 55 184 static void remote_ahci_get_sata_device_name(ddf_fun_t *, void *, ipc_callid_t, 56 185 ipc_call_t *); … … 65 194 66 195 /** Remote AHCI interface operations. */ 67 static remote_iface_func_ptr_t remote_ahci_iface_ops [] = {196 static const remote_iface_func_ptr_t remote_ahci_iface_ops [] = { 68 197 [IPC_M_AHCI_GET_SATA_DEVICE_NAME] = remote_ahci_get_sata_device_name, 69 198 [IPC_M_AHCI_GET_NUM_BLOCKS] = remote_ahci_get_num_blocks, … … 75 204 /** Remote AHCI interface structure. 76 205 */ 77 remote_iface_t remote_ahci_iface = { 78 .method_count = sizeof(remote_ahci_iface_ops) / 79 sizeof(remote_ahci_iface_ops[0]), 206 const remote_iface_t remote_ahci_iface = { 207 .method_count = ARRAY_SIZE(remote_ahci_iface_ops), 80 208 .methods = remote_ahci_iface_ops 81 209 };
Note:
See TracChangeset
for help on using the changeset viewer.