Lines Matching refs:mrioc

16  * @mrioc: Adapter instance reference
35 static int mpi3mr_post_transport_req(struct mpi3mr_ioc *mrioc, void *request,
41 mutex_lock(&mrioc->transport_cmds.mutex);
42 if (mrioc->transport_cmds.state & MPI3MR_CMD_PENDING) {
44 ioc_err(mrioc, "sending transport request failed due to command in use\n");
45 mutex_unlock(&mrioc->transport_cmds.mutex);
48 mrioc->transport_cmds.state = MPI3MR_CMD_PENDING;
49 mrioc->transport_cmds.is_waiting = 1;
50 mrioc->transport_cmds.callback = NULL;
51 mrioc->transport_cmds.ioc_status = 0;
52 mrioc->transport_cmds.ioc_loginfo = 0;
54 init_completion(&mrioc->transport_cmds.done);
55 dprint_cfg_info(mrioc, "posting transport request\n");
56 if (mrioc->logging_level & MPI3_DEBUG_TRANSPORT_INFO)
58 retval = mpi3mr_admin_request_post(mrioc, request, request_sz, 1);
60 ioc_err(mrioc, "posting transport request failed\n");
63 wait_for_completion_timeout(&mrioc->transport_cmds.done,
65 if (!(mrioc->transport_cmds.state & MPI3MR_CMD_COMPLETE)) {
66 mpi3mr_check_rh_fault_ioc(mrioc,
68 ioc_err(mrioc, "transport request timed out\n");
72 *ioc_status = mrioc->transport_cmds.ioc_status &
75 dprint_transport_err(mrioc,
77 *ioc_status, mrioc->transport_cmds.ioc_loginfo);
79 if ((reply) && (mrioc->transport_cmds.state & MPI3MR_CMD_REPLY_VALID))
80 memcpy((u8 *)reply, mrioc->transport_cmds.reply, reply_sz);
83 mrioc->transport_cmds.state = MPI3MR_CMD_NOTUSED;
84 mutex_unlock(&mrioc->transport_cmds.mutex);
120 * @mrioc: Adapter instance reference
129 static int mpi3mr_report_manufacture(struct mpi3mr_ioc *mrioc,
149 if (mrioc->reset_in_progress) {
150 ioc_err(mrioc, "%s: host reset in progress!\n", __func__);
154 if (mrioc->pci_err_recovery) {
155 ioc_err(mrioc, "%s: pci error recovery in progress!\n", __func__);
161 data_out = dma_alloc_coherent(&mrioc->pdev->dev,
190 dprint_transport_info(mrioc,
194 rc = mpi3mr_post_transport_req(mrioc, &mpi_request, request_sz,
200 dprint_transport_info(mrioc,
209 dprint_transport_info(mrioc,
234 dma_free_coherent(&mrioc->pdev->dev, data_out_sz + data_in_sz,
242 * @mrioc: Adapter instance reference
253 *mrioc, u16 handle)
258 list_for_each_entry(sas_expander, &mrioc->sas_expander_list, list) {
285 * @mrioc: Adapter instance reference
294 static int mpi3mr_get_sas_address(struct mpi3mr_ioc *mrioc, u16 handle,
303 if ((mpi3mr_cfg_get_dev_pg0(mrioc, &ioc_status, &dev_pg0,
306 ioc_err(mrioc, "%s: device page0 read failed\n", __func__);
311 ioc_err(mrioc, "device page read failed for handle(0x%04x), with ioc_status(0x%04x) failure at %s:%d/%s()!\n",
318 *sas_address = mrioc->sas_hba.sas_address;
323 ioc_err(mrioc, "%s: device_form(%d) is not SAS_SATA\n",
332 * @mrioc: Adapter instance reference
341 static struct mpi3mr_tgt_dev *__mpi3mr_get_tgtdev_by_addr(struct mpi3mr_ioc *mrioc,
346 assert_spin_locked(&mrioc->tgtdev_lock);
348 list_for_each_entry(tgtdev, &mrioc->tgtdev_list, list)
361 * @mrioc: Adapter instance reference
373 static struct mpi3mr_tgt_dev *mpi3mr_get_tgtdev_by_addr(struct mpi3mr_ioc *mrioc,
382 spin_lock_irqsave(&mrioc->tgtdev_lock, flags);
383 tgtdev = __mpi3mr_get_tgtdev_by_addr(mrioc, sas_address, hba_port);
384 spin_unlock_irqrestore(&mrioc->tgtdev_lock, flags);
392 * @mrioc: Adapter instance reference
401 static void mpi3mr_remove_device_by_sas_address(struct mpi3mr_ioc *mrioc,
411 spin_lock_irqsave(&mrioc->tgtdev_lock, flags);
412 tgtdev = __mpi3mr_get_tgtdev_by_addr(mrioc,
421 spin_unlock_irqrestore(&mrioc->tgtdev_lock, flags);
424 mpi3mr_remove_tgtdev_from_host(mrioc, tgtdev);
431 * @mrioc: Adapter instance reference
441 struct mpi3mr_ioc *mrioc, u64 sas_address, struct sas_rphy *rphy)
445 assert_spin_locked(&mrioc->tgtdev_lock);
447 list_for_each_entry(tgtdev, &mrioc->tgtdev_list, list)
460 * @mrioc: Adapter instance reference
468 struct mpi3mr_ioc *mrioc, u64 sas_address,
476 list_for_each_entry(sas_expander, &mrioc->sas_expander_list, list) {
489 * @mrioc: Adapter instance reference
492 * Context: Caller should acquire mrioc->sas_node_lock.
505 struct mpi3mr_ioc *mrioc, u64 sas_address,
509 if (mrioc->sas_hba.sas_address == sas_address)
510 return &mrioc->sas_hba;
511 return mpi3mr_expander_find_by_sas_address(mrioc, sas_address,
517 * @mrioc: Adapter instance reference
522 static int mpi3mr_parent_present(struct mpi3mr_ioc *mrioc, struct sas_phy *phy)
527 spin_lock_irqsave(&mrioc->sas_node_lock, flags);
528 if (__mpi3mr_sas_node_find_by_sas_address(mrioc,
531 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
534 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
590 * @mrioc: Adapter instance reference
597 static void mpi3mr_delete_sas_phy(struct mpi3mr_ioc *mrioc,
622 * @mrioc: Adapter instance reference
629 static void mpi3mr_add_sas_phy(struct mpi3mr_ioc *mrioc,
653 * @mrioc: Adapter instance reference
662 static void mpi3mr_add_phy_to_an_existing_port(struct mpi3mr_ioc *mrioc,
687 mpi3mr_add_sas_phy(mrioc, mr_sas_port, mr_sas_phy, mr_sas_node->host_node);
694 * @mrioc: Adapter instance reference
699 static void mpi3mr_delete_sas_port(struct mpi3mr_ioc *mrioc,
712 mpi3mr_remove_device_by_sas_address(mrioc, sas_address,
717 mpi3mr_expander_remove(mrioc, sas_address, hba_port);
722 * @mrioc: Adapter instance reference
728 static void mpi3mr_del_phy_from_an_existing_port(struct mpi3mr_ioc *mrioc,
744 !mrioc->reset_in_progress)
745 mpi3mr_delete_sas_port(mrioc, mr_sas_port);
747 mpi3mr_delete_sas_phy(mrioc, mr_sas_port,
756 * @mrioc: Adapter instance reference
767 static void mpi3mr_sas_port_sanity_check(struct mpi3mr_ioc *mrioc,
778 mpi3mr_del_phy_from_an_existing_port(mrioc,
785 * @mrioc: Adapter instance reference
793 static int mpi3mr_set_identify(struct mpi3mr_ioc *mrioc, u16 handle,
802 if (mrioc->reset_in_progress) {
803 ioc_err(mrioc, "%s: host reset in progress!\n", __func__);
807 if (mrioc->pci_err_recovery) {
808 ioc_err(mrioc, "%s: pci error recovery in progress!\n",
813 if ((mpi3mr_cfg_get_dev_pg0(mrioc, &ioc_status, &device_pg0,
815 ioc_err(mrioc, "%s: device page0 read failed\n", __func__);
820 ioc_err(mrioc, "device page read failed for handle(0x%04x), with ioc_status(0x%04x) failure at %s:%d/%s()!\n",
872 * @mrioc: Adapter instance reference
879 static int mpi3mr_add_host_phy(struct mpi3mr_ioc *mrioc,
890 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
894 if ((mpi3mr_set_identify(mrioc, mr_sas_phy->handle,
896 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
904 mpi3mr_set_identify(mrioc, mr_sas_phy->attached_handle,
922 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
927 if ((mrioc->logging_level & MPI3_DEBUG_TRANSPORT_INFO))
942 * @mrioc: Adapter instance reference
949 static int mpi3mr_add_expander_phy(struct mpi3mr_ioc *mrioc,
960 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
964 if ((mpi3mr_set_identify(mrioc, mr_sas_phy->handle,
966 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
975 mpi3mr_set_identify(mrioc, mr_sas_phy->attached_handle,
993 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
998 if ((mrioc->logging_level & MPI3_DEBUG_TRANSPORT_INFO))
1013 * @mrioc: Adapter instance reference
1019 mpi3mr_alloc_hba_port(struct mpi3mr_ioc *mrioc, u16 port_id)
1028 ioc_info(mrioc, "hba_port entry: %p, port: %d is added to hba_port list\n",
1030 if (mrioc->reset_in_progress ||
1031 mrioc->pci_err_recovery)
1033 list_add_tail(&hba_port->list, &mrioc->hba_port_table_list);
1039 * @mrioc: Adapter instance reference
1045 struct mpi3mr_hba_port *mpi3mr_get_hba_port_by_id(struct mpi3mr_ioc *mrioc,
1051 &mrioc->hba_port_table_list, list) {
1064 * @mrioc: Adapter instance reference
1073 void mpi3mr_update_links(struct mpi3mr_ioc *mrioc,
1081 if (mrioc->reset_in_progress || mrioc->pci_err_recovery)
1084 spin_lock_irqsave(&mrioc->sas_node_lock, flags);
1085 mr_sas_node = __mpi3mr_sas_node_find_by_sas_address(mrioc,
1088 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
1094 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
1096 mpi3mr_set_identify(mrioc, handle,
1098 mpi3mr_add_phy_to_an_existing_port(mrioc, mr_sas_node,
1109 if ((mrioc->logging_level & MPI3_DEBUG_TRANSPORT_INFO))
1121 * @mrioc: Adapter instance reference
1130 void mpi3mr_sas_host_refresh(struct mpi3mr_ioc *mrioc)
1137 dprint_transport_info(mrioc,
1139 (unsigned long long)mrioc->sas_hba.sas_address);
1142 (mrioc->sas_hba.num_phys *
1147 if (mpi3mr_cfg_get_sas_io_unit_pg0(mrioc, sas_io_unit_pg0, sz)) {
1148 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
1153 mrioc->sas_hba.handle = 0;
1154 for (i = 0; i < mrioc->sas_hba.num_phys; i++) {
1161 if (!mrioc->sas_hba.handle)
1162 mrioc->sas_hba.handle = le16_to_cpu(
1165 if (!(mpi3mr_get_hba_port_by_id(mrioc, port_id)))
1166 if (!mpi3mr_alloc_hba_port(mrioc, port_id))
1169 mrioc->sas_hba.phy[i].handle = mrioc->sas_hba.handle;
1174 mrioc->sas_hba.phy[i].hba_port =
1175 mpi3mr_get_hba_port_by_id(mrioc, port_id);
1176 mpi3mr_update_links(mrioc, mrioc->sas_hba.sas_address,
1178 mrioc->sas_hba.phy[i].hba_port);
1186 * @mrioc: Adapter instance reference
1195 void mpi3mr_sas_host_add(struct mpi3mr_ioc *mrioc)
1211 if (mpi3mr_cfg_get_sas_io_unit_pg0(mrioc, sas_io_unit_pg0, sz)) {
1212 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
1219 mrioc->sas_hba.host_node = 1;
1220 INIT_LIST_HEAD(&mrioc->sas_hba.sas_port_list);
1221 mrioc->sas_hba.parent_dev = &mrioc->shost->shost_gendev;
1222 mrioc->sas_hba.phy = kcalloc(num_phys,
1224 if (!mrioc->sas_hba.phy)
1227 mrioc->sas_hba.num_phys = num_phys;
1235 if (mpi3mr_cfg_get_sas_io_unit_pg0(mrioc, sas_io_unit_pg0, sz)) {
1236 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
1241 mrioc->sas_hba.handle = 0;
1242 for (i = 0; i < mrioc->sas_hba.num_phys; i++) {
1247 if (mpi3mr_cfg_get_sas_phy_pg0(mrioc, &ioc_status, &phy_pg0,
1250 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
1255 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
1260 if (!mrioc->sas_hba.handle)
1261 mrioc->sas_hba.handle = le16_to_cpu(
1265 if (!(mpi3mr_get_hba_port_by_id(mrioc, port_id)))
1266 if (!mpi3mr_alloc_hba_port(mrioc, port_id))
1269 mrioc->sas_hba.phy[i].handle = mrioc->sas_hba.handle;
1270 mrioc->sas_hba.phy[i].phy_id = i;
1271 mrioc->sas_hba.phy[i].hba_port =
1272 mpi3mr_get_hba_port_by_id(mrioc, port_id);
1273 mpi3mr_add_host_phy(mrioc, &mrioc->sas_hba.phy[i],
1274 phy_pg0, mrioc->sas_hba.parent_dev);
1276 if ((mpi3mr_cfg_get_dev_pg0(mrioc, &ioc_status, &dev_pg0,
1278 mrioc->sas_hba.handle))) {
1279 ioc_err(mrioc, "%s: device page0 read failed\n", __func__);
1283 ioc_err(mrioc, "device page read failed for handle(0x%04x), with ioc_status(0x%04x) failure at %s:%d/%s()!\n",
1284 mrioc->sas_hba.handle, ioc_status, __FILE__, __LINE__,
1288 mrioc->sas_hba.enclosure_handle =
1291 mrioc->sas_hba.sas_address =
1293 ioc_info(mrioc,
1295 mrioc->sas_hba.handle,
1296 (unsigned long long) mrioc->sas_hba.sas_address,
1297 mrioc->sas_hba.num_phys);
1299 if (mrioc->sas_hba.enclosure_handle) {
1300 if (!(mpi3mr_cfg_get_enclosure_pg0(mrioc, &ioc_status,
1303 mrioc->sas_hba.enclosure_handle)) &&
1305 mrioc->sas_hba.enclosure_logical_id =
1315 * @mrioc: Adapter instance reference
1327 static struct mpi3mr_sas_port *mpi3mr_sas_port_add(struct mpi3mr_ioc *mrioc,
1340 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
1351 spin_lock_irqsave(&mrioc->sas_node_lock, flags);
1352 mr_sas_node = __mpi3mr_sas_node_find_by_sas_address(mrioc,
1354 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
1357 ioc_err(mrioc, "%s:could not find parent sas_address(0x%016llx)!\n",
1362 if ((mpi3mr_set_identify(mrioc, handle,
1364 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
1370 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
1376 mpi3mr_sas_port_sanity_check(mrioc, mr_sas_node,
1381 ioc_info(mrioc, "max port count %u could be too high\n",
1391 ioc_warn(mrioc, "skipping port %u, max allowed value is %zu\n",
1403 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
1412 tgtdev = mpi3mr_get_tgtdev_by_addr(mrioc,
1417 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
1425 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
1432 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
1439 if ((mrioc->logging_level & MPI3_DEBUG_TRANSPORT_INFO))
1460 if (mrioc->current_event)
1461 mrioc->current_event->pending_at_sml = 1;
1464 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
1479 spin_lock_irqsave(&mrioc->sas_node_lock, flags);
1481 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
1483 if (mrioc->current_event) {
1484 mrioc->current_event->pending_at_sml = 0;
1485 if (mrioc->current_event->discard)
1486 mpi3mr_print_device_event_notice(mrioc, true);
1494 mpi3mr_report_manufacture(mrioc,
1510 * @mrioc: Adapter instance reference
1520 static void mpi3mr_sas_port_remove(struct mpi3mr_ioc *mrioc, u64 sas_address,
1534 spin_lock_irqsave(&mrioc->sas_node_lock, flags);
1535 mr_sas_node = __mpi3mr_sas_node_find_by_sas_address(mrioc,
1538 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
1554 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
1560 &mrioc->hba_port_table_list, list) {
1563 ioc_info(mrioc,
1579 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
1581 if (mrioc->current_event)
1582 mrioc->current_event->pending_at_sml = 1;
1586 if ((!mrioc->stop_drv_processing) &&
1587 (mrioc->logging_level & MPI3_DEBUG_TRANSPORT_INFO))
1594 if (!mrioc->stop_drv_processing)
1599 if (!mrioc->stop_drv_processing)
1601 ioc_info(mrioc, "%s: removed sas_address(0x%016llx)\n",
1604 if (mrioc->current_event) {
1605 mrioc->current_event->pending_at_sml = 0;
1606 if (mrioc->current_event->discard)
1607 mpi3mr_print_device_event_notice(mrioc, false);
1633 * @mrioc: Adapter instance reference
1644 mpi3mr_update_mr_sas_port(struct mpi3mr_ioc *mrioc, struct host_port *h_port,
1675 mr_sas_phy = &mrioc->sas_hba.phy[i];
1677 mpi3mr_del_phy_from_an_existing_port(mrioc,
1678 &mrioc->sas_hba, mr_sas_phy);
1679 mpi3mr_add_phy_to_an_existing_port(mrioc,
1680 &mrioc->sas_hba, mr_sas_phy,
1687 mr_sas_phy = &mrioc->sas_hba.phy[i];
1689 mpi3mr_del_phy_from_an_existing_port(mrioc,
1690 &mrioc->sas_hba, mr_sas_phy);
1696 * @mrioc: Adapter instance reference
1706 mpi3mr_refresh_sas_ports(struct mpi3mr_ioc *mrioc)
1717 (mrioc->sas_hba.num_phys *
1726 if (mpi3mr_cfg_get_sas_io_unit_pg0(mrioc, sas_io_unit_pg0, sz)) {
1727 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
1733 for (i = 0; i < mrioc->sas_hba.num_phys; i++) {
1748 if ((mpi3mr_cfg_get_dev_pg0(mrioc, &ioc_status, &dev_pg0,
1751 dprint_reset(mrioc,
1757 dprint_reset(mrioc,
1778 if (mrioc->logging_level & MPI3_DEBUG_RESET) {
1779 ioc_info(mrioc, "Host port details before reset\n");
1780 list_for_each_entry(mr_sas_port, &mrioc->sas_hba.sas_port_list,
1782 ioc_info(mrioc,
1789 ioc_info(mrioc, "Host port details after reset\n");
1791 ioc_info(mrioc,
1799 list_for_each_entry(mr_sas_port, &mrioc->sas_hba.sas_port_list,
1808 list_for_each_entry(mr_sas_port, &mrioc->sas_hba.sas_port_list,
1815 mpi3mr_update_mr_sas_port(mrioc, &h_port[i], mr_sas_port);
1826 list_for_each_entry(mr_sas_port, &mrioc->sas_hba.sas_port_list,
1833 mpi3mr_update_mr_sas_port(mrioc, &h_port[i], mr_sas_port);
1844 list_for_each_entry(mr_sas_port, &mrioc->sas_hba.sas_port_list,
1850 mpi3mr_update_mr_sas_port(mrioc, &h_port[i], mr_sas_port);
1861 * @mrioc: Adapter instance reference
1870 mpi3mr_refresh_expanders(struct mpi3mr_ioc *mrioc)
1880 spin_lock_irqsave(&mrioc->sas_node_lock, flags);
1881 list_for_each_entry(sas_expander, &mrioc->sas_expander_list, list) {
1884 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
1892 if ((mpi3mr_cfg_get_sas_exp_pg0(mrioc, &ioc_status, &expander_pg0,
1895 dprint_reset(mrioc,
1902 dprint_reset(mrioc,
1910 hba_port = mpi3mr_get_hba_port_by_id(mrioc, expander_pg0.io_unit_port);
1913 mpi3mr_sas_host_refresh(mrioc);
1914 mpi3mr_expander_add(mrioc, handle);
1918 spin_lock_irqsave(&mrioc->sas_node_lock, flags);
1920 mpi3mr_expander_find_by_sas_address(mrioc,
1922 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
1925 mpi3mr_sas_host_refresh(mrioc);
1926 mpi3mr_expander_add(mrioc, handle);
1945 spin_lock_irqsave(&mrioc->sas_node_lock, flags);
1947 &mrioc->sas_expander_list, list) {
1949 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
1950 mpi3mr_expander_node_remove(mrioc, sas_expander);
1951 spin_lock_irqsave(&mrioc->sas_node_lock, flags);
1954 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
1959 * @mrioc: Adapter instance reference
1967 static void mpi3mr_expander_node_add(struct mpi3mr_ioc *mrioc,
1972 spin_lock_irqsave(&mrioc->sas_node_lock, flags);
1973 list_add_tail(&sas_expander->list, &mrioc->sas_expander_list);
1974 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
1979 * @mrioc: Adapter instance reference
1988 int mpi3mr_expander_add(struct mpi3mr_ioc *mrioc, u16 handle)
2007 if (mrioc->reset_in_progress || mrioc->pci_err_recovery)
2010 if ((mpi3mr_cfg_get_sas_exp_pg0(mrioc, &ioc_status, &expander_pg0,
2012 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2018 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2024 if (mpi3mr_get_sas_address(mrioc, parent_handle, &sas_address_parent)
2026 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2032 hba_port = mpi3mr_get_hba_port_by_id(mrioc, port_id);
2034 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2039 if (sas_address_parent != mrioc->sas_hba.sas_address) {
2040 spin_lock_irqsave(&mrioc->sas_node_lock, flags);
2042 mpi3mr_expander_find_by_sas_address(mrioc,
2044 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
2046 rc = mpi3mr_expander_add(mrioc, parent_handle);
2059 if (mpi3mr_cfg_get_sas_exp_pg1(mrioc,
2064 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2070 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2082 mpi3mr_update_links(mrioc, sas_address_parent,
2088 spin_lock_irqsave(&mrioc->sas_node_lock, flags);
2090 sas_expander = mpi3mr_expander_find_by_sas_address(mrioc,
2092 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
2108 ioc_info(mrioc,
2125 mr_sas_port = mpi3mr_sas_port_add(mrioc, handle, sas_address_parent,
2128 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2139 if (mpi3mr_cfg_get_sas_exp_pg1(mrioc, &ioc_status,
2143 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2149 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2159 if ((mpi3mr_add_expander_phy(mrioc, &sas_expander->phy[i],
2161 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2170 mpi3mr_enclosure_find_by_handle(mrioc,
2177 mpi3mr_expander_node_add(mrioc, sas_expander);
2183 mpi3mr_sas_port_remove(mrioc,
2193 * @mrioc: Adapter instance reference
2203 void mpi3mr_expander_node_remove(struct mpi3mr_ioc *mrioc,
2213 if (mrioc->reset_in_progress || mrioc->pci_err_recovery)
2217 mpi3mr_remove_device_by_sas_address(mrioc,
2224 mpi3mr_expander_remove(mrioc,
2230 mpi3mr_sas_port_remove(mrioc, sas_expander->sas_address,
2233 ioc_info(mrioc, "expander_remove: handle(0x%04x), sas_addr(0x%016llx), port:%d\n",
2237 spin_lock_irqsave(&mrioc->sas_node_lock, flags);
2239 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
2247 * @mrioc: Adapter instance reference
2252 * mrioc->sas_expander_list and removes it from the SAS TL by
2257 void mpi3mr_expander_remove(struct mpi3mr_ioc *mrioc, u64 sas_address,
2263 if (mrioc->reset_in_progress || mrioc->pci_err_recovery)
2269 spin_lock_irqsave(&mrioc->sas_node_lock, flags);
2270 sas_expander = mpi3mr_expander_find_by_sas_address(mrioc, sas_address,
2272 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
2274 mpi3mr_expander_node_remove(mrioc, sas_expander);
2280 * @mrioc: Adapter instance reference
2291 static u8 mpi3mr_get_sas_negotiated_logical_linkrate(struct mpi3mr_ioc *mrioc,
2304 if (mpi3mr_cfg_get_sas_exp_pg1(mrioc, &ioc_status,
2308 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2313 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2322 if (mpi3mr_cfg_get_sas_phy_pg0(mrioc, &ioc_status, &phy_pg0,
2325 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2330 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2343 * @mrioc: Adapter instance reference
2351 int mpi3mr_report_tgtdev_to_sas_transport(struct mpi3mr_ioc *mrioc,
2361 !mrioc->sas_transport_enabled)
2365 if (!mrioc->sas_hba.num_phys)
2366 mpi3mr_sas_host_add(mrioc);
2368 mpi3mr_sas_host_refresh(mrioc);
2370 if (mpi3mr_get_sas_address(mrioc, tgtdev->parent_handle,
2372 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2381 hba_port = mpi3mr_get_hba_port_by_id(mrioc, port_id);
2383 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2389 link_rate = mpi3mr_get_sas_negotiated_logical_linkrate(mrioc, tgtdev);
2391 mpi3mr_update_links(mrioc, sas_address_parent, tgtdev->dev_handle,
2395 if (!mpi3mr_sas_port_add(mrioc, tgtdev->dev_handle,
2398 } else if ((!tgtdev->starget) && (!mrioc->is_driver_loading)) {
2399 mpi3mr_sas_port_remove(mrioc, sas_address,
2412 * @mrioc: Adapter instance reference
2419 void mpi3mr_remove_tgtdev_from_sas_transport(struct mpi3mr_ioc *mrioc,
2426 !mrioc->sas_transport_enabled)
2432 mpi3mr_sas_port_remove(mrioc, sas_address, sas_address_parent,
2458 * @mrioc: Adapter instance reference
2466 static u8 mpi3mr_get_port_id_by_rphy(struct mpi3mr_ioc *mrioc, struct sas_rphy *rphy)
2478 spin_lock_irqsave(&mrioc->sas_node_lock, flags);
2479 list_for_each_entry(sas_expander, &mrioc->sas_expander_list,
2486 spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
2488 spin_lock_irqsave(&mrioc->tgtdev_lock, flags);
2490 tgtdev = __mpi3mr_get_tgtdev_by_addr_and_rphy(mrioc,
2497 spin_unlock_irqrestore(&mrioc->tgtdev_lock, flags);
2546 * @mrioc: Adapter instance reference
2552 static int mpi3mr_get_expander_phy_error_log(struct mpi3mr_ioc *mrioc,
2569 if (mrioc->reset_in_progress) {
2570 ioc_err(mrioc, "%s: host reset in progress!\n", __func__);
2574 if (mrioc->pci_err_recovery) {
2575 ioc_err(mrioc, "%s: pci error recovery in progress!\n", __func__);
2582 data_out = dma_alloc_coherent(&mrioc->pdev->dev, sz, &data_out_dma,
2614 dprint_transport_info(mrioc,
2618 if (mpi3mr_post_transport_req(mrioc, &mpi_request, request_sz,
2622 dprint_transport_info(mrioc,
2627 dprint_transport_info(mrioc,
2635 dprint_transport_info(mrioc,
2652 dma_free_coherent(&mrioc->pdev->dev, sz, data_out,
2669 struct mpi3mr_ioc *mrioc = phy_to_mrioc(phy);
2674 rc = mpi3mr_parent_present(mrioc, phy);
2678 if (phy->identify.sas_address != mrioc->sas_hba.sas_address)
2679 return mpi3mr_get_expander_phy_error_log(mrioc, phy);
2683 if ((mpi3mr_cfg_get_sas_phy_pg1(mrioc, &ioc_status, &phy_pg1,
2686 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2692 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
2720 struct mpi3mr_ioc *mrioc = rphy_to_mrioc(rphy);
2725 spin_lock_irqsave(&mrioc->tgtdev_lock, flags);
2726 tgtdev = __mpi3mr_get_tgtdev_by_addr_and_rphy(mrioc,
2737 spin_unlock_irqrestore(&mrioc->tgtdev_lock, flags);
2754 struct mpi3mr_ioc *mrioc = rphy_to_mrioc(rphy);
2759 spin_lock_irqsave(&mrioc->tgtdev_lock, flags);
2760 tgtdev = __mpi3mr_get_tgtdev_by_addr_and_rphy(mrioc,
2767 spin_unlock_irqrestore(&mrioc->tgtdev_lock, flags);
2803 * @mrioc: Adapter instance reference
2813 mpi3mr_expander_phy_control(struct mpi3mr_ioc *mrioc,
2833 if (mrioc->reset_in_progress) {
2834 ioc_err(mrioc, "%s: host reset in progress!\n", __func__);
2838 if (mrioc->pci_err_recovery) {
2839 ioc_err(mrioc, "%s: pci error recovery in progress!\n",
2847 data_out = dma_alloc_coherent(&mrioc->pdev->dev, sz, &data_out_dma,
2885 dprint_transport_info(mrioc,
2890 if (mpi3mr_post_transport_req(mrioc, &mpi_request, request_sz,
2894 dprint_transport_info(mrioc,
2899 dprint_transport_info(mrioc,
2906 dprint_transport_info(mrioc,
2913 dma_free_coherent(&mrioc->pdev->dev, sz, data_out,
2929 struct mpi3mr_ioc *mrioc = phy_to_mrioc(phy);
2937 rc = mpi3mr_parent_present(mrioc, phy);
2942 if (phy->identify.sas_address != mrioc->sas_hba.sas_address)
2943 return mpi3mr_expander_phy_control(mrioc, phy,
2958 dprint_transport_info(mrioc,
2963 if (mpi3mr_post_transport_req(mrioc, &mpi_request, request_sz,
2969 dprint_transport_info(mrioc,
2989 struct mpi3mr_ioc *mrioc = phy_to_mrioc(phy);
2996 rc = mpi3mr_parent_present(mrioc, phy);
3001 if (phy->identify.sas_address != mrioc->sas_hba.sas_address)
3002 return mpi3mr_expander_phy_control(mrioc, phy,
3008 (mrioc->sas_hba.num_phys *
3015 if (mpi3mr_cfg_get_sas_io_unit_pg0(mrioc, sas_io_unit_pg0, sz)) {
3016 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
3023 for (i = 0, discovery_active = 0; i < mrioc->sas_hba.num_phys ; i++) {
3026 ioc_err(mrioc,
3042 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
3050 (mrioc->sas_hba.num_phys *
3058 if (mpi3mr_cfg_get_sas_io_unit_pg1(mrioc, sas_io_unit_pg1, sz)) {
3059 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
3072 mpi3mr_cfg_set_sas_io_unit_pg1(mrioc, sas_io_unit_pg1, sz);
3098 struct mpi3mr_ioc *mrioc = phy_to_mrioc(phy);
3104 rc = mpi3mr_parent_present(mrioc, phy);
3119 if (phy->identify.sas_address != mrioc->sas_hba.sas_address) {
3122 return mpi3mr_expander_phy_control(mrioc, phy,
3128 (mrioc->sas_hba.num_phys *
3136 if (mpi3mr_cfg_get_sas_io_unit_pg1(mrioc, sas_io_unit_pg1, sz)) {
3137 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
3146 if (mpi3mr_cfg_set_sas_io_unit_pg1(mrioc, sas_io_unit_pg1, sz)) {
3147 ioc_err(mrioc, "failure at %s:%d/%s()!\n",
3157 if (!mpi3mr_cfg_get_sas_phy_pg0(mrioc, &ioc_status, &phy_pg0,
3244 struct mpi3mr_ioc *mrioc = shost_priv(shost);
3261 if (mrioc->reset_in_progress) {
3262 ioc_err(mrioc, "%s: host reset in progress!\n", __func__);
3267 if (mrioc->pci_err_recovery) {
3268 ioc_err(mrioc, "%s: pci error recovery in progress!\n", __func__);
3273 rc = mpi3mr_map_smp_buffer(&mrioc->pdev->dev, &job->request_payload,
3283 rc = mpi3mr_map_smp_buffer(&mrioc->pdev->dev, &job->reply_payload,
3292 mpi_request.io_unit_port = (u8) mpi3mr_get_port_id_by_rphy(mrioc, rphy);
3295 cpu_to_le64(mrioc->sas_hba.sas_address));
3302 dprint_transport_info(mrioc, "sending SMP request\n");
3304 rc = mpi3mr_post_transport_req(mrioc, &mpi_request, request_sz,
3310 dprint_transport_info(mrioc,
3313 dprint_transport_info(mrioc,
3328 mpi3mr_unmap_smp_buffer(&mrioc->pdev->dev, &job->reply_payload,
3331 mpi3mr_unmap_smp_buffer(&mrioc->pdev->dev, &job->request_payload,