Rev 3537 | Rev 3539 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 3537 | Rev 3538 | ||
|---|---|---|---|
| Line 174... | Line 174... | ||
| 174 | } |
174 | } |
| 175 | 175 | ||
| 176 | int block_bb_read(dev_handle_t dev_handle, off_t off, size_t size) |
176 | int block_bb_read(dev_handle_t dev_handle, off_t off, size_t size) |
| 177 | { |
177 | { |
| 178 | void *bb_buf; |
178 | void *bb_buf; |
| - | 179 | int rc; |
|
| 179 | 180 | ||
| 180 | devcon_t *devcon = devcon_search(dev_handle); |
181 | devcon_t *devcon = devcon_search(dev_handle); |
| 181 | if (!devcon) |
182 | if (!devcon) |
| 182 | return ENOENT; |
183 | return ENOENT; |
| 183 | if (devcon->bb_buf) |
184 | if (devcon->bb_buf) |
| Line 186... | Line 187... | ||
| 186 | if (!bb_buf) |
187 | if (!bb_buf) |
| 187 | return ENOMEM; |
188 | return ENOMEM; |
| 188 | 189 | ||
| 189 | off_t bufpos = 0; |
190 | off_t bufpos = 0; |
| 190 | size_t buflen = 0; |
191 | size_t buflen = 0; |
| 191 | if (!block_read(dev_handle, &bufpos, &buflen, &off, |
192 | rc = block_read(dev_handle, &bufpos, &buflen, &off, |
| 192 | bb_buf, size, size)) { |
193 | bb_buf, size, size); |
| - | 194 | if (rc != EOK) { |
|
| 193 | free(bb_buf); |
195 | free(bb_buf); |
| 194 | return EIO; /* XXX real error code */ |
196 | return rc; |
| 195 | } |
197 | } |
| 196 | devcon->bb_buf = bb_buf; |
198 | devcon->bb_buf = bb_buf; |
| 197 | devcon->bb_off = off; |
199 | devcon->bb_off = off; |
| 198 | devcon->bb_size = size; |
200 | devcon->bb_size = size; |
| 199 | 201 | ||
| Line 217... | Line 219... | ||
| 217 | * @param pos Device position to be read. |
219 | * @param pos Device position to be read. |
| 218 | * @param dst Destination buffer. |
220 | * @param dst Destination buffer. |
| 219 | * @param size Size of the destination buffer. |
221 | * @param size Size of the destination buffer. |
| 220 | * @param block_size Block size to be used for the transfer. |
222 | * @param block_size Block size to be used for the transfer. |
| 221 | * |
223 | * |
| 222 | * @return True on success, false on failure. |
224 | * @return EOK on success or a negative return code on failure. |
| 223 | */ |
225 | */ |
| 224 | bool |
226 | int |
| 225 | block_read(int dev_handle, off_t *bufpos, size_t *buflen, off_t *pos, void *dst, |
227 | block_read(int dev_handle, off_t *bufpos, size_t *buflen, off_t *pos, void *dst, |
| 226 | size_t size, size_t block_size) |
228 | size_t size, size_t block_size) |
| 227 | { |
229 | { |
| 228 | off_t offset = 0; |
230 | off_t offset = 0; |
| 229 | size_t left = size; |
231 | size_t left = size; |
| Line 254... | Line 256... | ||
| 254 | /* Refill the communication buffer with a new block. */ |
256 | /* Refill the communication buffer with a new block. */ |
| 255 | ipcarg_t retval; |
257 | ipcarg_t retval; |
| 256 | int rc = async_req_2_1(devcon->dev_phone, RD_READ_BLOCK, |
258 | int rc = async_req_2_1(devcon->dev_phone, RD_READ_BLOCK, |
| 257 | *pos / block_size, block_size, &retval); |
259 | *pos / block_size, block_size, &retval); |
| 258 | if ((rc != EOK) || (retval != EOK)) |
260 | if ((rc != EOK) || (retval != EOK)) |
| 259 | return false; |
261 | return (rc != EOK ? rc : retval); |
| 260 | 262 | ||
| 261 | *bufpos = 0; |
263 | *bufpos = 0; |
| 262 | *buflen = block_size; |
264 | *buflen = block_size; |
| 263 | } |
265 | } |
| 264 | } |
266 | } |
| 265 | 267 | ||
| 266 | return true; |
268 | return EOK; |
| 267 | } |
269 | } |
| 268 | 270 | ||
| 269 | block_t *block_get(dev_handle_t dev_handle, off_t offset, size_t bs) |
271 | block_t *block_get(dev_handle_t dev_handle, off_t offset, size_t bs) |
| 270 | { |
272 | { |
| 271 | /* FIXME */ |
273 | /* FIXME */ |
| Line 283... | Line 285... | ||
| 283 | free(b); |
285 | free(b); |
| 284 | return NULL; |
286 | return NULL; |
| 285 | } |
287 | } |
| 286 | b->size = bs; |
288 | b->size = bs; |
| 287 | 289 | ||
| 288 | if (!block_read(dev_handle, &bufpos, &buflen, &pos, b->data, |
290 | if (block_read(dev_handle, &bufpos, &buflen, &pos, b->data, |
| 289 | bs, bs)) { |
291 | bs, bs) != EOK) { |
| 290 | free(b->data); |
292 | free(b->data); |
| 291 | free(b); |
293 | free(b); |
| 292 | return NULL; |
294 | return NULL; |
| 293 | } |
295 | } |
| 294 | 296 | ||