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 |