? sys/dev/mscp/.mscp.c.swp ? sys/dev/mscp/.mscp_subr.c.swp ? sys/dev/mscp/.mscpvar.h.swp Index: sys/dev/mscp/mscp.c =================================================================== RCS file: /cvsroot/src/sys/dev/mscp/mscp.c,v retrieving revision 1.29 diff -u -r1.29 mscp.c --- sys/dev/mscp/mscp.c 8 Apr 2008 20:10:44 -0000 1.29 +++ sys/dev/mscp/mscp.c 11 Jan 2009 01:02:27 -0000 @@ -86,6 +86,7 @@ #include #include #include +#include #include @@ -95,6 +96,13 @@ #define PCMD PSWP /* priority for command packet waits */ +/* An mscp workqueue item */ +struct mscp_work { + struct work mw_work; + struct mscp_softc *mw_mi; + struct mscp mw_mp; +}; + /* * Get a command packet. Second argument is true iff we are * to wait if necessary. Return NULL if none are available and @@ -297,11 +305,19 @@ break; if (drive == 0) { - struct drive_attach_args da; + struct mscp_work *mw; + + mw = kmem_zalloc(sizeof(*mw), KM_NOSLEEP); + if (mw == NULL) { + aprint_error_dev(&mi->mi_dev, + "out of memory, cannot attach\n"); + return; + } - da.da_mp = (struct mscp *)mp; - da.da_typ = mi->mi_type; - config_found(&mi->mi_dev, (void *)&da, mscp_print); + mw->mw_mi = mi; + mw->mw_mp = *mp; + + workqueue_enqueue(mi->mi_wq, (struct work *)mw, NULL); } else /* Hack to avoid complaints */ if (!(((mp->mscp_event & M_ST_MASK) == M_ST_AVAILABLE) @@ -469,3 +485,16 @@ panic("mscp_requeue"); } +void +mscp_worker(struct work *wk, void *dummy) +{ + struct mscp_work *mw = (struct mscp_work *)wk; + struct drive_attach_args da; + + da.da_mp = &mw->mw_mp; + da.da_typ = mw->mw_mi->mi_type; + + config_found(&mw->mw_mi->mi_dev, (void *)&da, mscp_print); + + kmem_free(mw, sizeof(*mw)); +} Index: sys/dev/mscp/mscp_subr.c =================================================================== RCS file: /cvsroot/src/sys/dev/mscp/mscp_subr.c,v retrieving revision 1.35 diff -u -r1.35 mscp_subr.c --- sys/dev/mscp/mscp_subr.c 8 Apr 2008 20:10:44 -0000 1.35 +++ sys/dev/mscp/mscp_subr.c 11 Jan 2009 01:02:28 -0000 @@ -226,6 +226,11 @@ mi->mi_me = &mt_device; } #endif + + if (workqueue_create(&mi->mi_wq, "mscp_wq", mscp_worker, NULL, + PRI_NONE, IPL_NONE, 0) != 0) + panic("%s: could not create workqueue", __func__); + /* * Go out and search for sub-units on this MSCP bus, * and call config_found for each found. Index: sys/dev/mscp/mscpvar.h =================================================================== RCS file: /cvsroot/src/sys/dev/mscp/mscpvar.h,v retrieving revision 1.15 diff -u -r1.15 mscpvar.h --- sys/dev/mscp/mscpvar.h 4 Mar 2007 06:02:14 -0000 1.15 +++ sys/dev/mscp/mscpvar.h 11 Jan 2009 01:02:28 -0000 @@ -70,6 +70,8 @@ * @(#)mscpvar.h 7.3 (Berkeley) 6/28/90 */ +#include + /* * MSCP generic driver configuration */ @@ -224,6 +226,7 @@ bus_space_handle_t mi_sah; /* status & address (read part) */ bus_space_handle_t mi_swh; /* status & address (write part) */ struct bufq_state *mi_resq; /* While waiting for packets */ + struct workqueue *mi_wq; /* Workqueue for autoconf work */ }; /* mi_flags */ @@ -280,3 +283,4 @@ int mscp_waitstep(struct mscp_softc *, int, int); void mscp_dgo(struct mscp_softc *, struct mscp_xi *); void mscp_intr(struct mscp_softc *); +void mscp_worker(struct work *, void *);