Changeset 3ecc02e in mainline
- Timestamp:
- 2009-05-21T20:06:31Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 16d17ca
- Parents:
- ae55ee8
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/bd/gxe_bd/gxe_bd.c
rae55ee8 r3ecc02e 85 85 } gxe_buf_t; 86 86 87 static size_t maxblock_size = 512; 87 static const size_t block_size = 512; 88 static size_t comm_size; 89 88 90 static uintptr_t dev_physical = 0x13000000; 89 91 static gxe_bd_t *dev; … … 96 98 static int gxe_bd_init(void); 97 99 static void gxe_bd_connection(ipc_callid_t iid, ipc_call_t *icall); 98 static int gx e_bd_read_block(uint64_t offset, size_t block_size, void *buf);99 static int gxe_bd_ write_block(uint64_t offset, size_t block_size,100 100 static int gx_bd_rdwr(ipcarg_t method, off_t offset, off_t size, void *buf); 101 static int gxe_bd_read_block(uint64_t offset, size_t size, void *buf); 102 static int gxe_bd_write_block(uint64_t offset, size_t size, const void *buf); 101 103 102 104 int main(int argc, char **argv) … … 157 159 ipc_callid_t callid; 158 160 ipc_call_t call; 161 ipcarg_t method; 159 162 int flags; 160 163 int retval; 161 off_t offset;162 size_t block_size;164 off_t idx; 165 off_t size; 163 166 164 167 /* Answer the IPC_M_CONNECT_ME_TO call. */ 165 168 ipc_answer_0(iid, EOK); 166 169 167 if (!ipc_share_out_receive(&callid, & maxblock_size, &flags)) {170 if (!ipc_share_out_receive(&callid, &comm_size, &flags)) { 168 171 ipc_answer_0(callid, EHANGUP); 169 172 return; 170 173 } 171 maxblock_size = 512; 172 173 fs_va = as_get_mappable_page(maxblock_size); 174 175 fs_va = as_get_mappable_page(comm_size); 174 176 if (fs_va == NULL) { 175 177 ipc_answer_0(callid, EHANGUP); … … 181 183 while (1) { 182 184 callid = async_get_call(&call); 183 switch (IPC_GET_METHOD(call)) { 185 method = IPC_GET_METHOD(call); 186 switch (method) { 184 187 case IPC_M_PHONE_HUNGUP: 185 188 /* The other side has hung up. */ … … 187 190 return; 188 191 case BD_READ_BLOCK: 189 offset = IPC_GET_ARG1(call);190 block_size = IPC_GET_ARG2(call);191 retval = gxe_bd_read_block(offset, block_size, fs_va);192 break;193 192 case BD_WRITE_BLOCK: 194 offset = IPC_GET_ARG1(call); 195 block_size = IPC_GET_ARG2(call); 196 retval = gxe_bd_write_block(offset, block_size, fs_va); 193 idx = IPC_GET_ARG1(call); 194 size = IPC_GET_ARG2(call); 195 if (size > comm_size) { 196 retval = EINVAL; 197 break; 198 } 199 retval = gx_bd_rdwr(method, idx * size, size, fs_va); 197 200 break; 198 201 default: … … 204 207 } 205 208 206 static int gxe_bd_read_block(uint64_t offset, size_t block_size, void *buf) 209 static int gx_bd_rdwr(ipcarg_t method, off_t offset, off_t size, void *buf) 210 { 211 int rc; 212 size_t now; 213 214 while (size > 0) { 215 now = size < block_size ? size : block_size; 216 217 if (method == BD_READ_BLOCK) 218 rc = gxe_bd_read_block(offset, now, buf); 219 else 220 rc = gxe_bd_write_block(offset, now, buf); 221 222 if (rc != EOK) 223 return rc; 224 225 buf += block_size; 226 offset += block_size; 227 228 if (size > block_size) 229 size -= block_size; 230 else 231 size = 0; 232 } 233 234 return EOK; 235 } 236 237 static int gxe_bd_read_block(uint64_t offset, size_t size, void *buf) 207 238 { 208 239 uint32_t status; 209 240 size_t i; 210 241 uint32_t w; 211 212 if (block_size != maxblock_size) {213 printf("Failed: bs = %d, mbs = %d\n", block_size,214 maxblock_size);215 return EINVAL;216 }217 242 218 243 futex_down(&dev_futex); … … 227 252 } 228 253 229 for (i = 0; i < maxblock_size; i++) {254 for (i = 0; i < size; i++) { 230 255 ((uint8_t *) buf)[i] = w = 231 256 pio_read_8(&devbuf->buffer[i]); … … 236 261 } 237 262 238 static int gxe_bd_write_block(uint64_t offset, size_t block_size, 239 const void *buf) 263 static int gxe_bd_write_block(uint64_t offset, size_t size, const void *buf) 240 264 { 241 265 uint32_t status; … … 243 267 uint32_t w; 244 268 245 if (block_size != maxblock_size) { 246 printf("Failed: bs = %d, mbs = %d\n", block_size, 247 maxblock_size); 248 return EINVAL; 249 } 250 251 for (i = 0; i < maxblock_size; i++) { 269 for (i = 0; i < size; i++) { 252 270 pio_write_8(&devbuf->buffer[i], ((const uint8_t *) buf)[i]); 253 271 }
Note:
See TracChangeset
for help on using the changeset viewer.