Diff for /wikisrc/users/mlelstv/disk-driver-template.mdwn between versions 1.6 and 1.12

version 1.6, 2015/12/21 12:28:21 version 1.12, 2016/12/08 11:39:34
Line 25  const struct bdevsw xxx_bdevsww= { Line 25  const struct bdevsw xxx_bdevsww= {
         .d_dump = xxxdump,          .d_dump = xxxdump,
         .d_psize = xxxsize,          .d_psize = xxxsize,
         .d_discard = xxxdiscard,          .d_discard = xxxdiscard,
         .d_flag = D_DISK          .d_flag = D_DISK | D_MPSAFE
 };  };
   
 const struct cdevsw xxx_cdevsw = {  const struct cdevsw xxx_cdevsw = {
Line 40  const struct cdevsw xxx_cdevsw = { Line 40  const struct cdevsw xxx_cdevsw = {
         .d_mmap = nommap,          .d_mmap = nommap,
         .d_kqfilter = nokqfilter,          .d_kqfilter = nokqfilter,
         .d_discard = xxxdiscard,          .d_discard = xxxdiscard,
         .d_flag = D_DISK          .d_flag = D_DISK | D_MPSAFE
 };  };
   
 static void     xxxminphys(struct buf *bp);  static void     xxxminphys(struct buf *bp);
Line 54  static const struct dkdriver xxxdkdriver Line 54  static const struct dkdriver xxxdkdriver
         .d_open = xxxopen,          .d_open = xxxopen,
         .d_close = xxxclose,          .d_close = xxxclose,
         .d_strategy = xxxstrategy,          .d_strategy = xxxstrategy,
         .d_iosize = xxx_iosize,  
         .d_minphys  = xxxminphys,          .d_minphys  = xxxminphys,
         .d_diskstart = xxx_diskstart,          .d_diskstart = xxx_diskstart,
         .d_dumpblocks = xxx_dumpblocks,          .d_discard = xxx_discard,
         .d_lastclose = xxx_lastclose,          .d_dumpblocks = xxx_dumpblocks, /* optional */
         .d_discard = xxx_discard          .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 int      xxx_match(device_t, cfdata_t, void *);
 static void     xxx_attach(device_t, device_t, void *);  static void     xxx_attach(device_t, device_t, void *);
 static int      xxx_detach(device_t, int);  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 */
           // private data
   };
   
 CFATTACH_DECL3_NEW(xxx, sizeof(struct xxx_softc),  CFATTACH_DECL3_NEW(xxx, sizeof(struct xxx_softc),
     xxx_match, xxx_attach, xxx_detach, NULL, NULL, NULL, DVF_DETACH_SHUTDOWN);      xxx_match, xxx_attach, xxx_detach, NULL, NULL, NULL, DVF_DETACH_SHUTDOWN);
Line 72  CFATTACH_DECL3_NEW(xxx, sizeof(struct xx Line 80  CFATTACH_DECL3_NEW(xxx, sizeof(struct xx
 extern struct   cfdriver xxx_cd;  extern struct   cfdriver xxx_cd;
   
 #ifdef PSEUDODEVICE  #ifdef PSEUDODEVICE
 static void     xxxattach(int num);  static void     xxxattach(int);
   static device_t xxx_create(int);
   static int      xxx_destroy(device_t);
 #endif  #endif
   
 static int      xxx_init(device_t);  static int      xxx_init(device_t);
Line 101  static int      xxxdone(struct buf *); Line 111  static int      xxxdone(struct buf *);
 void  void
 xxxattach(int num)  xxxattach(int num)
 {  {
   #ifndef _MODULE
         int error;          int error;
   
         error = config_cfattach_attach(xxx_cd.cd_name, &xxx_ca);          error = config_cfattach_attach(xxx_cd.cd_name, &xxx_ca);
Line 111  xxxattach(int num) Line 122  xxxattach(int num)
         }          }
   
         // some global initialization          // some global initialization
   #endif
   }
   
   static device_t
   xxx_create(int unit)
   {
           cfdata_t cf;
           device_t dv;
   
           cf = malloc(sizeof(*cf), M_DEVBUF, M_WAITOK);
           cf->cf_name = xxx_cd.cd_name;
           cf->cf_atname = xxx_cd.cd_name;
           cf->cf_unit = unit;
           cf->cf_fstate = FSTATE_STAR;
   
           dv = config_attach_pseudo(cf);
           if (dv == NULL) {
                   aprint_error("%s: failed to attach pseudo device\n",
                       xxx_cd.cd_name);
                   free(cf, M_DEVBUF);
           }
   
           return dv;
   }
   
   static int
   xxx_destroy(device_t dv)
   {
           int error;
           cfdata_t cf;
   
           cf = device_cfdata(dv);
           error = config_detach(dev, DETACH_QUIET);
           if (error)
                   return error;
           free(cf, M_DEVBUF);
           return 0;
 }  }
 #endif  #endif
   
Line 298  xxx_detach(device_t self, int flags) Line 346  xxx_detach(device_t self, int flags)
         xxx_finish(self);          xxx_finish(self);
 #endif  #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;
   }
 </code></pre>  </code></pre>
   
 ----  ----
Line 346  xxx_modcmd(modcmd_t cmd, void *data) Line 407  xxx_modcmd(modcmd_t cmd, void *data)
   
 #ifdef PSEUDODEVICE  #ifdef PSEUDODEVICE
                 xxxattach(0);                  xxxattach(0);
                 // devices instances are created by xxxconfig utility  
                 // and some private ioctl  
 #else  
                 // magic happens to create device instances  
 #endif  
 #endif  #endif
                 break;                  break;
         case MODULE_CMD_FINI:          case MODULE_CMD_FINI:
                 // outside of #ifdef _MODULE to allow removal of builtins                  // outside of #ifdef _MODULE to allow removal of builtins
 #ifdef PSEUDODEVICE  
                 // magic happens to destroy device instances  
 #else  
                 // magic happens to destroy device instances  
 #endif  
   
                 // some global finalization                  // some global finalization
 #ifdef _MODULE  #ifdef _MODULE
                 error = config_cfattach_detach(&xxx_cd.cd_name, &xxx_ca);                  error = config_cfattach_detach(&xxx_cd.cd_name, &xxx_ca);
Line 388  xxx_modcmd(modcmd_t cmd, void *data) Line 438  xxx_modcmd(modcmd_t cmd, void *data)
   
 <pre><code>  <pre><code>
 static int  static int
   xxx_firstopen(device_t dv)
   {
           // private startup
   
           return 0;
   }
   
   static int
 xxx_lastclose(device_t dv)  xxx_lastclose(device_t dv)
 {  {
         // private cleanup          // private cleanup
Line 406  static int Line 464  static int
 xxx_dumpblocks(device_t dv, void *va, daddr_t blkno, int nblk)  xxx_dumpblocks(device_t dv, void *va, daddr_t blkno, int nblk)
 {  {
         // issue polling I/O to dump a page          // issue polling I/O to dump a page
           // return error
 }  }
   
 static void  static void
Line 418  static int Line 477  static int
 xxx_discard(device_t dv, off_t pos, off_t len)  xxx_discard(device_t dv, off_t pos, off_t len)
 {  {
         // issue request to discard bytes          // 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
   }
   
 </code></pre>  </code></pre>
   
 ----  ----
Line 437  xxxstrategy(struct buf *bp) Line 505  xxxstrategy(struct buf *bp)
         // wake up I/O thread          // wake up I/O thread
 }  }
   
 static int  
 xxx_diskstart(device_t dv, struct buf *bp)  
 {  
         // issue I/O for bp  
 }  
   
 static void  static void
 xxxdone(struct xxx_softc *sc, struct buf *bp)  xxxdone(struct xxx_softc *sc, struct buf *bp)
 {  {
Line 453  xxxdone(struct xxx_softc *sc, struct buf Line 515  xxxdone(struct xxx_softc *sc, struct buf
 }  }
   
 static void  static void
 xxx_IOTHREAD(struct dk_softc *dksc)  xxx_iothread(struct dk_softc *dksc)
 {  {
         while (!shutting_down) {          while (!shutting_down) {
                 if (dk_strategy_pending(dksc))                  if (dk_strategy_pending(dksc))

Removed from v.1.6  
changed lines
  Added in v.1.12


CVSweb for NetBSD wikisrc <wikimaster@NetBSD.org> software: FreeBSD-CVSweb