Lines Matching refs:skdev
102 static int skd_format_internal_skspcl(struct skd_device *skdev);
104 static void skd_destroy_mutex(skd_device_t *skdev);
106 static void skd_request_fn_not_online(skd_device_t *skdev);
111 static void skd_release_intr(skd_device_t *skdev);
112 static void skd_isr_fwstate(struct skd_device *skdev);
113 static void skd_isr_msg_from_dev(struct skd_device *skdev);
114 static void skd_soft_reset(struct skd_device *skdev);
115 static void skd_refresh_device_data(struct skd_device *skdev);
119 static char *skd_pci_info(struct skd_device *skdev, char *str, size_t len);
303 skd_reg_write64(struct skd_device *skdev, uint64_t val, uint32_t offset) in skd_reg_write64() argument
309 addr = (uint64_t *)(skdev->dev_iobase + offset); in skd_reg_write64()
310 ddi_put64(skdev->dev_handle, addr, val); in skd_reg_write64()
324 skd_reg_read32(struct skd_device *skdev, uint32_t offset) in skd_reg_read32() argument
330 addr = (uint32_t *)(skdev->dev_iobase + offset); in skd_reg_read32()
331 return (ddi_get32(skdev->dev_handle, addr)); in skd_reg_read32()
346 skd_reg_write32(struct skd_device *skdev, uint32_t val, uint32_t offset) in skd_reg_write32() argument
352 addr = (uint32_t *)(skdev->dev_iobase + offset); in skd_reg_write32()
353 ddi_put32(skdev->dev_handle, addr, val); in skd_reg_write32()
371 skd_name(struct skd_device *skdev) in skd_name() argument
373 (void) snprintf(skdev->id_str, sizeof (skdev->id_str), "%s:", DRV_NAME); in skd_name()
375 return (skdev->id_str); in skd_name()
391 skd_pci_find_capability(struct skd_device *skdev, int cap) in skd_pci_find_capability() argument
397 status = pci_config_get16(skdev->pci_handle, PCI_CONF_STAT); in skd_pci_find_capability()
402 hdr = pci_config_get8(skdev->pci_handle, PCI_CONF_HEADER); in skd_pci_find_capability()
407 pos = pci_config_get8(skdev->pci_handle, PCI_CONF_CAP_PTR); in skd_pci_find_capability()
411 id = pci_config_get8(skdev->pci_handle, pos+PCI_CAP_ID); in skd_pci_find_capability()
416 pos = pci_config_get8(skdev->pci_handle, pos+PCI_CAP_NEXT_PTR); in skd_pci_find_capability()
435 skd_io_done(skd_device_t *skdev, skd_buf_private_t *pbuf, in skd_io_done() argument
446 skdev->iodone_wioc++; in skd_io_done()
449 skdev->iodone_wnioc++; in skd_io_done()
452 skdev->iodone_wdebug++; in skd_io_done()
455 skdev->iodone_unknown++; in skd_io_done()
459 skdev->ios_errors++; in skd_io_done()
461 "!%s:skd_io_done:ERR=%d %lld-%ld %s", skdev->name, in skd_io_done()
487 skd_device_t *skdev; in skd_sys_quiesce_dev() local
489 skdev = ddi_get_soft_state(skd_state, ddi_get_instance(dip)); in skd_sys_quiesce_dev()
494 skd_disable_interrupts(skdev); in skd_sys_quiesce_dev()
495 skd_soft_reset(skdev); in skd_sys_quiesce_dev()
511 skd_quiesce_dev(skd_device_t *skdev) in skd_quiesce_dev() argument
518 switch (skdev->state) { in skd_quiesce_dev()
521 Dcmn_err(CE_NOTE, "%s: stopping queue", skdev->name); in skd_quiesce_dev()
533 cmn_err(CE_NOTE, "state [%d] not implemented", skdev->state); in skd_quiesce_dev()
554 skd_unquiesce_dev(struct skd_device *skdev) in skd_unquiesce_dev() argument
558 skd_log_skdev(skdev, "unquiesce"); in skd_unquiesce_dev()
559 if (skdev->state == SKD_DRVR_STATE_ONLINE) { in skd_unquiesce_dev()
564 if (skdev->drive_state != FIT_SR_DRIVE_ONLINE) { in skd_unquiesce_dev()
573 skdev->state = SKD_DRVR_STATE_BUSY; in skd_unquiesce_dev()
582 switch (skdev->state) { in skd_unquiesce_dev()
592 skdev->state = SKD_DRVR_STATE_ONLINE; in skd_unquiesce_dev()
593 Dcmn_err(CE_NOTE, "%s: sTec s1120 ONLINE", skdev->name); in skd_unquiesce_dev()
594 Dcmn_err(CE_NOTE, "%s: Starting request queue", skdev->name); in skd_unquiesce_dev()
597 skdev->name, in skd_unquiesce_dev()
598 skdev->queue_depth_limit, in skd_unquiesce_dev()
599 skdev->hard_queue_depth_limit, in skd_unquiesce_dev()
600 skdev->soft_queue_depth_limit, in skd_unquiesce_dev()
601 skdev->queue_depth_lowat); in skd_unquiesce_dev()
603 skdev->gendisk_on = 1; in skd_unquiesce_dev()
604 cv_signal(&skdev->cv_waitq); in skd_unquiesce_dev()
609 skdev->state); in skd_unquiesce_dev()
634 skd_blkdev_preop_sg_list(struct skd_device *skdev, in skd_blkdev_preop_sg_list() argument
653 ASSERT(n_sg <= skdev->sgs_per_request); in skd_blkdev_preop_sg_list()
700 skd_blkdev_postop_sg_list(struct skd_device *skdev, in skd_blkdev_postop_sg_list() argument
725 skd_start(skd_device_t *skdev) in skd_start() argument
730 struct waitqueue *waitq = &skdev->waitqueue; in skd_start()
750 if (skdev->queue_depth_busy >= skdev->queue_depth_limit) { in skd_start()
752 skdev->queue_depth_busy, in skd_start()
753 skdev->queue_depth_limit); in skd_start()
757 WAITQ_LOCK(skdev); in skd_start()
759 WAITQ_UNLOCK(skdev); in skd_start()
764 skreq = skdev->skreq_free_list; in skd_start()
766 WAITQ_UNLOCK(skdev); in skd_start()
773 skdev->skreq_free_list = skreq->next; in skd_start()
781 skmsg = skdev->skmsg_free_list; in skd_start()
783 WAITQ_UNLOCK(skdev); in skd_start()
790 skdev->skmsg_free_list = skmsg->next; in skd_start()
808 pbuf = skd_get_queued_pbuf(skdev); in skd_start()
809 WAITQ_UNLOCK(skdev); in skd_start()
850 skd_blkdev_preop_sg_list(skdev, skreq, &sg_byte_count); in skd_start()
869 skreq->timeout_stamp = skdev->timeout_stamp; in skd_start()
872 atomic_inc_32(&skdev->timeout_slot[timo_slot]); in skd_start()
873 atomic_inc_32(&skdev->queue_depth_busy); in skd_start()
876 skreq->id, skdev->queue_depth_busy, timo_slot); in skd_start()
883 atomic_inc_64(&skdev->active_cmds); in skd_start()
886 skdev->fitmsg_sent1++; in skd_start()
887 skd_send_fitmsg(skdev, skmsg); in skd_start()
905 skdev->active_cmds++; in skd_start()
907 skdev->fitmsg_sent2++; in skd_start()
908 skd_send_fitmsg(skdev, skmsg); in skd_start()
924 skd_end_request(struct skd_device *skdev, in skd_end_request() argument
927 skdev->ios_completed++; in skd_end_request()
928 skd_io_done(skdev, skreq->pbuf, error, SKD_IODONE_WIOC); in skd_end_request()
946 skd_end_request_abnormal(skd_device_t *skdev, skd_buf_private_t *pbuf, in skd_end_request_abnormal() argument
949 skd_io_done(skdev, pbuf, error, mode); in skd_end_request_abnormal()
963 skd_request_fn_not_online(skd_device_t *skdev) in skd_request_fn_not_online() argument
968 ASSERT(skdev->state != SKD_DRVR_STATE_ONLINE); in skd_request_fn_not_online()
970 skd_log_skdev(skdev, "req_not_online"); in skd_request_fn_not_online()
972 switch (skdev->state) { in skd_request_fn_not_online()
1006 ASSERT(WAITQ_LOCK_HELD(skdev)); in skd_request_fn_not_online()
1007 if (SIMPLEQ_EMPTY(&skdev->waitqueue)) in skd_request_fn_not_online()
1010 while ((pbuf = skd_get_queued_pbuf(skdev))) in skd_request_fn_not_online()
1011 skd_end_request_abnormal(skdev, pbuf, error, SKD_IODONE_WNIOC); in skd_request_fn_not_online()
1013 cv_signal(&skdev->cv_waitq); in skd_request_fn_not_online()
1020 static void skd_timer_tick_not_online(struct skd_device *skdev);
1032 skd_timer_tick(skd_device_t *skdev) in skd_timer_tick() argument
1036 skdev->timer_active = 1; in skd_timer_tick()
1038 if (skdev->state != SKD_DRVR_STATE_ONLINE) { in skd_timer_tick()
1039 skd_timer_tick_not_online(skdev); in skd_timer_tick()
1043 skdev->timeout_stamp++; in skd_timer_tick()
1044 timo_slot = skdev->timeout_stamp & SKD_TIMEOUT_SLOT_MASK; in skd_timer_tick()
1051 if (skdev->timeout_slot[timo_slot] == 0) { in skd_timer_tick()
1057 skdev->timeout_slot[timo_slot], in skd_timer_tick()
1058 skdev->queue_depth_busy); in skd_timer_tick()
1059 skdev->timer_countdown = SKD_TIMER_SECONDS(3); in skd_timer_tick()
1060 skdev->state = SKD_DRVR_STATE_DRAINING_TIMEOUT; in skd_timer_tick()
1061 skdev->timo_slot = timo_slot; in skd_timer_tick()
1064 skdev->timer_active = 0; in skd_timer_tick()
1078 skd_timer_tick_not_online(struct skd_device *skdev) in skd_timer_tick_not_online() argument
1081 skdev->state, skdev->timer_countdown); in skd_timer_tick_not_online()
1083 ASSERT(skdev->state != SKD_DRVR_STATE_ONLINE); in skd_timer_tick_not_online()
1085 switch (skdev->state) { in skd_timer_tick_not_online()
1091 skdev->drive_state, skdev->state); in skd_timer_tick_not_online()
1098 skdev->state, skdev->timer_countdown); in skd_timer_tick_not_online()
1099 if (skdev->timer_countdown > 0) { in skd_timer_tick_not_online()
1100 skdev->timer_countdown--; in skd_timer_tick_not_online()
1104 skdev->state, skdev->timer_countdown); in skd_timer_tick_not_online()
1105 skd_restart_device(skdev); in skd_timer_tick_not_online()
1110 if (skdev->timer_countdown > 0) { in skd_timer_tick_not_online()
1111 skdev->timer_countdown--; in skd_timer_tick_not_online()
1118 skdev->state = SKD_DRVR_STATE_FAULT; in skd_timer_tick_not_online()
1121 skd_name(skdev), skdev->drive_state); in skd_timer_tick_not_online()
1124 skd_start(skdev); in skd_timer_tick_not_online()
1127 skdev->gendisk_on = -1; in skd_timer_tick_not_online()
1129 cv_signal(&skdev->cv_waitq); in skd_timer_tick_not_online()
1140 skdev->name, in skd_timer_tick_not_online()
1141 skdev->timo_slot, in skd_timer_tick_not_online()
1142 skdev->timer_countdown, in skd_timer_tick_not_online()
1143 skdev->queue_depth_busy, in skd_timer_tick_not_online()
1144 skdev->timeout_slot[skdev->timo_slot]); in skd_timer_tick_not_online()
1146 if (skdev->timeout_slot[skdev->timo_slot] == 0) { in skd_timer_tick_not_online()
1148 skdev->state = SKD_DRVR_STATE_ONLINE; in skd_timer_tick_not_online()
1149 skd_start(skdev); in skd_timer_tick_not_online()
1152 if (skdev->timer_countdown > 0) { in skd_timer_tick_not_online()
1153 skdev->timer_countdown--; in skd_timer_tick_not_online()
1156 skd_restart_device(skdev); in skd_timer_tick_not_online()
1160 if (skdev->timer_countdown > 0) { in skd_timer_tick_not_online()
1161 skdev->timer_countdown--; in skd_timer_tick_not_online()
1169 skdev->state = SKD_DRVR_STATE_FAULT; in skd_timer_tick_not_online()
1171 skd_name(skdev), skdev->drive_state); in skd_timer_tick_not_online()
1183 if ((skdev->drive_state == FIT_SR_DRIVE_SOFT_RESET) || in skd_timer_tick_not_online()
1184 (skdev->drive_state == FIT_SR_DRIVE_FAULT) || in skd_timer_tick_not_online()
1185 (skdev->drive_state == FIT_SR_DRIVE_STATE_MASK)) { in skd_timer_tick_not_online()
1194 ASSERT(!WAITQ_LOCK_HELD(skdev)); in skd_timer_tick_not_online()
1195 INTR_LOCK(skdev); in skd_timer_tick_not_online()
1196 skd_recover_requests(skdev); in skd_timer_tick_not_online()
1197 INTR_UNLOCK(skdev); in skd_timer_tick_not_online()
1200 skd_start(skdev); in skd_timer_tick_not_online()
1202 skdev->gendisk_on = -1; in skd_timer_tick_not_online()
1203 cv_signal(&skdev->cv_waitq); in skd_timer_tick_not_online()
1228 skd_device_t *skdev = (skd_device_t *)arg; in skd_timer() local
1231 ADAPTER_STATE_LOCK(skdev); in skd_timer()
1232 if (skdev->skd_timer_timeout_id != 0) { in skd_timer()
1233 ADAPTER_STATE_UNLOCK(skdev); in skd_timer()
1235 skd_timer_tick(skdev); in skd_timer()
1236 ADAPTER_STATE_LOCK(skdev); in skd_timer()
1238 if (skdev->skd_timer_timeout_id != 0) { in skd_timer()
1239 skdev->skd_timer_timeout_id = in skd_timer()
1243 ADAPTER_STATE_UNLOCK(skdev); in skd_timer()
1256 skd_start_timer(struct skd_device *skdev) in skd_start_timer() argument
1259 ADAPTER_STATE_LOCK(skdev); in skd_start_timer()
1260 ASSERT(skdev->skd_timer_timeout_id == 0); in skd_start_timer()
1266 skdev->skd_timer_timeout_id = timeout(skd_timer, skdev, 1); in skd_start_timer()
1267 ADAPTER_STATE_UNLOCK(skdev); in skd_start_timer()
1285 skd_format_internal_skspcl(struct skd_device *skdev) in skd_format_internal_skspcl() argument
1287 struct skd_special_context *skspcl = &skdev->internal_skspcl; in skd_format_internal_skspcl()
1324 skd_send_internal_skspcl(struct skd_device *skdev, in skd_send_internal_skspcl() argument
1436 skd_send_special_fitmsg(skdev, skspcl); in skd_send_internal_skspcl()
1449 skd_refresh_device_data(struct skd_device *skdev) in skd_refresh_device_data() argument
1451 struct skd_special_context *skspcl = &skdev->internal_skspcl; in skd_refresh_device_data()
1453 Dcmn_err(CE_NOTE, "refresh_device_data: state=%d", skdev->state); in skd_refresh_device_data()
1455 skd_send_internal_skspcl(skdev, skspcl, TEST_UNIT_READY); in skd_refresh_device_data()
1473 skd_complete_internal(struct skd_device *skdev, in skd_complete_internal() argument
1484 ASSERT(skspcl == &skdev->internal_skspcl); in skd_complete_internal()
1504 skd_send_internal_skspcl(skdev, skspcl, in skd_complete_internal()
1507 if (skdev->state == SKD_DRVR_STATE_STOPPING) { in skd_complete_internal()
1510 "state 0x%x", skdev->name, skdev->state); in skd_complete_internal()
1516 skdev->name); in skd_complete_internal()
1517 skd_send_internal_skspcl(skdev, skspcl, 0x00); in skd_complete_internal()
1524 skdev->read_cap_is_valid = 0; in skd_complete_internal()
1528 skdev->read_cap_last_lba = cap; in skd_complete_internal()
1529 skdev->read_cap_blocksize = in skd_complete_internal()
1533 cap *= skdev->read_cap_blocksize; in skd_complete_internal()
1536 skdev->read_cap_last_lba, in skd_complete_internal()
1537 skdev->read_cap_last_lba, in skd_complete_internal()
1538 skdev->read_cap_blocksize, in skd_complete_internal()
1541 Nblocks = skdev->read_cap_last_lba + 1; in skd_complete_internal()
1543 skdev->Nblocks = Nblocks; in skd_complete_internal()
1544 skdev->read_cap_is_valid = 1; in skd_complete_internal()
1546 skd_send_internal_skspcl(skdev, skspcl, INQUIRY2); in skd_complete_internal()
1550 skd_send_internal_skspcl(skdev, skspcl, in skd_complete_internal()
1556 skdev->inquiry_is_valid = 0; in skd_complete_internal()
1558 skdev->inquiry_is_valid = 1; in skd_complete_internal()
1561 bcopy(&buf[4], skdev->inq_serial_num, 12); in skd_complete_internal()
1562 skdev->inq_serial_num[12] = '\0'; in skd_complete_internal()
1564 char *tmp = skdev->inq_vendor_id; in skd_complete_internal()
1569 tmp = skdev->inq_product_id; in skd_complete_internal()
1573 tmp = skdev->inq_product_rev; in skd_complete_internal()
1579 if (skdev->state != SKD_DRVR_STATE_ONLINE) in skd_complete_internal()
1580 if (skd_unquiesce_dev(skdev) < 0) in skd_complete_internal()
1584 skdev->sync_done = (SAM_STAT_GOOD == status) ? 1 : -1; in skd_complete_internal()
1586 cv_signal(&skdev->cv_waitq); in skd_complete_internal()
1610 skd_send_fitmsg(struct skd_device *skdev, in skd_send_fitmsg() argument
1618 skdev->queue_depth_busy); in skd_send_fitmsg()
1629 if (skdev->dbg_level > 1) { in skd_send_fitmsg()
1655 skdev->ios_started++; in skd_send_fitmsg()
1657 SKD_WRITEQ(skdev, qcmd, FIT_Q_COMMAND); in skd_send_fitmsg()
1672 skd_send_special_fitmsg(struct skd_device *skdev, in skd_send_special_fitmsg() argument
1679 if (skdev->dbg_level > 1) { in skd_send_special_fitmsg()
1716 SKD_WRITEQ(skdev, qcmd, FIT_Q_COMMAND); in skd_send_special_fitmsg()
1723 static void skd_complete_other(struct skd_device *skdev,
1781 skd_check_status(struct skd_device *skdev, uint8_t cmp_status, in skd_check_status() argument
1793 skd_name(skdev), skerr->key, skerr->code, skerr->qual); in skd_check_status()
1821 skd_name(skdev), skerr->key, in skd_check_status()
1838 skdev->name, in skd_check_status()
1839 skdev->queue_depth_busy, in skd_check_status()
1840 (void *)skdev->skmsg_free_list, skd_list_skmsg(skdev, 0), in skd_check_status()
1841 (void *)skdev->skreq_free_list, skd_list_skreq(skdev, 0)); in skd_check_status()
1844 skdev->name, skerr->type, cmp_status, skerr->key, in skd_check_status()
1865 skd_isr_completion_posted(struct skd_device *skdev) in skd_isr_completion_posted() argument
1881 (void) ddi_dma_sync(skdev->cq_dma_address.dma_handle, 0, 0, in skd_isr_completion_posted()
1885 ASSERT(skdev->skcomp_ix < SKD_N_COMPLETION_ENTRY); in skd_isr_completion_posted()
1887 WAITQ_LOCK(skdev); in skd_isr_completion_posted()
1889 skcmp = &skdev->skcomp_table[skdev->skcomp_ix]; in skd_isr_completion_posted()
1895 skerr = &skdev->skerr_table[skdev->skcomp_ix]; in skd_isr_completion_posted()
1900 skdev->skcomp_cycle, skdev->skcomp_ix, in skd_isr_completion_posted()
1902 skdev->queue_depth_busy, cmp_bytes, skdev->proto_ver); in skd_isr_completion_posted()
1904 if (cmp_cycle != skdev->skcomp_cycle) { in skd_isr_completion_posted()
1905 Dcmn_err(CE_NOTE, "%s:end of completions", skdev->name); in skd_isr_completion_posted()
1907 WAITQ_UNLOCK(skdev); in skd_isr_completion_posted()
1912 skdev->n_req++; in skd_isr_completion_posted()
1918 skdev->skcomp_ix++; in skd_isr_completion_posted()
1919 if (skdev->skcomp_ix >= SKD_N_COMPLETION_ENTRY) { in skd_isr_completion_posted()
1920 skdev->skcomp_ix = 0; in skd_isr_completion_posted()
1921 skdev->skcomp_cycle++; /* 8-bit wrap-around */ in skd_isr_completion_posted()
1938 if (req_slot >= skdev->num_req_context) { in skd_isr_completion_posted()
1942 skd_complete_other(skdev, skcmp, skerr); in skd_isr_completion_posted()
1943 WAITQ_UNLOCK(skdev); in skd_isr_completion_posted()
1947 skreq = &skdev->skreq_table[req_slot]; in skd_isr_completion_posted()
1962 ASSERT(msg_slot < skdev->num_fitmsg_context); in skd_isr_completion_posted()
1963 skmsg = &skdev->skmsg_table[msg_slot]; in skd_isr_completion_posted()
1972 skmsg->next = skdev->skmsg_free_list; in skd_isr_completion_posted()
1973 skdev->skmsg_free_list = skmsg; in skd_isr_completion_posted()
1981 skreq->next = skdev->skreq_free_list; in skd_isr_completion_posted()
1982 skdev->skreq_free_list = skreq; in skd_isr_completion_posted()
1983 WAITQ_UNLOCK(skdev); in skd_isr_completion_posted()
1994 if (cmp_status && skdev->disks_initialized) { in skd_isr_completion_posted()
1997 skdev->name, (void *)pbuf, pbuf->x_xfer->x_blkno, in skd_isr_completion_posted()
2001 ASSERT(skdev->active_cmds); in skd_isr_completion_posted()
2002 atomic_dec_64(&skdev->active_cmds); in skd_isr_completion_posted()
2007 skd_blkdev_postop_sg_list(skdev, skreq); in skd_isr_completion_posted()
2008 WAITQ_UNLOCK(skdev); in skd_isr_completion_posted()
2009 skd_end_request(skdev, skreq, 0); in skd_isr_completion_posted()
2010 WAITQ_LOCK(skdev); in skd_isr_completion_posted()
2012 switch (skd_check_status(skdev, cmp_status, skerr)) { in skd_isr_completion_posted()
2015 WAITQ_UNLOCK(skdev); in skd_isr_completion_posted()
2016 skd_end_request(skdev, skreq, 0); in skd_isr_completion_posted()
2017 WAITQ_LOCK(skdev); in skd_isr_completion_posted()
2021 skd_log_skreq(skdev, skreq, "retry(busy)"); in skd_isr_completion_posted()
2022 skd_queue(skdev, pbuf); in skd_isr_completion_posted()
2023 skdev->state = SKD_DRVR_STATE_BUSY_IMMINENT; in skd_isr_completion_posted()
2024 skdev->timer_countdown = SKD_TIMER_MINUTES(20); in skd_isr_completion_posted()
2026 (void) skd_quiesce_dev(skdev); in skd_isr_completion_posted()
2040 WAITQ_UNLOCK(skdev); in skd_isr_completion_posted()
2041 skd_end_request(skdev, skreq, -EIO); in skd_isr_completion_posted()
2042 WAITQ_LOCK(skdev); in skd_isr_completion_posted()
2066 ASSERT(msg_slot < skdev->num_fitmsg_context); in skd_isr_completion_posted()
2067 skmsg = &skdev->skmsg_table[msg_slot]; in skd_isr_completion_posted()
2072 skmsg->next = skdev->skmsg_free_list; in skd_isr_completion_posted()
2073 skdev->skmsg_free_list = skmsg; in skd_isr_completion_posted()
2082 ASSERT(skdev->timeout_slot[timo_slot] > 0); in skd_isr_completion_posted()
2083 ASSERT(skdev->queue_depth_busy > 0); in skd_isr_completion_posted()
2085 atomic_dec_32(&skdev->timeout_slot[timo_slot]); in skd_isr_completion_posted()
2086 atomic_dec_32(&skdev->queue_depth_busy); in skd_isr_completion_posted()
2093 skreq->next = skdev->skreq_free_list; in skd_isr_completion_posted()
2094 skdev->skreq_free_list = skreq; in skd_isr_completion_posted()
2096 WAITQ_UNLOCK(skdev); in skd_isr_completion_posted()
2101 if ((skdev->state == SKD_DRVR_STATE_PAUSING) && in skd_isr_completion_posted()
2102 (0 == skdev->queue_depth_busy)) { in skd_isr_completion_posted()
2103 skdev->state = SKD_DRVR_STATE_PAUSED; in skd_isr_completion_posted()
2104 cv_signal(&skdev->cv_waitq); in skd_isr_completion_posted()
2122 skd_complete_other(struct skd_device *skdev, in skd_complete_other() argument
2146 skspcl = &skdev->internal_skspcl; in skd_complete_other()
2151 skd_complete_internal(skdev, skcomp, skerr, skspcl); in skd_complete_other()
2165 skd_reset_skcomp(struct skd_device *skdev) in skd_reset_skcomp() argument
2173 if (skdev->skcomp_table) in skd_reset_skcomp()
2174 bzero(skdev->skcomp_table, nbytes); in skd_reset_skcomp()
2176 skdev->skcomp_ix = 0; in skd_reset_skcomp()
2177 skdev->skcomp_cycle = 1; in skd_reset_skcomp()
2204 struct skd_device *skdev; in skd_isr_aif() local
2206 skdev = (skd_device_t *)(uintptr_t)arg; in skd_isr_aif()
2208 ASSERT(skdev != NULL); in skd_isr_aif()
2210 skdev->intr_cntr++; in skd_isr_aif()
2212 Dcmn_err(CE_NOTE, "skd_isr_aif: intr=%" PRId64 "\n", skdev->intr_cntr); in skd_isr_aif()
2216 ASSERT(!WAITQ_LOCK_HELD(skdev)); in skd_isr_aif()
2217 INTR_LOCK(skdev); in skd_isr_aif()
2219 intstat = SKD_READL(skdev, FIT_INT_STATUS_HOST); in skd_isr_aif()
2237 skdev->state == SKD_DRVR_STATE_ONLINE) { in skd_isr_aif()
2240 skd_isr_completion_posted(skdev); in skd_isr_aif()
2242 INTR_UNLOCK(skdev); in skd_isr_aif()
2248 SKD_WRITEL(skdev, ack, FIT_INT_STATUS_HOST); in skd_isr_aif()
2250 if ((skdev->state != SKD_DRVR_STATE_LOAD) && in skd_isr_aif()
2251 (skdev->state != SKD_DRVR_STATE_STOPPING)) { in skd_isr_aif()
2255 skd_isr_completion_posted(skdev); in skd_isr_aif()
2261 skd_isr_fwstate(skdev); in skd_isr_aif()
2262 if (skdev->state == SKD_DRVR_STATE_FAULT || in skd_isr_aif()
2263 skdev->state == in skd_isr_aif()
2265 INTR_UNLOCK(skdev); in skd_isr_aif()
2273 skd_isr_msg_from_dev(skdev); in skd_isr_aif()
2277 INTR_UNLOCK(skdev); in skd_isr_aif()
2280 if (!SIMPLEQ_EMPTY(&skdev->waitqueue)) in skd_isr_aif()
2281 skd_start(skdev); in skd_isr_aif()
2296 skd_drive_fault(struct skd_device *skdev) in skd_drive_fault() argument
2298 skdev->state = SKD_DRVR_STATE_FAULT; in skd_drive_fault()
2300 skd_name(skdev)); in skd_drive_fault()
2313 skd_drive_disappeared(struct skd_device *skdev) in skd_drive_disappeared() argument
2315 skdev->state = SKD_DRVR_STATE_DISAPPEARED; in skd_drive_disappeared()
2317 skd_name(skdev)); in skd_drive_disappeared()
2330 skd_isr_fwstate(struct skd_device *skdev) in skd_isr_fwstate() argument
2337 prev_driver_state = skdev->state; in skd_isr_fwstate()
2339 sense = SKD_READL(skdev, FIT_STATUS); in skd_isr_fwstate()
2343 skd_drive_state_to_str(skdev->drive_state), skdev->drive_state, in skd_isr_fwstate()
2346 skdev->drive_state = state; in skd_isr_fwstate()
2348 switch (skdev->drive_state) { in skd_isr_fwstate()
2350 if (skdev->state == SKD_DRVR_STATE_PROTOCOL_MISMATCH) { in skd_isr_fwstate()
2351 skd_disable_interrupts(skdev); in skd_isr_fwstate()
2354 if (skdev->state == SKD_DRVR_STATE_RESTARTING) { in skd_isr_fwstate()
2355 skd_recover_requests(skdev); in skd_isr_fwstate()
2357 if (skdev->state == SKD_DRVR_STATE_WAIT_BOOT) { in skd_isr_fwstate()
2358 skdev->timer_countdown = in skd_isr_fwstate()
2360 skdev->state = SKD_DRVR_STATE_STARTING; in skd_isr_fwstate()
2361 skd_soft_reset(skdev); in skd_isr_fwstate()
2365 SKD_WRITEL(skdev, mtd, FIT_MSG_TO_DEVICE); in skd_isr_fwstate()
2366 skdev->last_mtd = mtd; in skd_isr_fwstate()
2370 skdev->queue_depth_limit = skdev->soft_queue_depth_limit; in skd_isr_fwstate()
2371 if (skdev->queue_depth_limit > skdev->hard_queue_depth_limit) { in skd_isr_fwstate()
2372 skdev->queue_depth_limit = in skd_isr_fwstate()
2373 skdev->hard_queue_depth_limit; in skd_isr_fwstate()
2376 skdev->queue_depth_lowat = skdev->queue_depth_limit * 2 / 3 + 1; in skd_isr_fwstate()
2377 if (skdev->queue_depth_lowat < 1) in skd_isr_fwstate()
2378 skdev->queue_depth_lowat = 1; in skd_isr_fwstate()
2382 skdev->queue_depth_limit, in skd_isr_fwstate()
2383 skdev->hard_queue_depth_limit, in skd_isr_fwstate()
2384 skdev->soft_queue_depth_limit, in skd_isr_fwstate()
2385 skdev->queue_depth_lowat); in skd_isr_fwstate()
2387 skd_refresh_device_data(skdev); in skd_isr_fwstate()
2390 skdev->state = SKD_DRVR_STATE_BUSY; in skd_isr_fwstate()
2391 skdev->timer_countdown = SKD_TIMER_MINUTES(20); in skd_isr_fwstate()
2392 (void) skd_quiesce_dev(skdev); in skd_isr_fwstate()
2395 skdev->state = SKD_DRVR_STATE_BUSY_SANITIZE; in skd_isr_fwstate()
2396 skd_start(skdev); in skd_isr_fwstate()
2399 skdev->state = SKD_DRVR_STATE_BUSY_ERASE; in skd_isr_fwstate()
2400 skdev->timer_countdown = SKD_TIMER_MINUTES(20); in skd_isr_fwstate()
2403 skdev->state = SKD_DRVR_STATE_IDLE; in skd_isr_fwstate()
2406 skdev->state = SKD_DRVR_STATE_RESTARTING; in skd_isr_fwstate()
2408 switch (skdev->state) { in skd_isr_fwstate()
2413 skdev->state = SKD_DRVR_STATE_RESTARTING; in skd_isr_fwstate()
2419 "ISR FIT_SR_DRIVE_FW_BOOTING %s", skdev->name); in skd_isr_fwstate()
2420 skdev->state = SKD_DRVR_STATE_WAIT_BOOT; in skd_isr_fwstate()
2421 skdev->timer_countdown = SKD_TIMER_SECONDS(SKD_WAIT_BOOT_TO); in skd_isr_fwstate()
2430 skd_drive_fault(skdev); in skd_isr_fwstate()
2431 skd_recover_requests(skdev); in skd_isr_fwstate()
2432 skd_start(skdev); in skd_isr_fwstate()
2436 skd_drive_disappeared(skdev); in skd_isr_fwstate()
2437 skd_recover_requests(skdev); in skd_isr_fwstate()
2438 skd_start(skdev); in skd_isr_fwstate()
2449 skd_skdev_state_to_str(skdev->state), skdev->state); in skd_isr_fwstate()
2462 skd_recover_requests(struct skd_device *skdev) in skd_recover_requests() argument
2466 ASSERT(INTR_LOCK_HELD(skdev)); in skd_recover_requests()
2468 for (i = 0; i < skdev->num_req_context; i++) { in skd_recover_requests()
2469 struct skd_request_context *skreq = &skdev->skreq_table[i]; in skd_recover_requests()
2472 skd_log_skreq(skdev, skreq, "requeue"); in skd_recover_requests()
2477 skd_blkdev_postop_sg_list(skdev, skreq); in skd_recover_requests()
2479 skd_end_request(skdev, skreq, EAGAIN); in skd_recover_requests()
2490 WAITQ_LOCK(skdev); in skd_recover_requests()
2491 skdev->skreq_free_list = skdev->skreq_table; in skd_recover_requests()
2492 WAITQ_UNLOCK(skdev); in skd_recover_requests()
2494 for (i = 0; i < skdev->num_fitmsg_context; i++) { in skd_recover_requests()
2495 struct skd_fitmsg_context *skmsg = &skdev->skmsg_table[i]; in skd_recover_requests()
2498 skd_log_skmsg(skdev, skmsg, "salvaged"); in skd_recover_requests()
2508 WAITQ_LOCK(skdev); in skd_recover_requests()
2509 skdev->skmsg_free_list = skdev->skmsg_table; in skd_recover_requests()
2510 WAITQ_UNLOCK(skdev); in skd_recover_requests()
2513 skdev->timeout_slot[i] = 0; in skd_recover_requests()
2515 skdev->queue_depth_busy = 0; in skd_recover_requests()
2528 skd_isr_msg_from_dev(struct skd_device *skdev) in skd_isr_msg_from_dev() argument
2535 mfd = SKD_READL(skdev, FIT_MSG_FROM_DEVICE); in skd_isr_msg_from_dev()
2537 Dcmn_err(CE_NOTE, "mfd=0x%x last_mtd=0x%x\n", mfd, skdev->last_mtd); in skd_isr_msg_from_dev()
2542 if (FIT_MXD_TYPE(mfd) != FIT_MXD_TYPE(skdev->last_mtd)) { in skd_isr_msg_from_dev()
2548 skdev->proto_ver = FIT_PROTOCOL_MAJOR_VER(mfd); in skd_isr_msg_from_dev()
2550 if (skdev->proto_ver != FIT_PROTOCOL_VERSION_1) { in skd_isr_msg_from_dev()
2552 skdev->name); in skd_isr_msg_from_dev()
2554 skdev->name, skdev->proto_ver, in skd_isr_msg_from_dev()
2557 skdev->name); in skd_isr_msg_from_dev()
2558 skdev->state = SKD_DRVR_STATE_PROTOCOL_MISMATCH; in skd_isr_msg_from_dev()
2559 skd_soft_reset(skdev); in skd_isr_msg_from_dev()
2563 SKD_WRITEL(skdev, mtd, FIT_MSG_TO_DEVICE); in skd_isr_msg_from_dev()
2564 skdev->last_mtd = mtd; in skd_isr_msg_from_dev()
2568 skdev->hard_queue_depth_limit = FIT_MXD_DATA(mfd); in skd_isr_msg_from_dev()
2571 SKD_WRITEL(skdev, mtd, FIT_MSG_TO_DEVICE); in skd_isr_msg_from_dev()
2572 skdev->last_mtd = mtd; in skd_isr_msg_from_dev()
2576 SKD_WRITEQ(skdev, skdev->cq_dma_address.cookies->dmac_laddress, in skd_isr_msg_from_dev()
2579 SKD_WRITEL(skdev, mtd, FIT_MSG_TO_DEVICE); in skd_isr_msg_from_dev()
2580 skdev->last_mtd = mtd; in skd_isr_msg_from_dev()
2584 skd_reset_skcomp(skdev); in skd_isr_msg_from_dev()
2586 SKD_WRITEL(skdev, mtd, FIT_MSG_TO_DEVICE); in skd_isr_msg_from_dev()
2587 skdev->last_mtd = mtd; in skd_isr_msg_from_dev()
2591 skdev->last_mtd = 0; in skd_isr_msg_from_dev()
2614 skd_disable_interrupts(struct skd_device *skdev) in skd_disable_interrupts() argument
2620 sense = SKD_READL(skdev, FIT_CONTROL); in skd_disable_interrupts()
2622 SKD_WRITEL(skdev, sense, FIT_CONTROL); in skd_disable_interrupts()
2630 SKD_WRITEL(skdev, ~0, FIT_INT_MASK_HOST); in skd_disable_interrupts()
2644 skd_enable_interrupts(struct skd_device *skdev) in skd_enable_interrupts() argument
2659 SKD_WRITEL(skdev, ~val, FIT_INT_MASK_HOST); in skd_enable_interrupts()
2663 val = SKD_READL(skdev, FIT_CONTROL); in skd_enable_interrupts()
2668 SKD_WRITEL(skdev, val, FIT_CONTROL); in skd_enable_interrupts()
2681 skd_soft_reset(struct skd_device *skdev) in skd_soft_reset() argument
2687 val = SKD_READL(skdev, FIT_CONTROL); in skd_soft_reset()
2692 SKD_WRITEL(skdev, val, FIT_CONTROL); in skd_soft_reset()
2705 skd_start_device(struct skd_device *skdev) in skd_start_device() argument
2713 SKD_WRITEL(skdev, FIT_INT_DEF_MASK, FIT_INT_STATUS_HOST); in skd_start_device()
2715 state = SKD_READL(skdev, FIT_STATUS); in skd_start_device()
2720 skdev->drive_state = state; in skd_start_device()
2721 skdev->last_mtd = 0; in skd_start_device()
2723 skdev->state = SKD_DRVR_STATE_STARTING; in skd_start_device()
2724 skdev->timer_countdown = SKD_TIMER_SECONDS(SKD_STARTING_TO); in skd_start_device()
2726 skd_enable_interrupts(skdev); in skd_start_device()
2728 switch (skdev->drive_state) { in skd_start_device()
2731 skd_name(skdev)); in skd_start_device()
2735 Dcmn_err(CE_NOTE, "FIT_SR_DRIVE_FW_BOOTING %s\n", skdev->name); in skd_start_device()
2736 skdev->state = SKD_DRVR_STATE_WAIT_BOOT; in skd_start_device()
2737 skdev->timer_countdown = SKD_TIMER_SECONDS(SKD_WAIT_BOOT_TO); in skd_start_device()
2742 skd_name(skdev)); in skd_start_device()
2743 skdev->state = SKD_DRVR_STATE_BUSY_SANITIZE; in skd_start_device()
2744 skdev->timer_countdown = SKD_TIMER_SECONDS(60); in skd_start_device()
2749 skd_name(skdev)); in skd_start_device()
2750 skdev->state = SKD_DRVR_STATE_BUSY_ERASE; in skd_start_device()
2751 skdev->timer_countdown = SKD_TIMER_SECONDS(60); in skd_start_device()
2756 skd_soft_reset(skdev); in skd_start_device()
2762 skd_name(skdev)); in skd_start_device()
2763 skdev->state = SKD_DRVR_STATE_BUSY; in skd_start_device()
2764 skdev->timer_countdown = SKD_TIMER_SECONDS(60); in skd_start_device()
2769 skd_name(skdev)); in skd_start_device()
2778 skd_drive_fault(skdev); in skd_start_device()
2784 skd_drive_disappeared(skdev); in skd_start_device()
2791 skd_name(skdev), skdev->drive_state); in skd_start_device()
2795 state = SKD_READL(skdev, FIT_CONTROL); in skd_start_device()
2798 state = SKD_READL(skdev, FIT_INT_STATUS_HOST); in skd_start_device()
2801 state = SKD_READL(skdev, FIT_INT_MASK_HOST); in skd_start_device()
2804 state = SKD_READL(skdev, FIT_MSG_FROM_DEVICE); in skd_start_device()
2807 state = SKD_READL(skdev, FIT_HW_VERSION); in skd_start_device()
2812 Dcmn_err(CE_NOTE, "Starting %s queue\n", skdev->name); in skd_start_device()
2813 skd_start(skdev); in skd_start_device()
2814 skdev->gendisk_on = -1; in skd_start_device()
2815 cv_signal(&skdev->cv_waitq); in skd_start_device()
2829 skd_restart_device(struct skd_device *skdev) in skd_restart_device() argument
2836 SKD_WRITEL(skdev, FIT_INT_DEF_MASK, FIT_INT_STATUS_HOST); in skd_restart_device()
2838 state = SKD_READL(skdev, FIT_STATUS); in skd_restart_device()
2843 skdev->drive_state = state; in skd_restart_device()
2844 skdev->last_mtd = 0; in skd_restart_device()
2846 skdev->state = SKD_DRVR_STATE_RESTARTING; in skd_restart_device()
2847 skdev->timer_countdown = SKD_TIMER_MINUTES(4); in skd_restart_device()
2849 skd_soft_reset(skdev); in skd_restart_device()
2862 skd_stop_device(struct skd_device *skdev) in skd_stop_device() argument
2866 struct skd_special_context *skspcl = &skdev->internal_skspcl; in skd_stop_device()
2868 if (SKD_DRVR_STATE_ONLINE != skdev->state) { in skd_stop_device()
2870 skdev->name); in skd_stop_device()
2876 skdev->name); in skd_stop_device()
2880 skdev->state = SKD_DRVR_STATE_SYNCING; in skd_stop_device()
2881 skdev->sync_done = 0; in skd_stop_device()
2883 skd_send_internal_skspcl(skdev, skspcl, SYNCHRONIZE_CACHE); in skd_stop_device()
2886 mutex_enter(&skdev->skd_internalio_mutex); in skd_stop_device()
2887 while (skdev->sync_done == 0) { in skd_stop_device()
2890 if (cv_timedwait(&skdev->cv_waitq, in skd_stop_device()
2891 &skdev->skd_internalio_mutex, tmo) == -1) { in skd_stop_device()
2898 mutex_exit(&skdev->skd_internalio_mutex); in skd_stop_device()
2900 switch (skdev->sync_done) { in skd_stop_device()
2903 skdev->name); in skd_stop_device()
2907 skdev->name); in skd_stop_device()
2911 skdev->name); in skd_stop_device()
2916 skdev->state = SKD_DRVR_STATE_STOPPING; in skd_stop_device()
2918 skd_disable_interrupts(skdev); in skd_stop_device()
2921 SKD_WRITEL(skdev, FIT_INT_DEF_MASK, FIT_INT_STATUS_HOST); in skd_stop_device()
2923 SKD_WRITEL(skdev, FIT_CR_SOFT_RESET, FIT_CONTROL); in skd_stop_device()
2951 skd_construct(skd_device_t *skdev, int instance) in skd_construct() argument
2955 skdev->state = SKD_DRVR_STATE_LOAD; in skd_construct()
2956 skdev->irq_type = skd_isr_type; in skd_construct()
2957 skdev->soft_queue_depth_limit = skd_max_queue_depth; in skd_construct()
2958 skdev->hard_queue_depth_limit = 10; /* until GET_CMDQ_DEPTH */ in skd_construct()
2960 skdev->num_req_context = skd_max_queue_depth; in skd_construct()
2961 skdev->num_fitmsg_context = skd_max_queue_depth; in skd_construct()
2963 skdev->queue_depth_limit = skdev->hard_queue_depth_limit; in skd_construct()
2964 skdev->queue_depth_lowat = 1; in skd_construct()
2965 skdev->proto_ver = 99; /* initialize to invalid value */ in skd_construct()
2966 skdev->sgs_per_request = skd_sgs_per_request; in skd_construct()
2967 skdev->dbg_level = skd_dbg_level; in skd_construct()
2969 rc = skd_cons_skcomp(skdev); in skd_construct()
2974 rc = skd_cons_skmsg(skdev); in skd_construct()
2979 rc = skd_cons_skreq(skdev); in skd_construct()
2984 rc = skd_cons_sksb(skdev); in skd_construct()
2995 skd_destruct(skdev); in skd_construct()
3011 skd_free_phys(skd_device_t *skdev, dma_mem_t *mem) in skd_free_phys() argument
3013 _NOTE(ARGUNUSED(skdev)); in skd_free_phys()
3046 skd_alloc_dma_mem(skd_device_t *skdev, dma_mem_t *mem, uint8_t atype) in skd_alloc_dma_mem() argument
3065 if (ddi_dma_alloc_handle(skdev->dip, &dma_attr, DDI_DMA_SLEEP, NULL, in skd_alloc_dma_mem()
3101 skd_free_phys(skdev, mem); in skd_alloc_dma_mem()
3121 skd_cons_skcomp(struct skd_device *skdev) in skd_cons_skcomp() argument
3135 mem = &skdev->cq_dma_address; in skd_cons_skcomp()
3138 dma_alloc = skd_alloc_dma_mem(skdev, mem, ATYPE_64BIT); in skd_cons_skcomp()
3150 skdev->skcomp_table = skcomp; in skd_cons_skcomp()
3151 skdev->skerr_table = (struct fit_comp_error_info *)(dma_alloc + in skd_cons_skcomp()
3168 skd_cons_skmsg(struct skd_device *skdev) in skd_cons_skmsg() argument
3176 skdev->num_fitmsg_context, in skd_cons_skmsg()
3178 skdev->num_fitmsg_context)); in skd_cons_skmsg()
3180 skdev->skmsg_table = (struct skd_fitmsg_context *)kmem_zalloc( in skd_cons_skmsg()
3181 sizeof (struct skd_fitmsg_context) * skdev->num_fitmsg_context, in skd_cons_skmsg()
3184 for (i = 0; i < skdev->num_fitmsg_context; i++) { in skd_cons_skmsg()
3187 skmsg = &skdev->skmsg_table[i]; in skd_cons_skmsg()
3196 skmsg->msg_buf = skd_alloc_dma_mem(skdev, mem, ATYPE_64BIT); in skd_cons_skmsg()
3212 skdev->skmsg_table[i - 1].next = NULL; in skd_cons_skmsg()
3213 skdev->skmsg_free_list = skdev->skmsg_table; in skd_cons_skmsg()
3228 skd_cons_skreq(struct skd_device *skdev) in skd_cons_skreq() argument
3236 skdev->num_req_context, in skd_cons_skreq()
3238 skdev->num_req_context)); in skd_cons_skreq()
3240 skdev->skreq_table = (struct skd_request_context *)kmem_zalloc( in skd_cons_skreq()
3241 sizeof (struct skd_request_context) * skdev->num_req_context, in skd_cons_skreq()
3244 for (i = 0; i < skdev->num_req_context; i++) { in skd_cons_skreq()
3247 skreq = &skdev->skreq_table[i]; in skd_cons_skreq()
3252 skreq->sksg_list = skd_cons_sg_list(skdev, in skd_cons_skreq()
3253 skdev->sgs_per_request, in skd_cons_skreq()
3265 skdev->skreq_table[i - 1].next = NULL; in skd_cons_skreq()
3266 skdev->skreq_free_list = skdev->skreq_table; in skd_cons_skreq()
3283 skd_cons_sksb(struct skd_device *skdev) in skd_cons_sksb() argument
3290 skspcl = &skdev->internal_skspcl; in skd_cons_sksb()
3301 skspcl->data_buf = skd_alloc_dma_mem(skdev, mem, ATYPE_64BIT); in skd_cons_sksb()
3315 skspcl->msg_buf = skd_alloc_dma_mem(skdev, mem, ATYPE_64BIT); in skd_cons_sksb()
3324 skspcl->req.sksg_list = skd_cons_sg_list(skdev, 1, in skd_cons_sksb()
3333 if (skd_format_internal_skspcl(skdev) == 0) { in skd_cons_sksb()
3354 *skd_cons_sg_list(struct skd_device *skdev, in skd_cons_sg_list() argument
3367 sg_list = skd_alloc_dma_mem(skdev, mem, ATYPE_32BIT); in skd_cons_sg_list()
3391 static void skd_free_skcomp(struct skd_device *skdev);
3392 static void skd_free_skmsg(struct skd_device *skdev);
3393 static void skd_free_skreq(struct skd_device *skdev);
3394 static void skd_free_sksb(struct skd_device *skdev);
3396 static void skd_free_sg_list(struct skd_device *skdev,
3411 skd_destruct(struct skd_device *skdev) in skd_destruct() argument
3413 if (skdev == NULL) { in skd_destruct()
3418 skd_free_sksb(skdev); in skd_destruct()
3421 skd_free_skreq(skdev); in skd_destruct()
3424 skd_free_skmsg(skdev); in skd_destruct()
3427 skd_free_skcomp(skdev); in skd_destruct()
3442 skd_free_skcomp(struct skd_device *skdev) in skd_free_skcomp() argument
3444 if (skdev->skcomp_table != NULL) { in skd_free_skcomp()
3445 skd_free_phys(skdev, &skdev->cq_dma_address); in skd_free_skcomp()
3448 skdev->skcomp_table = NULL; in skd_free_skcomp()
3461 skd_free_skmsg(struct skd_device *skdev) in skd_free_skmsg() argument
3465 if (NULL == skdev->skmsg_table) in skd_free_skmsg()
3468 for (i = 0; i < skdev->num_fitmsg_context; i++) { in skd_free_skmsg()
3471 skmsg = &skdev->skmsg_table[i]; in skd_free_skmsg()
3474 skd_free_phys(skdev, &skmsg->mb_dma_address); in skd_free_skmsg()
3481 kmem_free(skdev->skmsg_table, sizeof (struct skd_fitmsg_context) * in skd_free_skmsg()
3482 skdev->num_fitmsg_context); in skd_free_skmsg()
3484 skdev->skmsg_table = NULL; in skd_free_skmsg()
3498 skd_free_skreq(struct skd_device *skdev) in skd_free_skreq() argument
3502 if (NULL == skdev->skreq_table) in skd_free_skreq()
3505 for (i = 0; i < skdev->num_req_context; i++) { in skd_free_skreq()
3508 skreq = &skdev->skreq_table[i]; in skd_free_skreq()
3510 skd_free_sg_list(skdev, skreq->sksg_list, in skd_free_skreq()
3511 skdev->sgs_per_request, skreq->sksg_dma_address); in skd_free_skreq()
3516 kmem_free(skdev->skreq_table, sizeof (struct skd_request_context) * in skd_free_skreq()
3517 skdev->num_req_context); in skd_free_skreq()
3519 skdev->skreq_table = NULL; in skd_free_skreq()
3534 skd_free_sksb(struct skd_device *skdev) in skd_free_sksb() argument
3538 skspcl = &skdev->internal_skspcl; in skd_free_sksb()
3541 skd_free_phys(skdev, &skspcl->db_dma_address); in skd_free_sksb()
3547 skd_free_phys(skdev, &skspcl->mb_dma_address); in skd_free_sksb()
3552 skd_free_sg_list(skdev, skspcl->req.sksg_list, 1, in skd_free_sksb()
3572 skd_free_sg_list(struct skd_device *skdev, in skd_free_sg_list() argument
3577 skd_free_phys(skdev, &dma_addr); in skd_free_sg_list()
3592 skd_queue(skd_device_t *skdev, skd_buf_private_t *pbuf) in skd_queue() argument
3596 ASSERT(skdev != NULL); in skd_queue()
3599 ASSERT(WAITQ_LOCK_HELD(skdev)); in skd_queue()
3601 waitq = &skdev->waitqueue; in skd_queue()
3621 skd_list_skreq(skd_device_t *skdev, int list) in skd_list_skreq() argument
3629 skreq = &skdev->skreq_table[0]; in skd_list_skreq()
3645 skreq = skdev->skreq_free_list; in skd_list_skreq()
3673 skd_list_skmsg(skd_device_t *skdev, int list) in skd_list_skmsg() argument
3678 skmsgp = &skdev->skmsg_table[0]; in skd_list_skmsg()
3698 skmsgp = skdev->skmsg_free_list; in skd_list_skmsg()
3725 *skd_get_queued_pbuf(skd_device_t *skdev) in skd_get_queued_pbuf() argument
3729 ASSERT(WAITQ_LOCK_HELD(skdev)); in skd_get_queued_pbuf()
3730 pbuf = SIMPLEQ_FIRST(&skdev->waitqueue); in skd_get_queued_pbuf()
3732 SIMPLEQ_REMOVE_HEAD(&skdev->waitqueue, sq); in skd_get_queued_pbuf()
3750 skd_pci_info(struct skd_device *skdev, char *str, size_t len) in skd_pci_info() argument
3756 pcie_reg = skd_pci_find_capability(skdev, PCI_CAP_ID_EXP); in skd_pci_info()
3762 lstat = pci_config_get16(skdev->pci_handle, pcie_reg); in skd_pci_info()
3790 skd_init(skd_device_t *skdev) in skd_init() argument
3961 skd_log_skdev(struct skd_device *skdev, const char *event) in skd_log_skdev() argument
3964 skdev->name, (void *)skdev, event); in skd_log_skdev()
3966 skd_drive_state_to_str(skdev->drive_state), skdev->drive_state, in skd_log_skdev()
3967 skd_skdev_state_to_str(skdev->state), skdev->state); in skd_log_skdev()
3969 skdev->queue_depth_busy, skdev->queue_depth_limit, in skd_log_skdev()
3970 skdev->soft_queue_depth_limit, skdev->hard_queue_depth_limit, in skd_log_skdev()
3971 skdev->queue_depth_lowat); in skd_log_skdev()
3973 skdev->timeout_stamp, skdev->skcomp_cycle, skdev->skcomp_ix); in skd_log_skdev()
3988 skd_log_skmsg(struct skd_device *skdev, in skd_log_skmsg() argument
3992 skdev->name, (void *)skmsg, event); in skd_log_skmsg()
4010 skd_log_skreq(struct skd_device *skdev, in skd_log_skreq() argument
4016 skdev->name, (void *)skreq, (void *)skreq->pbuf, event); in skd_log_skreq()
4033 skdev->intr_cntr, skdev->queue_depth_busy); in skd_log_skreq()
4049 skd_init_mutex(skd_device_t *skdev) in skd_init_mutex() argument
4054 skdev->instance, skdev->flags); in skd_init_mutex()
4056 intr = (void *)(uintptr_t)skdev->intr_pri; in skd_init_mutex()
4058 if (skdev->flags & SKD_MUTEX_INITED) in skd_init_mutex()
4062 mutex_init(&skdev->skd_lock_mutex, NULL, MUTEX_DRIVER, in skd_init_mutex()
4064 mutex_init(&skdev->skd_intr_mutex, NULL, MUTEX_DRIVER, in skd_init_mutex()
4066 mutex_init(&skdev->waitqueue_mutex, NULL, MUTEX_DRIVER, in skd_init_mutex()
4068 mutex_init(&skdev->skd_internalio_mutex, NULL, MUTEX_DRIVER, in skd_init_mutex()
4071 cv_init(&skdev->cv_waitq, NULL, CV_DRIVER, NULL); in skd_init_mutex()
4073 skdev->flags |= SKD_MUTEX_INITED; in skd_init_mutex()
4074 if (skdev->flags & SKD_MUTEX_DESTROYED) in skd_init_mutex()
4075 skdev->flags &= ~SKD_MUTEX_DESTROYED; in skd_init_mutex()
4078 skdev->instance, skdev->flags); in skd_init_mutex()
4093 skd_destroy_mutex(skd_device_t *skdev) in skd_destroy_mutex() argument
4095 if ((skdev->flags & SKD_MUTEX_DESTROYED) == 0) { in skd_destroy_mutex()
4096 if (skdev->flags & SKD_MUTEX_INITED) { in skd_destroy_mutex()
4097 mutex_destroy(&skdev->waitqueue_mutex); in skd_destroy_mutex()
4098 mutex_destroy(&skdev->skd_intr_mutex); in skd_destroy_mutex()
4099 mutex_destroy(&skdev->skd_lock_mutex); in skd_destroy_mutex()
4100 mutex_destroy(&skdev->skd_internalio_mutex); in skd_destroy_mutex()
4102 cv_destroy(&skdev->cv_waitq); in skd_destroy_mutex()
4104 skdev->flags |= SKD_MUTEX_DESTROYED; in skd_destroy_mutex()
4106 if (skdev->flags & SKD_MUTEX_INITED) in skd_destroy_mutex()
4107 skdev->flags &= ~SKD_MUTEX_INITED; in skd_destroy_mutex()
4123 skd_setup_intr(skd_device_t *skdev, int intr_type) in skd_setup_intr() argument
4131 Dcmn_err(CE_CONT, "(%s%d): setup_intr", DRV_NAME, skdev->instance); in skd_setup_intr()
4134 if (((ret = ddi_intr_get_nintrs(skdev->dip, intr_type, &count)) != in skd_setup_intr()
4143 if (((ret = ddi_intr_get_navail(skdev->dip, intr_type, &avail)) != in skd_setup_intr()
4160 skdev->hsize = sizeof (ddi_intr_handle_t) * avail; in skd_setup_intr()
4161 skdev->htable = kmem_zalloc(skdev->hsize, KM_SLEEP); in skd_setup_intr()
4164 if ((ret = ddi_intr_alloc(skdev->dip, skdev->htable, intr_type, in skd_setup_intr()
4169 skd_release_intr(skdev); in skd_setup_intr()
4174 skdev->intr_cnt = actual; in skd_setup_intr()
4177 (void) ddi_intr_set_pri(skdev->htable[0], 10); in skd_setup_intr()
4180 if ((ret = ddi_intr_get_pri(skdev->htable[0], &skdev->intr_pri)) != in skd_setup_intr()
4183 skd_release_intr(skdev); in skd_setup_intr()
4190 if ((ret = ddi_intr_add_handler(skdev->htable[i], in skd_setup_intr()
4191 skd_isr_aif, (void *)skdev, (void *)((ulong_t)i))) != in skd_setup_intr()
4195 skd_release_intr(skdev); in skd_setup_intr()
4202 if ((ret = skd_init_mutex(skdev)) != DDI_SUCCESS) { in skd_setup_intr()
4204 skd_release_intr(skdev); in skd_setup_intr()
4210 (void) ddi_intr_get_cap(skdev->htable[0], &skdev->intr_cap); in skd_setup_intr()
4213 if (skdev->intr_cap & DDI_INTR_FLAG_BLOCK) { in skd_setup_intr()
4214 if ((ret = ddi_intr_block_enable(skdev->htable, in skd_setup_intr()
4215 skdev->intr_cnt)) != DDI_SUCCESS) { in skd_setup_intr()
4218 skd_destroy_mutex(skdev); in skd_setup_intr()
4219 skd_release_intr(skdev); in skd_setup_intr()
4224 for (i = 0; i < skdev->intr_cnt; i++) { in skd_setup_intr()
4225 if ((ret = ddi_intr_enable(skdev->htable[i])) != in skd_setup_intr()
4229 skd_destroy_mutex(skdev); in skd_setup_intr()
4230 skd_release_intr(skdev); in skd_setup_intr()
4238 (void) ddi_intr_clr_mask(skdev->htable[0]); in skd_setup_intr()
4240 skdev->irq_type = intr_type; in skd_setup_intr()
4255 skd_disable_intr(skd_device_t *skdev) in skd_disable_intr() argument
4259 if (skdev->intr_cap & DDI_INTR_FLAG_BLOCK) { in skd_disable_intr()
4261 if ((rval = ddi_intr_block_disable(skdev->htable, in skd_disable_intr()
4262 skdev->intr_cnt)) != DDI_SUCCESS) { in skd_disable_intr()
4268 for (i = 0; i < skdev->intr_cnt; i++) { in skd_disable_intr()
4269 if ((rval = ddi_intr_disable(skdev->htable[i])) != in skd_disable_intr()
4288 skd_release_intr(skd_device_t *skdev) in skd_release_intr() argument
4294 Dcmn_err(CE_CONT, "REL_INTR intr_cnt=%d", skdev->intr_cnt); in skd_release_intr()
4296 if (skdev->irq_type == 0) { in skd_release_intr()
4298 DRV_NAME, skdev->instance); in skd_release_intr()
4302 if (skdev->htable != NULL && skdev->hsize > 0) { in skd_release_intr()
4303 i = (int32_t)skdev->hsize / (int32_t)sizeof (ddi_intr_handle_t); in skd_release_intr()
4306 if (skdev->htable[i] == 0) { in skd_release_intr()
4311 if ((rval = ddi_intr_disable(skdev->htable[i])) != in skd_release_intr()
4316 if (i < skdev->intr_cnt) { in skd_release_intr()
4318 skdev->htable[i])) != DDI_SUCCESS) in skd_release_intr()
4327 if ((rval = ddi_intr_free(skdev->htable[i])) != in skd_release_intr()
4335 kmem_free(skdev->htable, skdev->hsize); in skd_release_intr()
4336 skdev->htable = NULL; in skd_release_intr()
4339 skdev->hsize = 0; in skd_release_intr()
4340 skdev->intr_cnt = 0; in skd_release_intr()
4341 skdev->intr_pri = 0; in skd_release_intr()
4342 skdev->intr_cap = 0; in skd_release_intr()
4343 skdev->irq_type = 0; in skd_release_intr()
4361 skd_dealloc_resources(dev_info_t *dip, skd_device_t *skdev, in skd_dealloc_resources() argument
4365 if (skdev == NULL) in skd_dealloc_resources()
4369 skd_destruct(skdev); in skd_dealloc_resources()
4372 skd_disable_intr(skdev); in skd_dealloc_resources()
4373 skd_release_intr(skdev); in skd_dealloc_resources()
4377 ddi_regs_map_free(&skdev->dev_handle); in skd_dealloc_resources()
4380 ddi_regs_map_free(&skdev->iomap_handle); in skd_dealloc_resources()
4383 ddi_regs_map_free(&skdev->iobase_handle); in skd_dealloc_resources()
4386 pci_config_teardown(&skdev->pci_handle); in skd_dealloc_resources()
4389 if (skdev->pathname && in skd_dealloc_resources()
4390 (skdev->flags & SKD_PATHNAME_ALLOCED)) { in skd_dealloc_resources()
4391 kmem_free(skdev->pathname, in skd_dealloc_resources()
4392 strlen(skdev->pathname)+1); in skd_dealloc_resources()
4396 if (skdev->s1120_devid) in skd_dealloc_resources()
4397 ddi_devid_free(skdev->s1120_devid); in skd_dealloc_resources()
4411 skd_setup_interrupts(skd_device_t *skdev) in skd_setup_interrupts() argument
4420 if ((i = ddi_intr_get_supported_types(skdev->dip, &itypes)) != in skd_setup_interrupts()
4427 skdev->name, itypes); in skd_setup_interrupts()
4429 itypes &= skdev->irq_type; in skd_setup_interrupts()
4432 (rval = skd_setup_intr(skdev, DDI_INTR_TYPE_MSIX)) == DDI_SUCCESS) { in skd_setup_interrupts()
4434 skdev->name); in skd_setup_interrupts()
4436 (rval = skd_setup_intr(skdev, DDI_INTR_TYPE_MSI)) == DDI_SUCCESS) { in skd_setup_interrupts()
4438 skdev->name); in skd_setup_interrupts()
4440 (rval = skd_setup_intr(skdev, DDI_INTR_TYPE_FIXED)) in skd_setup_interrupts()
4443 skdev->name); in skd_setup_interrupts()
4446 skdev->name); in skd_setup_interrupts()
4450 Dcmn_err(CE_CONT, "%s: setup interrupts done", skdev->name); in skd_setup_interrupts()
4467 skd_get_properties(dev_info_t *dip, skd_device_t *skdev) in skd_get_properties() argument
4506 skd_wait_for_s1120(skd_device_t *skdev) in skd_wait_for_s1120() argument
4512 mutex_enter(&skdev->skd_internalio_mutex); in skd_wait_for_s1120()
4514 while (skdev->gendisk_on == 0) { in skd_wait_for_s1120()
4517 if (cv_timedwait(&skdev->cv_waitq, in skd_wait_for_s1120()
4518 &skdev->skd_internalio_mutex, tmo) == -1) { in skd_wait_for_s1120()
4525 mutex_exit(&skdev->skd_internalio_mutex); in skd_wait_for_s1120()
4527 if (skdev->gendisk_on == 1) in skd_wait_for_s1120()
4544 skd_update_props(skd_device_t *skdev, dev_info_t *dip) in skd_update_props() argument
4549 skdev->Nblocks) != DDI_SUCCESS) || in skd_update_props()
4553 skdev->name); in skd_update_props()
4568 skd_setup_devid(skd_device_t *skdev, ddi_devid_t *devid) in skd_setup_devid() argument
4572 sz_model = scsi_ascii_inquiry_len(skdev->inq_product_id, in skd_setup_devid()
4573 strlen(skdev->inq_product_id)); in skd_setup_devid()
4574 sz_sn = scsi_ascii_inquiry_len(skdev->inq_serial_num, in skd_setup_devid()
4575 strlen(skdev->inq_serial_num)); in skd_setup_devid()
4578 (void) snprintf(skdev->devid_str, sizeof (skdev->devid_str), in skd_setup_devid()
4579 "%.*s=%.*s", sz_model, skdev->inq_product_id, sz_sn, in skd_setup_devid()
4580 skdev->inq_serial_num); in skd_setup_devid()
4581 rc = ddi_devid_init(skdev->dip, DEVID_SCSI_SERIAL, sz, in skd_setup_devid()
4582 skdev->devid_str, devid); in skd_setup_devid()
4585 cmn_err(CE_WARN, "!%s: devid_init FAILED", skdev->name); in skd_setup_devid()
4602 skd_bd_attach(dev_info_t *dip, skd_device_t *skdev) in skd_bd_attach() argument
4606 skdev->s_bdh = bd_alloc_handle(skdev, &skd_bd_ops, in skd_bd_attach()
4609 if (skdev->s_bdh == NULL) { in skd_bd_attach()
4615 rv = bd_attach_handle(dip, skdev->s_bdh); in skd_bd_attach()
4621 skdev->bd_attached++; in skd_bd_attach()
4637 skd_bd_detach(skd_device_t *skdev) in skd_bd_detach() argument
4639 if (skdev->bd_attached) in skd_bd_detach()
4640 (void) bd_detach_handle(skdev->s_bdh); in skd_bd_detach()
4642 bd_free_handle(skdev->s_bdh); in skd_bd_detach()
4660 skd_device_t *skdev = NULL; in skd_attach() local
4679 skd_start_timer(skdev); in skd_attach()
4720 skdev = ddi_get_soft_state(skd_state, instance); in skd_attach()
4721 if (skdev == NULL) { in skd_attach()
4727 (void) snprintf(skdev->name, sizeof (skdev->name), in skd_attach()
4730 skdev->dip = dip; in skd_attach()
4731 skdev->instance = instance; in skd_attach()
4733 ddi_set_driver_private(dip, skdev); in skd_attach()
4746 skdev->pathname = kmem_zalloc(strlen(name) + 1, KM_SLEEP); in skd_attach()
4747 (void) strlcpy(skdev->pathname, name, strlen(name) + 1); in skd_attach()
4750 skdev->flags |= SKD_PATHNAME_ALLOCED; in skd_attach()
4752 if (pci_config_setup(dip, &skdev->pci_handle) != DDI_SUCCESS) { in skd_attach()
4770 ddi_regs_map_setup(dip, 1, &skdev->iobase, 0, regsize, in skd_attach()
4771 &dev_acc_attr, &skdev->iobase_handle) != DDI_SUCCESS) { in skd_attach()
4778 skdev->iomap_iobase = skdev->iobase; in skd_attach()
4779 skdev->iomap_handle = skdev->iobase_handle; in skd_attach()
4782 "regsize=%ld", skdev->name, (void *)skdev->iobase, in skd_attach()
4783 (void *)skdev->iomap_iobase, 1, regsize); in skd_attach()
4786 ddi_regs_map_setup(dip, 2, &skdev->dev_iobase, 0, regsize, in skd_attach()
4787 &dev_acc_attr, &skdev->dev_handle) != DDI_SUCCESS) { in skd_attach()
4794 skdev->dev_memsize = (int)regsize; in skd_attach()
4797 skdev->name, (void *)skdev->dev_iobase, in skd_attach()
4798 skdev->dev_memsize); in skd_attach()
4802 cmd_reg = pci_config_get16(skdev->pci_handle, PCI_CONF_COMM); in skd_attach()
4805 pci_config_put16(skdev->pci_handle, PCI_CONF_COMM, cmd_reg); in skd_attach()
4808 skdev->vendor_id = pci_config_get16(skdev->pci_handle, PCI_CONF_VENID); in skd_attach()
4809 skdev->device_id = pci_config_get16(skdev->pci_handle, PCI_CONF_DEVID); in skd_attach()
4812 skdev->name, skdev->vendor_id, skdev->device_id); in skd_attach()
4814 skd_get_properties(dip, skdev); in skd_attach()
4816 (void) skd_init(skdev); in skd_attach()
4818 if (skd_construct(skdev, instance)) { in skd_attach()
4819 cmn_err(CE_WARN, "!%s: construct FAILED", skdev->name); in skd_attach()
4826 SIMPLEQ_INIT(&skdev->waitqueue); in skd_attach()
4831 if (skd_setup_interrupts(skdev) != DDI_SUCCESS) { in skd_attach()
4833 skdev->name); in skd_attach()
4839 ADAPTER_STATE_LOCK(skdev); in skd_attach()
4840 skdev->flags |= SKD_ATTACHED; in skd_attach()
4841 ADAPTER_STATE_UNLOCK(skdev); in skd_attach()
4843 skdev->d_blkshift = 9; in skd_attach()
4847 skd_start_device(skdev); in skd_attach()
4849 ADAPTER_STATE_LOCK(skdev); in skd_attach()
4850 skdev->progress = progress; in skd_attach()
4851 ADAPTER_STATE_UNLOCK(skdev); in skd_attach()
4857 if (skdev->gendisk_on != 1) in skd_attach()
4858 (void) skd_wait_for_s1120(skdev); in skd_attach()
4860 if (skdev->gendisk_on != 1) { in skd_attach()
4862 skdev->name); in skd_attach()
4868 skd_send_internal_skspcl(skdev, &skdev->internal_skspcl, INQUIRY); in skd_attach()
4870 skdev->disks_initialized++; in skd_attach()
4873 (void) skd_pci_info(skdev, pci_str, sizeof (pci_str)); in skd_attach()
4878 skdev->vendor_id, skdev->device_id, pci_str); in skd_attach()
4880 Dcmn_err(CE_NOTE, " sTec S1120 %s\n", skdev->pathname); in skd_attach()
4882 if (*skdev->inq_serial_num) in skd_attach()
4884 skdev->inq_serial_num); in skd_attach()
4886 if (*skdev->inq_product_id && in skd_attach()
4887 *skdev->inq_product_rev) in skd_attach()
4889 skdev->inq_product_id, skdev->inq_product_rev); in skd_attach()
4892 skdev->name, skdev->irq_type); in skd_attach()
4894 skdev->name, skd_max_queue_depth); in skd_attach()
4896 skdev->name, skd_sgs_per_request); in skd_attach()
4898 skdev->name, skd_max_req_per_msg); in skd_attach()
4900 if (skd_bd_attach(dip, skdev) == DDI_FAILURE) in skd_attach()
4903 skd_update_props(skdev, dip); in skd_attach()
4906 skd_start_timer(skdev); in skd_attach()
4908 ADAPTER_STATE_LOCK(skdev); in skd_attach()
4909 skdev->progress = progress; in skd_attach()
4910 ADAPTER_STATE_UNLOCK(skdev); in skd_attach()
4912 skdev->attached = 1; in skd_attach()
4916 skd_dealloc_resources(dip, skdev, progress, instance); in skd_attach()
4918 if ((skdev->flags & SKD_MUTEX_DESTROYED) == 0) { in skd_attach()
4919 skd_destroy_mutex(skdev); in skd_attach()
4938 skd_halt(skd_device_t *skdev) in skd_halt() argument
4940 Dcmn_err(CE_NOTE, "%s: halt/suspend ......", skdev->name); in skd_halt()
4956 skd_device_t *skdev; in skd_detach() local
4964 skdev = ddi_get_soft_state(skd_state, instance); in skd_detach()
4965 if (skdev == NULL) { in skd_detach()
4976 ADAPTER_STATE_LOCK(skdev); in skd_detach()
4979 skdev->flags |= (SKD_SUSPENDED | SKD_CMD_ABORT_TMO); in skd_detach()
4982 if (skdev->skd_timer_timeout_id != 0) { in skd_detach()
4983 timer_id = skdev->skd_timer_timeout_id; in skd_detach()
4984 skdev->skd_timer_timeout_id = 0; in skd_detach()
4986 ADAPTER_STATE_UNLOCK(skdev); in skd_detach()
4993 if (skdev->power_level != LOW_POWER_LEVEL) { in skd_detach()
4994 skd_halt(skdev); in skd_detach()
4995 skdev->power_level = LOW_POWER_LEVEL; in skd_detach()
4998 skspcl = &skdev->internal_skspcl; in skd_detach()
4999 skd_send_internal_skspcl(skdev, skspcl, SYNCHRONIZE_CACHE); in skd_detach()
5001 skd_stop_device(skdev); in skd_detach()
5006 while (!SIMPLEQ_EMPTY(&skdev->waitqueue)) { in skd_detach()
5007 pbuf = skd_get_queued_pbuf(skdev); in skd_detach()
5008 skd_end_request_abnormal(skdev, pbuf, ECANCELED, in skd_detach()
5017 skd_bd_detach(skdev); in skd_detach()
5019 skd_dealloc_resources(dip, skdev, skdev->progress, instance); in skd_detach()
5021 if ((skdev->flags & SKD_MUTEX_DESTROYED) == 0) { in skd_detach()
5022 skd_destroy_mutex(skdev); in skd_detach()
5034 ADAPTER_STATE_LOCK(skdev); in skd_detach()
5035 skdev->flags |= SKD_SUSPENDED; in skd_detach()
5038 if (skdev->skd_timer_timeout_id != 0) { in skd_detach()
5039 timer_id = skdev->skd_timer_timeout_id; in skd_detach()
5040 skdev->skd_timer_timeout_id = 0; in skd_detach()
5042 ADAPTER_STATE_UNLOCK(skdev); in skd_detach()
5050 skd_halt(skdev); in skd_detach()
5086 skd_device_t *skdev = arg; in skd_devid_init() local
5088 (void) skd_setup_devid(skdev, devid); in skd_devid_init()
5106 skd_device_t *skdev = arg; in skd_bd_driveinfo() local
5108 drive->d_qsize = (skdev->queue_depth_limit * 4) / 5; in skd_bd_driveinfo()
5115 if (skdev->inquiry_is_valid != 0) { in skd_bd_driveinfo()
5116 drive->d_vendor = skdev->inq_vendor_id; in skd_bd_driveinfo()
5119 drive->d_product = skdev->inq_product_id; in skd_bd_driveinfo()
5122 drive->d_serial = skdev->inq_serial_num; in skd_bd_driveinfo()
5125 drive->d_revision = skdev->inq_product_rev; in skd_bd_driveinfo()
5143 skd_device_t *skdev = arg; in skd_bd_mediainfo() local
5145 media->m_nblks = skdev->Nblocks; in skd_bd_mediainfo()
5168 skd_rw(skd_device_t *skdev, bd_xfer_t *xfer, int dir) in skd_rw() argument
5179 if (skdev->state != SKD_DRVR_STATE_ONLINE) { in skd_rw()
5182 skd_request_fn_not_online(skdev); in skd_rw()
5191 WAITQ_LOCK(skdev); in skd_rw()
5195 skd_queue(skdev, pbuf); in skd_rw()
5196 skdev->ios_queued++; in skd_rw()
5197 WAITQ_UNLOCK(skdev); in skd_rw()
5199 skd_start(skdev); in skd_rw()