Lines Matching refs:mrioc
14 * @mrioc: Adapter instance reference
33 static int mpi3mr_post_transport_req(struct mpi3mr_ioc *mrioc, void *request,
39 mutex_lock(&mrioc->transport_cmds.mutex);
40 if (mrioc->transport_cmds.state & MPI3MR_CMD_PENDING) {
42 ioc_err(mrioc, "sending transport request failed due to command in use\n");
43 mutex_unlock(&mrioc->transport_cmds.mutex);
46 mrioc->transport_cmds.state = MPI3MR_CMD_PENDING;
47 mrioc->transport_cmds.is_waiting = 1;
48 mrioc->transport_cmds.callback = NULL;
49 mrioc->transport_cmds.ioc_status = 0;
50 mrioc->transport_cmds.ioc_loginfo = 0;
52 init_completion(&mrioc->transport_cmds.done);
53 dprint_cfg_info(mrioc, "posting transport request\n");
54 if (mrioc->logging_level & MPI3_DEBUG_TRANSPORT_INFO)
56 retval = mpi3mr_admin_request_post(mrioc, request, request_sz, 1);
58 ioc_err(mrioc, "posting transport request failed\n");
61 wait_for_completion_timeout(&mrioc->transport_cmds.done,
63 if (!(mrioc->transport_cmds.state & MPI3MR_CMD_COMPLETE)) {
64 mpi3mr_check_rh_fault_ioc(mrioc,
66 ioc_err(mrioc, "transport request timed out\n");
70 *ioc_status = mrioc->transport_cmds.ioc_status &
73 dprint_transport_err(mrioc,
75 *ioc_status, mrioc->transport_cmds.ioc_loginfo);
77 if ((reply) && (mrioc->transport_cmds.state & MPI3MR_CMD_REPLY_VALID))
78 memcpy((u8 *)reply, mrioc->transport_cmds.reply, reply_sz);
81 mrioc->transport_cmds.state = MPI3MR_CMD_NOTUSED;
82 mutex_unlock(&mrioc->transport_cmds.mutex);
118 * @mrioc: Adapter instance reference
127 static int mpi3mr_report_manufacture(struct mpi3mr_ioc *mrioc,
147 if (mrioc->reset_in_progress) {
148 ioc_err(mrioc, "%s: host reset in progress!\n", __func__);
154 data_out = dma_alloc_coherent(&mrioc->pdev->dev,
183 dprint_transport_info(mrioc,
187 rc = mpi3mr_post_transport_req(mrioc, &mpi_request, request_sz,
193 dprint_transport_info(mrioc,
202 dprint_transport_info(mrioc,
231 dma_free_coherent(&mrioc->pdev->dev, data_out_sz + data_in_sz,
239 * @mrioc: Adapter instance reference
250 *mrioc, u16 handle)
255 list_for_each_entry(sas_expander, &mrioc->sas_expander_list, list) {
282 * @mrioc: Adapter instance reference
291 static int mpi3mr_get_sas_address(struct mpi3mr_ioc *mrioc, u16 handle,
300 if ((mpi3mr_cfg_get_dev_pg0(mrioc, &ioc_status, &dev_pg0,
303 ioc_err(mrioc, "%s: device page0 read failed\n", __func__);
308 ioc_err(mrioc, "device page read failed for handle(0x%04x), with ioc_status(0x%04x) failure at %s:%d/%s()!\n",
315 *sas_address = mrioc->sas_hba.sas_address;
320 ioc_err(mrioc, "%s: device_form(%d) is not SAS_SATA\n",
329 * @mrioc: Adapter instance reference
338 static struct mpi3mr_tgt_dev *__mpi3mr_get_tgtdev_by_addr(struct mpi3mr_ioc *mrioc,
343 assert_spin_locked(&mrioc->tgtdev_lock);
345 list_for_each_entry(tgtdev, &mrioc->tgtdev_list, list)
358 * @mrioc: Adapter instance reference
370 static struct mpi3mr_tgt_dev *mpi3mr_get_tgtdev_by_addr(struct mpi3mr_ioc *mrioc,
379 spin_lock_irqsave(&mrioc->tgtdev_lock, flags);
380 tgtdev = __mpi3mr_get_tgtdev_by_addr(mrioc, sas_address, hba_port);
381 spin_unlock_irqrestore(&mrioc->tgtdev_lock, flags);
389 * @mrioc: Adapter instance reference
398 static void mpi3mr_remove_device_by_sas_address(struct mpi3mr_ioc *mrioc,
408 spin_lock_irqsave(&mrioc->tgtdev_lock, flags);
409 tgtdev = __mpi3mr_get_tgtdev_by_addr(mrioc,
418 spin_unlock_irqrestore(&mrioc->tgtdev_lock, flags);
421 mpi3mr_remove_tgtdev_from_host(mrioc, tgtdev);
428 * @mrioc: Adapter instance reference
438 struct mpi3mr_ioc *mrioc, u64 sas_address, struct sas_rphy *rphy)
442 assert_spin_locked(&mrioc->tgtdev_lock);
444 list_for_each_entry(tgtdev, &mrioc->tgtdev_list, list)
457 * @mrioc: Adapter instance reference
465 struct mpi3mr_ioc *mrioc, u64 sas_address,
473 list_for_each_entry(sas_expander, &mrioc->sas_expander_list, list) {
486 * @mrioc: Adapter instance reference
489 * Context: Caller should acquire mrioc->sas_node_lock.
502 struct mpi3mr_ioc *mrioc, u64 sas_address,
506 if (mrioc->sas_hba.sas_address == sas_address)
507 return &mrioc->sas_hba;
508 return mpi3mr_expander_find_by_sas_address(mrioc, sas_address,
514 * @mrioc: Adapter instance reference
519 static int mpi3mr_parent_present(struct mpi3mr_ioc *mrioc, struct sas_phy *phy)
524 spin_lock_irqsave(&mrioc->sas_node_lock, flags);
525 if (__mpi3mr_sas_node_find_by_sas_address(mrioc,
528 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
531 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
587 * @mrioc: Adapter instance reference
593 static void mpi3mr_delete_sas_phy(struct mpi3mr_ioc *mrioc,
614 * @mrioc: Adapter instance reference
620 static void mpi3mr_add_sas_phy(struct mpi3mr_ioc *mrioc,
641 * @mrioc: Adapter instance reference
650 static void mpi3mr_add_phy_to_an_existing_port(struct mpi3mr_ioc *mrioc,
675 mpi3mr_add_sas_phy(mrioc, mr_sas_port, mr_sas_phy);
682 * @mrioc: Adapter instance reference
687 static void mpi3mr_delete_sas_port(struct mpi3mr_ioc *mrioc,
700 mpi3mr_remove_device_by_sas_address(mrioc, sas_address,
705 mpi3mr_expander_remove(mrioc, sas_address, hba_port);
710 * @mrioc: Adapter instance reference
716 static void mpi3mr_del_phy_from_an_existing_port(struct mpi3mr_ioc *mrioc,
732 !mrioc->reset_in_progress)
733 mpi3mr_delete_sas_port(mrioc, mr_sas_port);
735 mpi3mr_delete_sas_phy(mrioc, mr_sas_port,
744 * @mrioc: Adapter instance reference
755 static void mpi3mr_sas_port_sanity_check(struct mpi3mr_ioc *mrioc,
766 mpi3mr_del_phy_from_an_existing_port(mrioc,
773 * @mrioc: Adapter instance reference
781 static int mpi3mr_set_identify(struct mpi3mr_ioc *mrioc, u16 handle,
790 if (mrioc->reset_in_progress) {
791 ioc_err(mrioc, "%s: host reset in progress!\n", __func__);
795 if ((mpi3mr_cfg_get_dev_pg0(mrioc, &ioc_status, &device_pg0,
797 ioc_err(mrioc, "%s: device page0 read failed\n", __func__);
802 ioc_err(mrioc, "device page read failed for handle(0x%04x), with ioc_status(0x%04x) failure at %s:%d/%s()!\n",
854 * @mrioc: Adapter instance reference
861 static int mpi3mr_add_host_phy(struct mpi3mr_ioc *mrioc,
872 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
876 if ((mpi3mr_set_identify(mrioc, mr_sas_phy->handle,
878 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
886 mpi3mr_set_identify(mrioc, mr_sas_phy->attached_handle,
904 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
909 if ((mrioc->logging_level & MPI3_DEBUG_TRANSPORT_INFO))
924 * @mrioc: Adapter instance reference
931 static int mpi3mr_add_expander_phy(struct mpi3mr_ioc *mrioc,
942 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
946 if ((mpi3mr_set_identify(mrioc, mr_sas_phy->handle,
948 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
957 mpi3mr_set_identify(mrioc, mr_sas_phy->attached_handle,
975 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
980 if ((mrioc->logging_level & MPI3_DEBUG_TRANSPORT_INFO))
995 * @mrioc: Adapter instance reference
1001 mpi3mr_alloc_hba_port(struct mpi3mr_ioc *mrioc, u16 port_id)
1010 ioc_info(mrioc, "hba_port entry: %p, port: %d is added to hba_port list\n",
1012 list_add_tail(&hba_port->list, &mrioc->hba_port_table_list);
1018 * @mrioc: Adapter instance reference
1024 struct mpi3mr_hba_port *mpi3mr_get_hba_port_by_id(struct mpi3mr_ioc *mrioc,
1030 &mrioc->hba_port_table_list, list) {
1043 * @mrioc: Adapter instance reference
1052 void mpi3mr_update_links(struct mpi3mr_ioc *mrioc,
1060 if (mrioc->reset_in_progress)
1063 spin_lock_irqsave(&mrioc->sas_node_lock, flags);
1064 mr_sas_node = __mpi3mr_sas_node_find_by_sas_address(mrioc,
1067 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
1073 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
1075 mpi3mr_set_identify(mrioc, handle,
1077 mpi3mr_add_phy_to_an_existing_port(mrioc, mr_sas_node,
1088 if ((mrioc->logging_level & MPI3_DEBUG_TRANSPORT_INFO))
1100 * @mrioc: Adapter instance reference
1109 void mpi3mr_sas_host_refresh(struct mpi3mr_ioc *mrioc)
1116 dprint_transport_info(mrioc,
1118 (unsigned long long)mrioc->sas_hba.sas_address);
1121 (mrioc->sas_hba.num_phys *
1126 if (mpi3mr_cfg_get_sas_io_unit_pg0(mrioc, sas_io_unit_pg0, sz)) {
1127 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
1132 mrioc->sas_hba.handle = 0;
1133 for (i = 0; i < mrioc->sas_hba.num_phys; i++) {
1140 if (!mrioc->sas_hba.handle)
1141 mrioc->sas_hba.handle = le16_to_cpu(
1144 if (!(mpi3mr_get_hba_port_by_id(mrioc, port_id)))
1145 if (!mpi3mr_alloc_hba_port(mrioc, port_id))
1148 mrioc->sas_hba.phy[i].handle = mrioc->sas_hba.handle;
1153 mrioc->sas_hba.phy[i].hba_port =
1154 mpi3mr_get_hba_port_by_id(mrioc, port_id);
1155 mpi3mr_update_links(mrioc, mrioc->sas_hba.sas_address,
1157 mrioc->sas_hba.phy[i].hba_port);
1165 * @mrioc: Adapter instance reference
1174 void mpi3mr_sas_host_add(struct mpi3mr_ioc *mrioc)
1190 if (mpi3mr_cfg_get_sas_io_unit_pg0(mrioc, sas_io_unit_pg0, sz)) {
1191 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
1198 mrioc->sas_hba.host_node = 1;
1199 INIT_LIST_HEAD(&mrioc->sas_hba.sas_port_list);
1200 mrioc->sas_hba.parent_dev = &mrioc->shost->shost_gendev;
1201 mrioc->sas_hba.phy = kcalloc(num_phys,
1203 if (!mrioc->sas_hba.phy)
1206 mrioc->sas_hba.num_phys = num_phys;
1214 if (mpi3mr_cfg_get_sas_io_unit_pg0(mrioc, sas_io_unit_pg0, sz)) {
1215 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
1220 mrioc->sas_hba.handle = 0;
1221 for (i = 0; i < mrioc->sas_hba.num_phys; i++) {
1226 if (mpi3mr_cfg_get_sas_phy_pg0(mrioc, &ioc_status, &phy_pg0,
1229 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
1234 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
1239 if (!mrioc->sas_hba.handle)
1240 mrioc->sas_hba.handle = le16_to_cpu(
1244 if (!(mpi3mr_get_hba_port_by_id(mrioc, port_id)))
1245 if (!mpi3mr_alloc_hba_port(mrioc, port_id))
1248 mrioc->sas_hba.phy[i].handle = mrioc->sas_hba.handle;
1249 mrioc->sas_hba.phy[i].phy_id = i;
1250 mrioc->sas_hba.phy[i].hba_port =
1251 mpi3mr_get_hba_port_by_id(mrioc, port_id);
1252 mpi3mr_add_host_phy(mrioc, &mrioc->sas_hba.phy[i],
1253 phy_pg0, mrioc->sas_hba.parent_dev);
1255 if ((mpi3mr_cfg_get_dev_pg0(mrioc, &ioc_status, &dev_pg0,
1257 mrioc->sas_hba.handle))) {
1258 ioc_err(mrioc, "%s: device page0 read failed\n", __func__);
1262 ioc_err(mrioc, "device page read failed for handle(0x%04x), with ioc_status(0x%04x) failure at %s:%d/%s()!\n",
1263 mrioc->sas_hba.handle, ioc_status, __FILE__, __LINE__,
1267 mrioc->sas_hba.enclosure_handle =
1270 mrioc->sas_hba.sas_address =
1272 ioc_info(mrioc,
1274 mrioc->sas_hba.handle,
1275 (unsigned long long) mrioc->sas_hba.sas_address,
1276 mrioc->sas_hba.num_phys);
1278 if (mrioc->sas_hba.enclosure_handle) {
1279 if (!(mpi3mr_cfg_get_enclosure_pg0(mrioc, &ioc_status,
1282 mrioc->sas_hba.enclosure_handle)) &&
1284 mrioc->sas_hba.enclosure_logical_id =
1294 * @mrioc: Adapter instance reference
1306 static struct mpi3mr_sas_port *mpi3mr_sas_port_add(struct mpi3mr_ioc *mrioc,
1319 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
1330 spin_lock_irqsave(&mrioc->sas_node_lock, flags);
1331 mr_sas_node = __mpi3mr_sas_node_find_by_sas_address(mrioc,
1333 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
1336 ioc_err(mrioc, "%s:could not find parent sas_address(0x%016llx)!\n",
1341 if ((mpi3mr_set_identify(mrioc, handle,
1343 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
1349 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
1355 mpi3mr_sas_port_sanity_check(mrioc, mr_sas_node,
1370 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
1378 tgtdev = mpi3mr_get_tgtdev_by_addr(mrioc,
1383 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
1391 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
1398 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
1405 if ((mrioc->logging_level & MPI3_DEBUG_TRANSPORT_INFO))
1426 if (mrioc->current_event)
1427 mrioc->current_event->pending_at_sml = 1;
1430 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
1445 spin_lock_irqsave(&mrioc->sas_node_lock, flags);
1447 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
1449 if (mrioc->current_event) {
1450 mrioc->current_event->pending_at_sml = 0;
1451 if (mrioc->current_event->discard)
1452 mpi3mr_print_device_event_notice(mrioc, true);
1460 mpi3mr_report_manufacture(mrioc,
1476 * @mrioc: Adapter instance reference
1486 static void mpi3mr_sas_port_remove(struct mpi3mr_ioc *mrioc, u64 sas_address,
1500 spin_lock_irqsave(&mrioc->sas_node_lock, flags);
1501 mr_sas_node = __mpi3mr_sas_node_find_by_sas_address(mrioc,
1504 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
1520 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
1526 &mrioc->hba_port_table_list, list) {
1529 ioc_info(mrioc,
1545 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
1547 if (mrioc->current_event)
1548 mrioc->current_event->pending_at_sml = 1;
1552 if ((!mrioc->stop_drv_processing) &&
1553 (mrioc->logging_level & MPI3_DEBUG_TRANSPORT_INFO))
1560 if (!mrioc->stop_drv_processing)
1565 if (!mrioc->stop_drv_processing)
1567 ioc_info(mrioc, "%s: removed sas_address(0x%016llx)\n",
1570 if (mrioc->current_event) {
1571 mrioc->current_event->pending_at_sml = 0;
1572 if (mrioc->current_event->discard)
1573 mpi3mr_print_device_event_notice(mrioc, false);
1599 * @mrioc: Adapter instance reference
1610 mpi3mr_update_mr_sas_port(struct mpi3mr_ioc *mrioc, struct host_port *h_port,
1641 mr_sas_phy = &mrioc->sas_hba.phy[i];
1643 mpi3mr_del_phy_from_an_existing_port(mrioc,
1644 &mrioc->sas_hba, mr_sas_phy);
1645 mpi3mr_add_phy_to_an_existing_port(mrioc,
1646 &mrioc->sas_hba, mr_sas_phy,
1653 mr_sas_phy = &mrioc->sas_hba.phy[i];
1655 mpi3mr_del_phy_from_an_existing_port(mrioc,
1656 &mrioc->sas_hba, mr_sas_phy);
1662 * @mrioc: Adapter instance reference
1672 mpi3mr_refresh_sas_ports(struct mpi3mr_ioc *mrioc)
1683 (mrioc->sas_hba.num_phys *
1688 if (mpi3mr_cfg_get_sas_io_unit_pg0(mrioc, sas_io_unit_pg0, sz)) {
1689 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
1695 for (i = 0; i < mrioc->sas_hba.num_phys; i++) {
1710 if ((mpi3mr_cfg_get_dev_pg0(mrioc, &ioc_status, &dev_pg0,
1713 dprint_reset(mrioc,
1719 dprint_reset(mrioc,
1740 if (mrioc->logging_level & MPI3_DEBUG_RESET) {
1741 ioc_info(mrioc, "Host port details before reset\n");
1742 list_for_each_entry(mr_sas_port, &mrioc->sas_hba.sas_port_list,
1744 ioc_info(mrioc,
1751 ioc_info(mrioc, "Host port details after reset\n");
1753 ioc_info(mrioc,
1761 list_for_each_entry(mr_sas_port, &mrioc->sas_hba.sas_port_list,
1770 list_for_each_entry(mr_sas_port, &mrioc->sas_hba.sas_port_list,
1777 mpi3mr_update_mr_sas_port(mrioc, &h_port[i], mr_sas_port);
1788 list_for_each_entry(mr_sas_port, &mrioc->sas_hba.sas_port_list,
1795 mpi3mr_update_mr_sas_port(mrioc, &h_port[i], mr_sas_port);
1806 list_for_each_entry(mr_sas_port, &mrioc->sas_hba.sas_port_list,
1812 mpi3mr_update_mr_sas_port(mrioc, &h_port[i], mr_sas_port);
1822 * @mrioc: Adapter instance reference
1831 mpi3mr_refresh_expanders(struct mpi3mr_ioc *mrioc)
1841 spin_lock_irqsave(&mrioc->sas_node_lock, flags);
1842 list_for_each_entry(sas_expander, &mrioc->sas_expander_list, list) {
1845 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
1853 if ((mpi3mr_cfg_get_sas_exp_pg0(mrioc, &ioc_status, &expander_pg0,
1856 dprint_reset(mrioc,
1863 dprint_reset(mrioc,
1871 hba_port = mpi3mr_get_hba_port_by_id(mrioc, expander_pg0.io_unit_port);
1874 mpi3mr_sas_host_refresh(mrioc);
1875 mpi3mr_expander_add(mrioc, handle);
1879 spin_lock_irqsave(&mrioc->sas_node_lock, flags);
1881 mpi3mr_expander_find_by_sas_address(mrioc,
1883 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
1886 mpi3mr_sas_host_refresh(mrioc);
1887 mpi3mr_expander_add(mrioc, handle);
1906 spin_lock_irqsave(&mrioc->sas_node_lock, flags);
1908 &mrioc->sas_expander_list, list) {
1910 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
1911 mpi3mr_expander_node_remove(mrioc, sas_expander);
1912 spin_lock_irqsave(&mrioc->sas_node_lock, flags);
1915 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
1920 * @mrioc: Adapter instance reference
1928 static void mpi3mr_expander_node_add(struct mpi3mr_ioc *mrioc,
1933 spin_lock_irqsave(&mrioc->sas_node_lock, flags);
1934 list_add_tail(&sas_expander->list, &mrioc->sas_expander_list);
1935 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
1940 * @mrioc: Adapter instance reference
1949 int mpi3mr_expander_add(struct mpi3mr_ioc *mrioc, u16 handle)
1968 if (mrioc->reset_in_progress)
1971 if ((mpi3mr_cfg_get_sas_exp_pg0(mrioc, &ioc_status, &expander_pg0,
1973 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
1979 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
1985 if (mpi3mr_get_sas_address(mrioc, parent_handle, &sas_address_parent)
1987 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
1993 hba_port = mpi3mr_get_hba_port_by_id(mrioc, port_id);
1995 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2000 if (sas_address_parent != mrioc->sas_hba.sas_address) {
2001 spin_lock_irqsave(&mrioc->sas_node_lock, flags);
2003 mpi3mr_expander_find_by_sas_address(mrioc,
2005 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
2007 rc = mpi3mr_expander_add(mrioc, parent_handle);
2020 if (mpi3mr_cfg_get_sas_exp_pg1(mrioc,
2025 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2031 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2043 mpi3mr_update_links(mrioc, sas_address_parent,
2049 spin_lock_irqsave(&mrioc->sas_node_lock, flags);
2051 sas_expander = mpi3mr_expander_find_by_sas_address(mrioc,
2053 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
2069 ioc_info(mrioc,
2086 mr_sas_port = mpi3mr_sas_port_add(mrioc, handle, sas_address_parent,
2089 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2100 if (mpi3mr_cfg_get_sas_exp_pg1(mrioc, &ioc_status,
2104 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2110 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2120 if ((mpi3mr_add_expander_phy(mrioc, &sas_expander->phy[i],
2122 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2131 mpi3mr_enclosure_find_by_handle(mrioc,
2138 mpi3mr_expander_node_add(mrioc, sas_expander);
2144 mpi3mr_sas_port_remove(mrioc,
2154 * @mrioc: Adapter instance reference
2164 void mpi3mr_expander_node_remove(struct mpi3mr_ioc *mrioc,
2174 if (mrioc->reset_in_progress)
2178 mpi3mr_remove_device_by_sas_address(mrioc,
2185 mpi3mr_expander_remove(mrioc,
2191 mpi3mr_sas_port_remove(mrioc, sas_expander->sas_address,
2194 ioc_info(mrioc, "expander_remove: handle(0x%04x), sas_addr(0x%016llx), port:%d\n",
2198 spin_lock_irqsave(&mrioc->sas_node_lock, flags);
2200 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
2208 * @mrioc: Adapter instance reference
2213 * mrioc->sas_expander_list and removes it from the SAS TL by
2218 void mpi3mr_expander_remove(struct mpi3mr_ioc *mrioc, u64 sas_address,
2224 if (mrioc->reset_in_progress)
2230 spin_lock_irqsave(&mrioc->sas_node_lock, flags);
2231 sas_expander = mpi3mr_expander_find_by_sas_address(mrioc, sas_address,
2233 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
2235 mpi3mr_expander_node_remove(mrioc, sas_expander);
2241 * @mrioc: Adapter instance reference
2252 static u8 mpi3mr_get_sas_negotiated_logical_linkrate(struct mpi3mr_ioc *mrioc,
2265 if (mpi3mr_cfg_get_sas_exp_pg1(mrioc, &ioc_status,
2269 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2274 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2283 if (mpi3mr_cfg_get_sas_phy_pg0(mrioc, &ioc_status, &phy_pg0,
2286 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2291 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2304 * @mrioc: Adapter instance reference
2312 int mpi3mr_report_tgtdev_to_sas_transport(struct mpi3mr_ioc *mrioc,
2322 !mrioc->sas_transport_enabled)
2326 if (!mrioc->sas_hba.num_phys)
2327 mpi3mr_sas_host_add(mrioc);
2329 mpi3mr_sas_host_refresh(mrioc);
2331 if (mpi3mr_get_sas_address(mrioc, tgtdev->parent_handle,
2333 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2342 hba_port = mpi3mr_get_hba_port_by_id(mrioc, port_id);
2344 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2350 link_rate = mpi3mr_get_sas_negotiated_logical_linkrate(mrioc, tgtdev);
2352 mpi3mr_update_links(mrioc, sas_address_parent, tgtdev->dev_handle,
2356 if (!mpi3mr_sas_port_add(mrioc, tgtdev->dev_handle,
2359 } else if ((!tgtdev->starget) && (!mrioc->is_driver_loading)) {
2360 mpi3mr_sas_port_remove(mrioc, sas_address,
2373 * @mrioc: Adapter instance reference
2380 void mpi3mr_remove_tgtdev_from_sas_transport(struct mpi3mr_ioc *mrioc,
2387 !mrioc->sas_transport_enabled)
2393 mpi3mr_sas_port_remove(mrioc, sas_address, sas_address_parent,
2419 * @mrioc: Adapter instance reference
2427 static u8 mpi3mr_get_port_id_by_rphy(struct mpi3mr_ioc *mrioc, struct sas_rphy *rphy)
2439 spin_lock_irqsave(&mrioc->sas_node_lock, flags);
2440 list_for_each_entry(sas_expander, &mrioc->sas_expander_list,
2447 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
2449 spin_lock_irqsave(&mrioc->tgtdev_lock, flags);
2451 tgtdev = __mpi3mr_get_tgtdev_by_addr_and_rphy(mrioc,
2458 spin_unlock_irqrestore(&mrioc->tgtdev_lock, flags);
2507 * @mrioc: Adapter instance reference
2513 static int mpi3mr_get_expander_phy_error_log(struct mpi3mr_ioc *mrioc,
2530 if (mrioc->reset_in_progress) {
2531 ioc_err(mrioc, "%s: host reset in progress!\n", __func__);
2538 data_out = dma_alloc_coherent(&mrioc->pdev->dev, sz, &data_out_dma,
2570 dprint_transport_info(mrioc,
2574 if (mpi3mr_post_transport_req(mrioc, &mpi_request, request_sz,
2578 dprint_transport_info(mrioc,
2583 dprint_transport_info(mrioc,
2591 dprint_transport_info(mrioc,
2608 dma_free_coherent(&mrioc->pdev->dev, sz, data_out,
2625 struct mpi3mr_ioc *mrioc = phy_to_mrioc(phy);
2630 rc = mpi3mr_parent_present(mrioc, phy);
2634 if (phy->identify.sas_address != mrioc->sas_hba.sas_address)
2635 return mpi3mr_get_expander_phy_error_log(mrioc, phy);
2639 if ((mpi3mr_cfg_get_sas_phy_pg1(mrioc, &ioc_status, &phy_pg1,
2642 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2648 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2676 struct mpi3mr_ioc *mrioc = rphy_to_mrioc(rphy);
2681 spin_lock_irqsave(&mrioc->tgtdev_lock, flags);
2682 tgtdev = __mpi3mr_get_tgtdev_by_addr_and_rphy(mrioc,
2693 spin_unlock_irqrestore(&mrioc->tgtdev_lock, flags);
2710 struct mpi3mr_ioc *mrioc = rphy_to_mrioc(rphy);
2715 spin_lock_irqsave(&mrioc->tgtdev_lock, flags);
2716 tgtdev = __mpi3mr_get_tgtdev_by_addr_and_rphy(mrioc,
2723 spin_unlock_irqrestore(&mrioc->tgtdev_lock, flags);
2759 * @mrioc: Adapter instance reference
2769 mpi3mr_expander_phy_control(struct mpi3mr_ioc *mrioc,
2789 if (mrioc->reset_in_progress) {
2790 ioc_err(mrioc, "%s: host reset in progress!\n", __func__);
2797 data_out = dma_alloc_coherent(&mrioc->pdev->dev, sz, &data_out_dma,
2835 dprint_transport_info(mrioc,
2840 if (mpi3mr_post_transport_req(mrioc, &mpi_request, request_sz,
2844 dprint_transport_info(mrioc,
2849 dprint_transport_info(mrioc,
2856 dprint_transport_info(mrioc,
2863 dma_free_coherent(&mrioc->pdev->dev, sz, data_out,
2879 struct mpi3mr_ioc *mrioc = phy_to_mrioc(phy);
2887 rc = mpi3mr_parent_present(mrioc, phy);
2892 if (phy->identify.sas_address != mrioc->sas_hba.sas_address)
2893 return mpi3mr_expander_phy_control(mrioc, phy,
2908 dprint_transport_info(mrioc,
2913 if (mpi3mr_post_transport_req(mrioc, &mpi_request, request_sz,
2919 dprint_transport_info(mrioc,
2939 struct mpi3mr_ioc *mrioc = phy_to_mrioc(phy);
2946 rc = mpi3mr_parent_present(mrioc, phy);
2951 if (phy->identify.sas_address != mrioc->sas_hba.sas_address)
2952 return mpi3mr_expander_phy_control(mrioc, phy,
2958 (mrioc->sas_hba.num_phys *
2965 if (mpi3mr_cfg_get_sas_io_unit_pg0(mrioc, sas_io_unit_pg0, sz)) {
2966 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2973 for (i = 0, discovery_active = 0; i < mrioc->sas_hba.num_phys ; i++) {
2976 ioc_err(mrioc,
2992 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
3000 (mrioc->sas_hba.num_phys *
3008 if (mpi3mr_cfg_get_sas_io_unit_pg1(mrioc, sas_io_unit_pg1, sz)) {
3009 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
3022 mpi3mr_cfg_set_sas_io_unit_pg1(mrioc, sas_io_unit_pg1, sz);
3048 struct mpi3mr_ioc *mrioc = phy_to_mrioc(phy);
3054 rc = mpi3mr_parent_present(mrioc, phy);
3069 if (phy->identify.sas_address != mrioc->sas_hba.sas_address) {
3072 return mpi3mr_expander_phy_control(mrioc, phy,
3078 (mrioc->sas_hba.num_phys *
3086 if (mpi3mr_cfg_get_sas_io_unit_pg1(mrioc, sas_io_unit_pg1, sz)) {
3087 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
3096 if (mpi3mr_cfg_set_sas_io_unit_pg1(mrioc, sas_io_unit_pg1, sz)) {
3097 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
3107 if (!mpi3mr_cfg_get_sas_phy_pg0(mrioc, &ioc_status, &phy_pg0,
3194 struct mpi3mr_ioc *mrioc = shost_priv(shost);
3211 if (mrioc->reset_in_progress) {
3212 ioc_err(mrioc, "%s: host reset in progress!\n", __func__);
3217 rc = mpi3mr_map_smp_buffer(&mrioc->pdev->dev, &job->request_payload,
3227 rc = mpi3mr_map_smp_buffer(&mrioc->pdev->dev, &job->reply_payload,
3236 mpi_request.io_unit_port = (u8) mpi3mr_get_port_id_by_rphy(mrioc, rphy);
3239 cpu_to_le64(mrioc->sas_hba.sas_address));
3246 dprint_transport_info(mrioc, "sending SMP request\n");
3248 rc = mpi3mr_post_transport_req(mrioc, &mpi_request, request_sz,
3254 dprint_transport_info(mrioc,
3257 dprint_transport_info(mrioc,
3272 mpi3mr_unmap_smp_buffer(&mrioc->pdev->dev, &job->reply_payload,
3275 mpi3mr_unmap_smp_buffer(&mrioc->pdev->dev, &job->request_payload,