|
|
#include <sys/ddi.h>void prefixbiostart(void *idata, channel_t channel, buf_t *bp);
The I/O request described by bp and the associated physical data buffer are guaranteed to meet the constraints required by the driver for this device instance. The driver informs the core kernel of its buffer constraints with the DI_RBCBP (for B_READ requests) and DI_WBCBP (for B_WRITE requests) subfunctions of the devinfo(D2) entry point routine.
The starting device offset for the I/O transfer
is given by the bp->b_blkno
and
bp->b_blkoff
members of the
buf(D4)
structure and is guaranteed to be non-negative.
The number of bytes to transfer is given by the
bp->b_bcount
member.
If the driver informs the core kernel of its device's size
with the DI_SIZE subfunction of the
devinfo(D2)
routine,
the device offset range is guaranteed
not to extend beyond the end of the device.
If the driver does not report its device's size,
the driver itself must check for end-of-media.
It does this by setting the bp->b_resid
member
to the number of bytes beyond the end of the device.
It must also call the
bioerror(D3)
function to fail the transfer
with the ENXIO error number,
unless the B_READ flag is set in the
bp->b_flags
member
and the starting device offset is exactly at
the end of the device.
If there is any valid data to transfer, the driver may either start the device I/O immediately or queue it for later processing. The driver then returns from this entry point routine. At a later time, when the I/O has completed or failed, the driver must call the biodone(D3) function to inform the caller of the completion. If the request does not actually require any I/O, the driver may call biodone( ) before returning.
Before calling
biodone( ),
the driver must reflect the status of the transfer
into the buffer header.
It must set the bp->b_resid
member
to the number of bytes not transferred for any reason.
If no bytes were transferred,
bp->b_resid
must be set to the initial value of
the bp->b_bcount
member;
if all of the data bytes were transferred,
bp->b_resid
must be set to 0.
If some portion of the data failed to be transferred
because of some error condition,
call the
bioerror(D3)
funtion to store
the appropriate error number from
errnos(D5)
in the buffer header.
See the description of the
b_addrtype
member of the
buf(D4)
structure for a description of
how to access the actual transfer data in the buffer.
d_biostart
member of their
drvops(D4)
structure.