--- wikisrc/users/mlelstv/disk-driver-template.mdwn 2016/11/28 06:11:23 1.8 +++ wikisrc/users/mlelstv/disk-driver-template.mdwn 2016/12/08 11:39:34 1.12 @@ -25,7 +25,7 @@ const struct bdevsw xxx_bdevsww= { .d_dump = xxxdump, .d_psize = xxxsize, .d_discard = xxxdiscard, - .d_flag = D_DISK + .d_flag = D_DISK | D_MPSAFE }; const struct cdevsw xxx_cdevsw = { @@ -40,7 +40,7 @@ const struct cdevsw xxx_cdevsw = { .d_mmap = nommap, .d_kqfilter = nokqfilter, .d_discard = xxxdiscard, - .d_flag = D_DISK + .d_flag = D_DISK | D_MPSAFE }; static void xxxminphys(struct buf *bp); @@ -54,17 +54,20 @@ static const struct dkdriver xxxdkdriver .d_open = xxxopen, .d_close = xxxclose, .d_strategy = xxxstrategy, - .d_iosize = xxx_iosize, .d_minphys = xxxminphys, .d_diskstart = xxx_diskstart, - .d_dumpblocks = xxx_dumpblocks, - .d_lastclose = xxx_lastclose, - .d_discard = xxx_discard + .d_discard = xxx_discard, + .d_dumpblocks = xxx_dumpblocks, /* optional */ + .d_iosize = xxx_iosize, /* optional */ + .d_lastclose = xxx_lastclose, /* optional */ + .d_firstopen = xxx_firstopen, /* optional */ + .d_label = xxx_label, /* optional */ }; static int xxx_match(device_t, cfdata_t, void *); static void xxx_attach(device_t, device_t, void *); static int xxx_detach(device_t, int); +static int xxx_activate(device_t, enum devact); struct xxx_softc { struct dk_softc sc_dksc; /* generic disk interface */ @@ -343,6 +346,19 @@ xxx_detach(device_t self, int flags) xxx_finish(self); #endif } + +static int +xxx_activate(device_t self, enum devact act) +{ + // switch (act) { + // case DVACT_ACTIVATE: + // return 0; + // case DVACT_DEACTIVATE: + // return 0; + // } + + return EOPNOTSUPP; +} ---- @@ -448,6 +464,7 @@ static int xxx_dumpblocks(device_t dv, void *va, daddr_t blkno, int nblk) { // issue polling I/O to dump a page + // return error } static void @@ -460,7 +477,16 @@ static int xxx_discard(device_t dv, off_t pos, off_t len) { // issue request to discard bytes + // return error +} + +static void +xxx_label(device_t dv, struct disklabel *lp) +{ + // lp is initialized for generic disk + // augment with driver specific information } + ---- @@ -479,12 +505,6 @@ xxxstrategy(struct buf *bp) // wake up I/O thread } -static int -xxx_diskstart(device_t dv, struct buf *bp) -{ - // issue I/O for bp -} - static void xxxdone(struct xxx_softc *sc, struct buf *bp) { @@ -495,7 +515,7 @@ xxxdone(struct xxx_softc *sc, struct buf } static void -xxx_IOTHREAD(struct dk_softc *dksc) +xxx_iothread(struct dk_softc *dksc) { while (!shutting_down) { if (dk_strategy_pending(dksc))