Lines Matching refs:sc

77 altera_sdcard_attach(struct altera_sdcard_softc *sc)
80 ALTERA_SDCARD_LOCK_INIT(sc);
81 ALTERA_SDCARD_CONDVAR_INIT(sc);
82 sc->as_disk = NULL;
83 bioq_init(&sc->as_bioq);
84 sc->as_currentbio = NULL;
85 sc->as_state = ALTERA_SDCARD_STATE_NOCARD;
86 sc->as_taskqueue = taskqueue_create("altera_sdcardc taskq", M_WAITOK,
87 taskqueue_thread_enqueue, &sc->as_taskqueue);
88 taskqueue_start_threads(&sc->as_taskqueue, 1, PI_DISK,
89 "altera_sdcardc%d taskqueue", sc->as_unit);
90 TIMEOUT_TASK_INIT(sc->as_taskqueue, &sc->as_task, 0,
91 altera_sdcard_task, sc);
98 altera_sdcard_task(sc, 1);
102 altera_sdcard_detach(struct altera_sdcard_softc *sc)
105 KASSERT(sc->as_taskqueue != NULL, ("%s: taskqueue not present",
113 ALTERA_SDCARD_LOCK(sc);
114 sc->as_flags |= ALTERA_SDCARD_FLAG_DETACHREQ;
115 while (sc->as_state != ALTERA_SDCARD_STATE_DETACHED)
116 ALTERA_SDCARD_CONDVAR_WAIT(sc);
117 ALTERA_SDCARD_UNLOCK(sc);
124 while (taskqueue_cancel_timeout(sc->as_taskqueue, &sc->as_task, NULL))
125 taskqueue_drain_timeout(sc->as_taskqueue, &sc->as_task);
131 if (sc->as_disk != NULL)
132 altera_sdcard_disk_remove(sc);
133 KASSERT(bioq_first(&sc->as_bioq) == NULL,
139 taskqueue_free(sc->as_taskqueue);
140 sc->as_taskqueue = NULL;
141 ALTERA_SDCARD_CONDVAR_DESTROY(sc);
142 ALTERA_SDCARD_LOCK_DESTROY(sc);
152 altera_sdcard_nextio(struct altera_sdcard_softc *sc)
156 ALTERA_SDCARD_LOCK_ASSERT(sc);
157 KASSERT(sc->as_currentbio == NULL,
160 bp = bioq_takefirst(&sc->as_bioq);
163 altera_sdcard_io_start(sc, bp);
164 sc->as_state = ALTERA_SDCARD_STATE_IO;
168 altera_sdcard_task_nocard(struct altera_sdcard_softc *sc)
171 ALTERA_SDCARD_LOCK_ASSERT(sc);
176 if (sc->as_flags & ALTERA_SDCARD_FLAG_DETACHREQ) {
177 sc->as_state = ALTERA_SDCARD_STATE_DETACHED;
184 if (!(altera_sdcard_read_asr(sc) & ALTERA_SDCARD_ASR_CARDPRESENT))
197 if (altera_sdcard_read_csd(sc) != 0) {
198 sc->as_state = ALTERA_SDCARD_STATE_BADCARD;
205 altera_sdcard_disk_insert(sc);
206 sc->as_state = ALTERA_SDCARD_STATE_IDLE;
210 altera_sdcard_task_badcard(struct altera_sdcard_softc *sc)
213 ALTERA_SDCARD_LOCK_ASSERT(sc);
218 if (sc->as_flags & ALTERA_SDCARD_FLAG_DETACHREQ) {
219 sc->as_state = ALTERA_SDCARD_STATE_DETACHED;
227 if (!(altera_sdcard_read_asr(sc) & ALTERA_SDCARD_ASR_CARDPRESENT))
228 sc->as_state = ALTERA_SDCARD_STATE_NOCARD;
232 altera_sdcard_task_idle(struct altera_sdcard_softc *sc)
235 ALTERA_SDCARD_LOCK_ASSERT(sc);
240 if (sc->as_flags & ALTERA_SDCARD_FLAG_DETACHREQ) {
241 sc->as_state = ALTERA_SDCARD_STATE_DETACHED;
248 if (!(altera_sdcard_read_asr(sc) & ALTERA_SDCARD_ASR_CARDPRESENT)) {
249 altera_sdcard_disk_remove(sc);
250 sc->as_state = ALTERA_SDCARD_STATE_NOCARD;
255 altera_sdcard_task_io(struct altera_sdcard_softc *sc)
259 ALTERA_SDCARD_LOCK_ASSERT(sc);
260 KASSERT(sc->as_currentbio != NULL, ("%s: no current I/O", __func__));
265 asr = altera_sdcard_read_asr(sc);
271 altera_sdcard_disk_remove(sc);
272 if (sc->as_flags & ALTERA_SDCARD_FLAG_DETACHREQ)
273 sc->as_state = ALTERA_SDCARD_STATE_DETACHED;
275 sc->as_state = ALTERA_SDCARD_STATE_NOCARD;
291 if (!altera_sdcard_io_complete(sc, asr))
298 if (sc->as_flags & ALTERA_SDCARD_FLAG_DETACHREQ) {
299 sc->as_state = ALTERA_SDCARD_STATE_DETACHED;
306 if (bioq_first(&sc->as_bioq) != NULL) {
307 altera_sdcard_nextio(sc);
312 sc->as_state = ALTERA_SDCARD_STATE_IDLE;
316 altera_sdcard_task_rechedule(struct altera_sdcard_softc *sc)
324 switch (sc->as_state) {
335 if (sc->as_flags & ALTERA_SDCARD_FLAG_IOERROR)
342 panic("%s: invalid exit state %d", __func__, sc->as_state);
344 taskqueue_enqueue_timeout(sc->as_taskqueue, &sc->as_task, interval);
357 struct altera_sdcard_softc *sc;
359 sc = arg;
360 KASSERT(sc->as_state != ALTERA_SDCARD_STATE_DETACHED,
363 ALTERA_SDCARD_LOCK(sc);
364 switch (sc->as_state) {
366 altera_sdcard_task_nocard(sc);
370 altera_sdcard_task_badcard(sc);
374 altera_sdcard_task_idle(sc);
378 altera_sdcard_task_io(sc);
382 panic("%s: invalid enter state %d", __func__, sc->as_state);
390 if (sc->as_state == ALTERA_SDCARD_STATE_DETACHED)
391 ALTERA_SDCARD_CONDVAR_SIGNAL(sc);
393 altera_sdcard_task_rechedule(sc);
394 ALTERA_SDCARD_UNLOCK(sc);
398 altera_sdcard_start(struct altera_sdcard_softc *sc)
401 ALTERA_SDCARD_LOCK_ASSERT(sc);
403 KASSERT(sc->as_state == ALTERA_SDCARD_STATE_IDLE,
406 taskqueue_cancel_timeout(sc->as_taskqueue, &sc->as_task, NULL);
407 altera_sdcard_nextio(sc);
409 altera_sdcard_task_io(sc);
411 altera_sdcard_task_rechedule(sc);