Lines Matching refs:ring
142 static int blk_check_state_transition(blk_ring_t ring, XenbusState oestate);
143 static int blk_start_connect(blk_ring_t ring);
144 static void blk_start_disconnect(blk_ring_t ring);
145 static void blk_ring_close(blk_ring_t ring);
146 static int blk_bindto_frontend(blk_ring_t ring);
147 static void blk_unbindfrom_frontend(blk_ring_t ring);
150 static int blk_kstat_init(blk_ring_t ring);
151 static void blk_kstat_fini(blk_ring_t ring);
171 blk_ring_t ring;
175 ring = kmem_zalloc(sizeof (struct blk_ring_s), KM_SLEEP);
176 mutex_init(&ring->ri_mutex, NULL, MUTEX_DRIVER, NULL);
177 ring->ri_dip = args->ar_dip;
178 ring->ri_intr = args->ar_intr;
179 ring->ri_intr_arg = args->ar_intr_arg;
180 ring->ri_ringup = args->ar_ringup;
181 ring->ri_ringup_arg = args->ar_ringup_arg;
182 ring->ri_ringdown = args->ar_ringdown;
183 ring->ri_ringdown_arg = args->ar_ringdown_arg;
185 ring->ri_if_status = BLK_IF_UNKNOWN;
186 ring->ri_be_status = BLK_BE_UNKNOWN;
187 ring->ri_fe_status = BLK_FE_UNKNOWN;
188 ring->ri_state.rs_sleeping_on_ring = B_FALSE;
189 ring->ri_state.rs_ring_up = B_FALSE;
191 mutex_init(&ring->ri_state.rs_mutex, NULL, MUTEX_DRIVER, NULL);
192 cv_init(&ring->ri_state.rs_cv, NULL, CV_DRIVER, NULL);
194 e = blk_kstat_init(ring);
200 if (xvdi_add_event_handler(ring->ri_dip, XS_OE_STATE,
201 blk_oe_state_change, ring) != DDI_SUCCESS) {
204 if (xvdi_add_event_handler(ring->ri_dip, XS_HP_STATE,
205 blk_hp_state_change, ring) != DDI_SUCCESS) {
212 if (xvdi_post_event(ring->ri_dip, XEN_HP_ADD) != DDI_SUCCESS) {
214 ddi_get_name_addr(ring->ri_dip));
222 (void) xvdi_switch_state(ring->ri_dip, XBT_NULL, XenbusStateInitWait);
224 *ringp = ring;
228 xvdi_remove_event_handler(ring->ri_dip, XS_HP_STATE);
230 xvdi_remove_event_handler(ring->ri_dip, XS_OE_STATE);
232 blk_kstat_fini(ring);
234 cv_destroy(&ring->ri_state.rs_cv);
235 mutex_destroy(&ring->ri_state.rs_mutex);
236 mutex_destroy(&ring->ri_mutex);
237 kmem_free(ring, sizeof (struct blk_ring_s));
248 blk_ring_t ring;
251 ring = *ringp;
253 mutex_enter(&ring->ri_mutex);
254 if (ring->ri_if_status != BLK_IF_DISCONNECTED) {
255 blk_ring_close(ring);
257 mutex_exit(&ring->ri_mutex);
259 xvdi_remove_event_handler(ring->ri_dip, NULL);
260 blk_kstat_fini(ring);
261 cv_destroy(&ring->ri_state.rs_cv);
262 mutex_destroy(&ring->ri_state.rs_mutex);
263 mutex_destroy(&ring->ri_mutex);
264 kmem_free(ring, sizeof (struct blk_ring_s));
274 blk_kstat_init(blk_ring_t ring)
280 ring->ri_kstats = kstat_create(ddi_get_name(ring->ri_dip),
281 ddi_get_instance(ring->ri_dip), "req_statistics", "block",
283 if (ring->ri_kstats == NULL) {
287 ring->ri_kstats->ks_private = ring;
288 ring->ri_kstats->ks_update = blk_kstat_update;
290 knp = ring->ri_kstats->ks_data;
298 kstat_install(ring->ri_kstats);
308 blk_kstat_fini(blk_ring_t ring)
310 kstat_delete(ring->ri_kstats);
322 blk_ring_t ring;
329 ring = ksp->ks_private;
330 stats = &ring->ri_stats;
356 blk_ring_t ring;
359 ring = (blk_ring_t)arg;
362 mutex_enter(&ring->ri_mutex);
364 if (blk_check_state_transition(ring, new_state) == DDI_FAILURE) {
365 mutex_exit(&ring->ri_mutex);
371 ASSERT(ring->ri_if_status == BLK_IF_UNKNOWN);
374 ring->ri_fe_status = BLK_FE_READY;
376 if (ring->ri_be_status == BLK_BE_READY) {
377 mutex_exit(&ring->ri_mutex);
378 if (blk_start_connect(ring) != DDI_SUCCESS)
379 (void) blk_start_disconnect(ring);
380 mutex_enter(&ring->ri_mutex);
388 (void) xvdi_post_event(ring->ri_dip, XEN_HP_REMOVE);
389 if (ring->ri_ringdown != NULL) {
390 (*(ring->ri_ringdown))(ring->ri_ringdown_arg);
392 blk_ring_close(ring);
395 ring->ri_if_status = BLK_IF_UNKNOWN;
396 ring->ri_be_status = BLK_BE_UNKNOWN;
397 ring->ri_fe_status = BLK_FE_UNKNOWN;
398 ring->ri_state.rs_sleeping_on_ring = B_FALSE;
399 ring->ri_state.rs_ring_up = B_FALSE;
406 mutex_exit(&ring->ri_mutex);
419 blk_ring_t ring;
422 ring = (blk_ring_t)arg;
425 mutex_enter(&ring->ri_mutex);
428 if (ring->ri_be_status == BLK_BE_UNKNOWN) {
429 ring->ri_be_status = BLK_BE_READY;
430 if (ring->ri_fe_status == BLK_FE_READY) {
431 mutex_exit(&ring->ri_mutex);
433 if (blk_start_connect(ring) != DDI_SUCCESS)
434 (void) blk_start_disconnect(ring);
435 mutex_enter(&ring->ri_mutex);
439 mutex_exit(&ring->ri_mutex);
450 blk_check_state_transition(blk_ring_t ring, XenbusState oestate)
452 switch (ring->ri_if_status) {
454 if (ring->ri_fe_status == BLK_FE_UNKNOWN) {
492 ddi_get_name_addr(ring->ri_dip), oestate,
493 ring->ri_if_status);
508 blk_start_connect(blk_ring_t ring)
518 dip = ring->ri_dip;
525 ASSERT(ring->ri_fe_status == BLK_FE_READY);
526 ASSERT(ring->ri_be_status == BLK_BE_READY);
533 ring->ri_fe = xvdi_get_oeid(dip);
534 if (ring->ri_fe == (domid_t)-1) {
543 e = blk_bindto_frontend(ring);
547 ring->ri_if_status = BLK_IF_CONNECTED;
549 e = ddi_add_intr(dip, 0, NULL, NULL, blk_intr, (caddr_t)ring);
563 ddi_get_instance(ring->ri_dip));
605 mutex_enter(&ring->ri_state.rs_mutex);
606 ring->ri_state.rs_ring_up = B_TRUE;
607 if (ring->ri_state.rs_sleeping_on_ring) {
608 ring->ri_state.rs_sleeping_on_ring = B_FALSE;
609 cv_signal(&ring->ri_state.rs_cv);
611 mutex_exit(&ring->ri_state.rs_mutex);
613 if (ring->ri_ringup != NULL) {
614 (*(ring->ri_ringup))(ring->ri_ringup_arg);
626 blk_unbindfrom_frontend(ring);
627 ring->ri_fe = (domid_t)-1;
642 blk_start_disconnect(blk_ring_t ring)
645 (void) xvdi_switch_state(ring->ri_dip, XBT_NULL, XenbusStateClosing);
656 blk_ring_close(blk_ring_t ring)
662 ASSERT(MUTEX_HELD(&ring->ri_mutex));
664 dip = ring->ri_dip;
666 if (ring->ri_if_status != BLK_IF_CONNECTED) {
670 ring->ri_if_status = BLK_IF_DISCONNECTED;
671 mutex_exit(&ring->ri_mutex);
676 blk_unbindfrom_frontend(ring);
677 ring->ri_fe = (domid_t)-1;
679 mutex_enter(&ring->ri_mutex);
687 blk_bindto_frontend(blk_ring_t ring)
697 dip = ring->ri_dip;
708 e = xenbus_gather(XBT_NULL, oename, "ring-ref", "%lu", &gref,
712 "Getting ring-ref and evtchn from frontend");
721 ring->ri_protocol = BLKIF_PROTOCOL_NATIVE;
722 ring->ri_nentry = BLKIF_RING_SIZE;
723 ring->ri_entrysize = sizeof (union blkif_sring_entry);
725 ring->ri_protocol = BLKIF_PROTOCOL_X86_32;
726 ring->ri_nentry = BLKIF_X86_32_RING_SIZE;
727 ring->ri_entrysize = sizeof (union blkif_x86_32_sring_entry);
729 ring->ri_protocol = BLKIF_PROTOCOL_X86_64;
730 ring->ri_nentry = BLKIF_X86_64_RING_SIZE;
731 ring->ri_entrysize = sizeof (union blkif_x86_64_sring_entry);
738 * map and init ring
740 e = xvdi_map_ring(dip, ring->ri_nentry, ring->ri_entrysize, gref,
741 &ring->ri_ring);
751 xvdi_unmap_ring(ring->ri_ring);
764 blk_unbindfrom_frontend(blk_ring_t ring)
766 xvdi_free_evtchn(ring->ri_dip);
767 xvdi_unmap_ring(ring->ri_ring);
777 blk_ring_t ring;
779 ring = (blk_ring_t)arg;
780 if (ring->ri_if_status != BLK_IF_CONNECTED) {
784 (void) (*ring->ri_intr)(ring->ri_intr_arg);
793 blk_ring_request_get(blk_ring_t ring, blkif_request_t *req)
799 mutex_enter(&ring->ri_mutex);
801 if (ring->ri_if_status != BLK_IF_CONNECTED) {
802 mutex_exit(&ring->ri_mutex);
806 src = xvdi_ring_get_request(ring->ri_ring);
808 mutex_exit(&ring->ri_mutex);
812 switch (ring->ri_protocol) {
824 ddi_get_name_addr(ring->ri_dip),
825 ring->ri_protocol);
827 mutex_exit(&ring->ri_mutex);
829 stats = &ring->ri_stats;
855 blk_ring_request_requeue(blk_ring_t ring)
857 mutex_enter(&ring->ri_mutex);
859 if (ring->ri_if_status != BLK_IF_CONNECTED) {
860 mutex_exit(&ring->ri_mutex);
864 ring->ri_ring->xr_sring.br.req_cons--;
866 mutex_exit(&ring->ri_mutex);
874 blk_ring_response_put(blk_ring_t ring, blkif_response_t *src)
880 mutex_enter(&ring->ri_mutex);
882 if (ring->ri_if_status != BLK_IF_CONNECTED) {
883 mutex_exit(&ring->ri_mutex);
887 rsp = xvdi_ring_get_response(ring->ri_ring);
890 switch (ring->ri_protocol) {
902 ddi_get_name_addr(ring->ri_dip),
903 ring->ri_protocol);
906 e = xvdi_ring_push_response(ring->ri_ring);
908 xvdi_notify_oe(ring->ri_dip);
911 mutex_exit(&ring->ri_mutex);