Print this page
8628 nvme: use a semaphore to guard submission queue
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Jason King <jason.king@joyent.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>


  92         size_t nq_nentry;
  93 
  94         nvme_dma_t *nq_sqdma;
  95         nvme_sqe_t *nq_sq;
  96         uint_t nq_sqhead;
  97         uint_t nq_sqtail;
  98         uintptr_t nq_sqtdbl;
  99 
 100         nvme_dma_t *nq_cqdma;
 101         nvme_cqe_t *nq_cq;
 102         uint_t nq_cqhead;
 103         uint_t nq_cqtail;
 104         uintptr_t nq_cqhdbl;
 105 
 106         nvme_cmd_t **nq_cmd;
 107         uint16_t nq_next_cmd;
 108         uint_t nq_active_cmds;
 109         int nq_phase;
 110 
 111         kmutex_t nq_mutex;

 112 };
 113 
 114 struct nvme {
 115         dev_info_t *n_dip;
 116         int n_progress;
 117 
 118         caddr_t n_regs;
 119         ddi_acc_handle_t n_regh;
 120 
 121         kmem_cache_t *n_cmd_cache;
 122         kmem_cache_t *n_prp_cache;
 123 
 124         size_t n_inth_sz;
 125         ddi_intr_handle_t *n_inth;
 126         int n_intr_cnt;
 127         uint_t n_intr_pri;
 128         int n_intr_cap;
 129         int n_intr_type;
 130         int n_intr_types;
 131 


 169 
 170         ddi_dma_attr_t n_queue_dma_attr;
 171         ddi_dma_attr_t n_prp_dma_attr;
 172         ddi_dma_attr_t n_sgl_dma_attr;
 173         ddi_device_acc_attr_t n_reg_acc_attr;
 174         ddi_iblock_cookie_t n_fm_ibc;
 175         int n_fm_cap;
 176 
 177         ksema_t n_abort_sema;
 178 
 179         ddi_taskq_t *n_cmd_taskq;
 180 
 181         /* state for devctl minor node */
 182         nvme_minor_state_t n_minor;
 183 
 184         /* errors detected by driver */
 185         uint32_t n_dma_bind_err;
 186         uint32_t n_abort_failed;
 187         uint32_t n_cmd_timeout;
 188         uint32_t n_cmd_aborted;
 189         uint32_t n_async_resubmit_failed;
 190         uint32_t n_wrong_logpage;
 191         uint32_t n_unknown_logpage;
 192         uint32_t n_too_many_cookies;
 193         uint32_t n_admin_queue_full;
 194 
 195         /* errors detected by hardware */
 196         uint32_t n_data_xfr_err;
 197         uint32_t n_internal_err;
 198         uint32_t n_abort_rq_err;
 199         uint32_t n_abort_sq_del;
 200         uint32_t n_nvm_cap_exc;
 201         uint32_t n_nvm_ns_notrdy;
 202         uint32_t n_inv_cq_err;
 203         uint32_t n_inv_qid_err;
 204         uint32_t n_max_qsz_exc;
 205         uint32_t n_inv_int_vect;
 206         uint32_t n_inv_log_page;
 207         uint32_t n_inv_format;
 208         uint32_t n_inv_q_del;
 209         uint32_t n_cnfl_attr;
 210         uint32_t n_inv_prot;
 211         uint32_t n_readonly;
 212 
 213         /* errors reported by asynchronous events */




  92         size_t nq_nentry;
  93 
  94         nvme_dma_t *nq_sqdma;
  95         nvme_sqe_t *nq_sq;
  96         uint_t nq_sqhead;
  97         uint_t nq_sqtail;
  98         uintptr_t nq_sqtdbl;
  99 
 100         nvme_dma_t *nq_cqdma;
 101         nvme_cqe_t *nq_cq;
 102         uint_t nq_cqhead;
 103         uint_t nq_cqtail;
 104         uintptr_t nq_cqhdbl;
 105 
 106         nvme_cmd_t **nq_cmd;
 107         uint16_t nq_next_cmd;
 108         uint_t nq_active_cmds;
 109         int nq_phase;
 110 
 111         kmutex_t nq_mutex;
 112         ksema_t nq_sema;
 113 };
 114 
 115 struct nvme {
 116         dev_info_t *n_dip;
 117         int n_progress;
 118 
 119         caddr_t n_regs;
 120         ddi_acc_handle_t n_regh;
 121 
 122         kmem_cache_t *n_cmd_cache;
 123         kmem_cache_t *n_prp_cache;
 124 
 125         size_t n_inth_sz;
 126         ddi_intr_handle_t *n_inth;
 127         int n_intr_cnt;
 128         uint_t n_intr_pri;
 129         int n_intr_cap;
 130         int n_intr_type;
 131         int n_intr_types;
 132 


 170 
 171         ddi_dma_attr_t n_queue_dma_attr;
 172         ddi_dma_attr_t n_prp_dma_attr;
 173         ddi_dma_attr_t n_sgl_dma_attr;
 174         ddi_device_acc_attr_t n_reg_acc_attr;
 175         ddi_iblock_cookie_t n_fm_ibc;
 176         int n_fm_cap;
 177 
 178         ksema_t n_abort_sema;
 179 
 180         ddi_taskq_t *n_cmd_taskq;
 181 
 182         /* state for devctl minor node */
 183         nvme_minor_state_t n_minor;
 184 
 185         /* errors detected by driver */
 186         uint32_t n_dma_bind_err;
 187         uint32_t n_abort_failed;
 188         uint32_t n_cmd_timeout;
 189         uint32_t n_cmd_aborted;

 190         uint32_t n_wrong_logpage;
 191         uint32_t n_unknown_logpage;
 192         uint32_t n_too_many_cookies;

 193 
 194         /* errors detected by hardware */
 195         uint32_t n_data_xfr_err;
 196         uint32_t n_internal_err;
 197         uint32_t n_abort_rq_err;
 198         uint32_t n_abort_sq_del;
 199         uint32_t n_nvm_cap_exc;
 200         uint32_t n_nvm_ns_notrdy;
 201         uint32_t n_inv_cq_err;
 202         uint32_t n_inv_qid_err;
 203         uint32_t n_max_qsz_exc;
 204         uint32_t n_inv_int_vect;
 205         uint32_t n_inv_log_page;
 206         uint32_t n_inv_format;
 207         uint32_t n_inv_q_del;
 208         uint32_t n_cnfl_attr;
 209         uint32_t n_inv_prot;
 210         uint32_t n_readonly;
 211 
 212         /* errors reported by asynchronous events */