Lines Matching refs:mrioc

16  * @mrioc: Adapter instance reference
23 static int mpi3mr_bsg_pel_abort(struct mpi3mr_ioc *mrioc)
30 if (mrioc->reset_in_progress) {
31 dprint_bsg_err(mrioc, "%s: reset in progress\n", __func__);
34 if (mrioc->stop_bsgs) {
35 dprint_bsg_err(mrioc, "%s: bsgs are blocked\n", __func__);
40 mutex_lock(&mrioc->pel_abort_cmd.mutex);
41 if (mrioc->pel_abort_cmd.state & MPI3MR_CMD_PENDING) {
42 dprint_bsg_err(mrioc, "%s: command is in use\n", __func__);
43 mutex_unlock(&mrioc->pel_abort_cmd.mutex);
46 mrioc->pel_abort_cmd.state = MPI3MR_CMD_PENDING;
47 mrioc->pel_abort_cmd.is_waiting = 1;
48 mrioc->pel_abort_cmd.callback = NULL;
54 mrioc->pel_abort_requested = 1;
55 init_completion(&mrioc->pel_abort_cmd.done);
56 retval = mpi3mr_admin_request_post(mrioc, &pel_abort_req,
60 dprint_bsg_err(mrioc, "%s: admin request post failed\n",
62 mrioc->pel_abort_requested = 0;
66 wait_for_completion_timeout(&mrioc->pel_abort_cmd.done,
68 if (!(mrioc->pel_abort_cmd.state & MPI3MR_CMD_COMPLETE)) {
69 mrioc->pel_abort_cmd.is_waiting = 0;
70 dprint_bsg_err(mrioc, "%s: command timedout\n", __func__);
71 if (!(mrioc->pel_abort_cmd.state & MPI3MR_CMD_RESET))
72 mpi3mr_soft_reset_handler(mrioc,
77 if ((mrioc->pel_abort_cmd.ioc_status & MPI3_IOCSTATUS_STATUS_MASK)
79 dprint_bsg_err(mrioc,
81 __func__, (mrioc->pel_abort_cmd.ioc_status &
83 mrioc->pel_abort_cmd.ioc_loginfo);
87 if (mrioc->pel_abort_cmd.state & MPI3MR_CMD_REPLY_VALID) {
88 pel_reply = (struct mpi3_pel_reply *)mrioc->pel_abort_cmd.reply;
91 dprint_bsg_err(mrioc,
99 mrioc->pel_abort_cmd.state = MPI3MR_CMD_NOTUSED;
100 mutex_unlock(&mrioc->pel_abort_cmd.mutex);
115 struct mpi3mr_ioc *mrioc = NULL;
118 list_for_each_entry(mrioc, &mrioc_list, list) {
119 if (mrioc->id == ioc_number) {
121 return mrioc;
130 * @mrioc: Adapter instance reference
139 static long mpi3mr_enable_logdata(struct mpi3mr_ioc *mrioc,
144 if (!mrioc->logdata_buf) {
145 mrioc->logdata_entry_sz =
146 (mrioc->reply_sz - (sizeof(struct mpi3_event_notification_reply) - 4))
148 mrioc->logdata_buf_idx = 0;
149 mrioc->logdata_buf = kcalloc(MPI3MR_BSG_LOGDATA_MAX_ENTRIES,
150 mrioc->logdata_entry_sz, GFP_KERNEL);
152 if (!mrioc->logdata_buf)
170 * @mrioc: Adapter instance reference
177 static long mpi3mr_get_logdata(struct mpi3mr_ioc *mrioc,
180 u16 num_entries, sz, entry_sz = mrioc->logdata_entry_sz;
182 if ((!mrioc->logdata_buf) || (job->request_payload.payload_len < entry_sz))
193 mrioc->logdata_buf, sz);
201 * @mrioc: Adapter instance reference
211 static long mpi3mr_bsg_pel_enable(struct mpi3mr_ioc *mrioc,
221 dprint_bsg_err(mrioc, "%s: invalid size argument\n",
226 if (mrioc->unrecoverable) {
227 dprint_bsg_err(mrioc, "%s: unrecoverable controller\n",
232 if (mrioc->reset_in_progress) {
233 dprint_bsg_err(mrioc, "%s: reset in progress\n", __func__);
237 if (mrioc->stop_bsgs) {
238 dprint_bsg_err(mrioc, "%s: bsgs are blocked\n", __func__);
247 dprint_bsg_err(mrioc, "%s: out of range class %d sent\n",
252 if (!mrioc->pel_enabled)
255 if ((mrioc->pel_class <= pel_enable.pel_class) &&
256 !((mrioc->pel_locale & pel_enable.pel_locale) ^
261 pel_enable.pel_locale |= mrioc->pel_locale;
263 if (mrioc->pel_class < pel_enable.pel_class)
264 pel_enable.pel_class = mrioc->pel_class;
266 rval = mpi3mr_bsg_pel_abort(mrioc);
268 dprint_bsg_err(mrioc,
277 tmp_class = mrioc->pel_class;
278 tmp_locale = mrioc->pel_locale;
279 mrioc->pel_class = pel_enable.pel_class;
280 mrioc->pel_locale = pel_enable.pel_locale;
281 mrioc->pel_enabled = 1;
282 rval = mpi3mr_pel_get_seqnum_post(mrioc, NULL);
284 mrioc->pel_class = tmp_class;
285 mrioc->pel_locale = tmp_locale;
286 mrioc->pel_enabled = 0;
287 dprint_bsg_err(mrioc,
298 * @mrioc: Adapter instance reference
309 static long mpi3mr_get_all_tgt_info(struct mpi3mr_ioc *mrioc,
320 dprint_bsg_err(mrioc, "%s: invalid size argument\n",
325 spin_lock_irqsave(&mrioc->tgtdev_lock, flags);
326 list_for_each_entry(tgtdev, &mrioc->tgtdev_list, list)
328 spin_unlock_irqrestore(&mrioc->tgtdev_lock, flags);
331 list_empty(&mrioc->tgtdev_list)) {
346 spin_lock_irqsave(&mrioc->tgtdev_lock, flags);
347 list_for_each_entry(tgtdev, &mrioc->tgtdev_list, list) {
360 spin_unlock_irqrestore(&mrioc->tgtdev_lock, flags);
377 * @mrioc: Adapter instance reference
386 static long mpi3mr_get_change_count(struct mpi3mr_ioc *mrioc,
392 chgcnt.change_count = mrioc->change_count;
404 * @mrioc: Adapter instance reference
413 static long mpi3mr_bsg_adp_reset(struct mpi3mr_ioc *mrioc,
422 dprint_bsg_err(mrioc, "%s: invalid size argument\n",
439 dprint_bsg_err(mrioc, "%s: unknown reset_type(%d)\n",
444 rval = mpi3mr_soft_reset_handler(mrioc, MPI3MR_RESET_FROM_APP,
448 dprint_bsg_err(mrioc,
457 * @mrioc: Adapter instance reference
465 static long mpi3mr_bsg_populate_adpinfo(struct mpi3mr_ioc *mrioc,
473 adpinfo.pci_dev_id = mrioc->pdev->device;
474 adpinfo.pci_dev_hw_rev = mrioc->pdev->revision;
475 adpinfo.pci_subsys_dev_id = mrioc->pdev->subsystem_device;
476 adpinfo.pci_subsys_ven_id = mrioc->pdev->subsystem_vendor;
477 adpinfo.pci_bus = mrioc->pdev->bus->number;
478 adpinfo.pci_dev = PCI_SLOT(mrioc->pdev->devfn);
479 adpinfo.pci_func = PCI_FUNC(mrioc->pdev->devfn);
480 adpinfo.pci_seg_id = pci_domain_nr(mrioc->pdev->bus);
483 ioc_state = mpi3mr_get_iocstate(mrioc);
486 else if ((mrioc->reset_in_progress) || (mrioc->stop_bsgs))
493 memcpy((u8 *)&adpinfo.driver_info, (u8 *)&mrioc->driver_info,
518 struct mpi3mr_ioc *mrioc = NULL;
525 mrioc = mpi3mr_bsg_verify_adapter(drvrcmd->mrioc_id);
526 if (!mrioc)
530 rval = mpi3mr_bsg_populate_adpinfo(mrioc, job);
534 if (mutex_lock_interruptible(&mrioc->bsg_cmds.mutex))
539 rval = mpi3mr_bsg_adp_reset(mrioc, job);
542 rval = mpi3mr_get_all_tgt_info(mrioc, job);
545 rval = mpi3mr_get_change_count(mrioc, job);
548 rval = mpi3mr_enable_logdata(mrioc, job);
551 rval = mpi3mr_get_logdata(mrioc, job);
554 rval = mpi3mr_bsg_pel_enable(mrioc, job);
562 mutex_unlock(&mrioc->bsg_cmds.mutex);
652 * @mrioc: Adapter instance reference
662 static int mpi3mr_build_nvme_sgl(struct mpi3mr_ioc *mrioc,
671 u64 sgemod_mask = ((u64)((mrioc->facts.sge_mod_mask) <<
672 mrioc->facts.sge_mod_shift) << 32);
673 u64 sgemod_val = ((u64)(mrioc->facts.sge_mod_value) <<
674 mrioc->facts.sge_mod_shift) << 32;
691 dprint_bsg_err(mrioc,
710 * @mrioc: Adapter instance reference
721 static int mpi3mr_build_nvme_prp(struct mpi3mr_ioc *mrioc,
734 u64 sgemod_mask = ((u64)((mrioc->facts.sge_mod_mask) <<
735 mrioc->facts.sge_mod_shift) << 32);
736 u64 sgemod_val = ((u64)(mrioc->facts.sge_mod_value) <<
737 mrioc->facts.sge_mod_shift) << 32;
741 tgtdev = mpi3mr_get_tgtdev_by_handle(mrioc, dev_handle);
743 dprint_bsg_err(mrioc, "%s: invalid device handle 0x%04x\n",
749 dprint_bsg_err(mrioc,
774 mrioc->prp_sz = 0;
775 mrioc->prp_list_virt = dma_alloc_coherent(&mrioc->pdev->dev,
776 dev_pgsz, &mrioc->prp_list_dma, GFP_KERNEL);
778 if (!mrioc->prp_list_virt)
780 mrioc->prp_sz = dev_pgsz;
796 prp_page = (__le64 *)mrioc->prp_list_virt;
797 prp_page_dma = mrioc->prp_list_dma;
806 dprint_bsg_err(mrioc, "%s: PRP page is not page aligned\n",
822 dprint_bsg_err(mrioc,
839 dprint_bsg_err(mrioc,
867 dprint_bsg_err(mrioc,
888 dprint_bsg_err(mrioc,
906 dprint_bsg_err(mrioc,
931 if (mrioc->prp_list_virt) {
932 dma_free_coherent(&mrioc->pdev->dev, mrioc->prp_sz,
933 mrioc->prp_list_virt, mrioc->prp_list_dma);
934 mrioc->prp_list_virt = NULL;
961 struct mpi3mr_ioc *mrioc = NULL;
986 mrioc = mpi3mr_bsg_verify_adapter(karg->mrioc_id);
987 if (!mrioc)
1031 dprint_bsg_err(mrioc, "%s: data_out buffer length mismatch\n",
1037 dprint_bsg_err(mrioc, "%s: data_in buffer length mismatch\n",
1097 dprint_bsg_err(mrioc, "%s: invalid MPI message size\n",
1109 dprint_bsg_err(mrioc, "%s: invalid buffer entries passed\n",
1123 dprint_bsg_err(mrioc,
1131 dprint_bsg_err(mrioc,
1138 dprint_bsg_err(mrioc,
1158 drv_buf_iter->kern_buf = dma_alloc_coherent(&mrioc->pdev->dev,
1180 if (mutex_lock_interruptible(&mrioc->bsg_cmds.mutex)) {
1184 if (mrioc->bsg_cmds.state & MPI3MR_CMD_PENDING) {
1186 dprint_bsg_err(mrioc, "%s: command is in use\n", __func__);
1187 mutex_unlock(&mrioc->bsg_cmds.mutex);
1190 if (mrioc->unrecoverable) {
1191 dprint_bsg_err(mrioc, "%s: unrecoverable controller\n",
1194 mutex_unlock(&mrioc->bsg_cmds.mutex);
1197 if (mrioc->reset_in_progress) {
1198 dprint_bsg_err(mrioc, "%s: reset in progress\n", __func__);
1200 mutex_unlock(&mrioc->bsg_cmds.mutex);
1203 if (mrioc->stop_bsgs) {
1204 dprint_bsg_err(mrioc, "%s: bsgs are blocked\n", __func__);
1206 mutex_unlock(&mrioc->bsg_cmds.mutex);
1214 if (mpi3mr_build_nvme_prp(mrioc,
1218 mutex_unlock(&mrioc->bsg_cmds.mutex);
1223 if (mpi3mr_build_nvme_sgl(mrioc,
1227 mutex_unlock(&mrioc->bsg_cmds.mutex);
1231 dprint_bsg_err(mrioc,
1234 mutex_unlock(&mrioc->bsg_cmds.mutex);
1252 tgtdev = mpi3mr_get_tgtdev_by_handle(mrioc, dev_handle);
1261 mrioc->bsg_cmds.state = MPI3MR_CMD_PENDING;
1262 mrioc->bsg_cmds.is_waiting = 1;
1263 mrioc->bsg_cmds.callback = NULL;
1264 mrioc->bsg_cmds.is_sense = 0;
1265 mrioc->bsg_cmds.sensebuf = sense_buff_k;
1266 memset(mrioc->bsg_cmds.reply, 0, mrioc->reply_sz);
1268 if (mrioc->logging_level & MPI3_DEBUG_BSG_INFO) {
1269 dprint_bsg_info(mrioc,
1280 init_completion(&mrioc->bsg_cmds.done);
1281 rval = mpi3mr_admin_request_post(mrioc, mpi_req,
1286 mrioc->bsg_cmds.is_waiting = 0;
1287 dprint_bsg_err(mrioc,
1292 wait_for_completion_timeout(&mrioc->bsg_cmds.done,
1296 if (!(mrioc->bsg_cmds.state & MPI3MR_CMD_COMPLETE)) {
1297 mrioc->bsg_cmds.is_waiting = 0;
1299 if (mrioc->bsg_cmds.state & MPI3MR_CMD_RESET)
1301 dprint_bsg_err(mrioc,
1304 if (mrioc->logging_level & MPI3_DEBUG_BSG_ERROR) {
1317 mpi3mr_issue_tm(mrioc,
1321 &mrioc->host_tm_cmds, &resp_code, NULL);
1322 if (!(mrioc->bsg_cmds.state & MPI3MR_CMD_COMPLETE) &&
1323 !(mrioc->bsg_cmds.state & MPI3MR_CMD_RESET))
1324 mpi3mr_soft_reset_handler(mrioc,
1328 dprint_bsg_info(mrioc, "%s: bsg request is completed\n", __func__);
1330 if (mrioc->prp_list_virt) {
1331 dma_free_coherent(&mrioc->pdev->dev, mrioc->prp_sz,
1332 mrioc->prp_list_virt, mrioc->prp_list_dma);
1333 mrioc->prp_list_virt = NULL;
1336 if ((mrioc->bsg_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK)
1338 dprint_bsg_info(mrioc,
1341 (mrioc->bsg_cmds.ioc_status & MPI3_IOCSTATUS_STATUS_MASK),
1342 mrioc->bsg_cmds.ioc_loginfo);
1349 mrioc->reply_sz);
1356 if (mrioc->bsg_cmds.state & MPI3MR_CMD_REPLY_VALID) {
1360 mrioc->bsg_cmds.reply, mrioc->reply_sz);
1366 status_desc->ioc_status = mrioc->bsg_cmds.ioc_status;
1367 status_desc->ioc_log_info = mrioc->bsg_cmds.ioc_loginfo;
1374 if (erb_offset != 0xFF && mrioc->bsg_cmds.sensebuf &&
1375 mrioc->bsg_cmds.is_sense) {
1400 mrioc->bsg_cmds.is_sense = 0;
1401 mrioc->bsg_cmds.sensebuf = NULL;
1402 mrioc->bsg_cmds.state = MPI3MR_CMD_NOTUSED;
1403 mutex_unlock(&mrioc->bsg_cmds.mutex);
1413 dma_free_coherent(&mrioc->pdev->dev,
1426 * @mrioc: Adapter instance reference
1437 void mpi3mr_app_save_logdata(struct mpi3mr_ioc *mrioc, char *event_data,
1440 u32 index = mrioc->logdata_buf_idx, sz;
1443 if (!(mrioc->logdata_buf))
1447 (mrioc->logdata_buf + (index * mrioc->logdata_entry_sz));
1449 sz = min(mrioc->logdata_entry_sz, event_data_size);
1451 mrioc->logdata_buf_idx =
1491 * @mrioc: Adapter instance reference
1498 void mpi3mr_bsg_exit(struct mpi3mr_ioc *mrioc)
1500 struct device *bsg_dev = &mrioc->bsg_dev;
1501 if (!mrioc->bsg_queue)
1504 bsg_remove_queue(mrioc->bsg_queue);
1505 mrioc->bsg_queue = NULL;
1526 * @mrioc: Adapter instance reference
1533 void mpi3mr_bsg_init(struct mpi3mr_ioc *mrioc)
1535 struct device *bsg_dev = &mrioc->bsg_dev;
1536 struct device *parent = &mrioc->shost->shost_gendev;
1543 dev_set_name(bsg_dev, "mpi3mrctl%u", mrioc->id);
1546 ioc_err(mrioc, "%s: bsg device add failed\n",
1552 mrioc->bsg_queue = bsg_setup_queue(bsg_dev, dev_name(bsg_dev),
1554 if (IS_ERR(mrioc->bsg_queue)) {
1555 ioc_err(mrioc, "%s: bsg registration failed\n",
1562 blk_queue_max_segments(mrioc->bsg_queue, MPI3MR_MAX_APP_XFER_SEGMENTS);
1563 blk_queue_max_hw_sectors(mrioc->bsg_queue, MPI3MR_MAX_APP_XFER_SECTORS);
1581 struct mpi3mr_ioc *mrioc = shost_priv(shost);
1582 struct mpi3mr_compimg_ver *fwver = &mrioc->facts.fw_ver;
1603 struct mpi3mr_ioc *mrioc = shost_priv(shost);
1605 return sysfs_emit(buf, "%d\n", mrioc->facts.max_reqs);
1622 struct mpi3mr_ioc *mrioc = shost_priv(shost);
1624 return sysfs_emit(buf, "%d\n", mrioc->num_op_req_q);
1641 struct mpi3mr_ioc *mrioc = shost_priv(shost);
1643 return sysfs_emit(buf, "%d\n", mrioc->num_op_reply_q);
1666 struct mpi3mr_ioc *mrioc = shost_priv(shost);
1668 return sysfs_emit(buf, "%08xh\n", mrioc->logging_level);
1690 struct mpi3mr_ioc *mrioc = shost_priv(shost);
1696 mrioc->logging_level = val;
1697 ioc_info(mrioc, "logging_level=%08xh\n", mrioc->logging_level);
1715 struct mpi3mr_ioc *mrioc = shost_priv(shost);
1719 ioc_state = mpi3mr_get_iocstate(mrioc);
1722 else if ((mrioc->reset_in_progress) || (mrioc->stop_bsgs))