hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/scsi/libsas/sas_expander.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0
12 /*
23 * Serial Attached SCSI (SAS) Expander discovery and configuration
34 *
....@@ -5,26 +6,12 @@
56 * Copyright (C) 2005 Luben Tuikov <luben_tuikov@adaptec.com>
67 *
78 * This file is licensed under GPLv2.
8
- *
9
- * This program is free software; you can redistribute it and/or
10
- * modify it under the terms of the GNU General Public License as
11
- * published by the Free Software Foundation; either version 2 of the
12
- * License, or (at your option) any later version.
13
- *
14
- * This program is distributed in the hope that it will be useful, but
15
- * WITHOUT ANY WARRANTY; without even the implied warranty of
16
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17
- * General Public License for more details.
18
- *
19
- * You should have received a copy of the GNU General Public License
20
- * along with this program; if not, write to the Free Software
21
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22
- *
239 */
2410
2511 #include <linux/scatterlist.h>
2612 #include <linux/blkdev.h>
2713 #include <linux/slab.h>
14
+#include <asm/unaligned.h>
2815
2916 #include "sas_internal.h"
3017
....@@ -98,23 +85,23 @@
9885 res = i->dft->lldd_execute_task(task, GFP_KERNEL);
9986
10087 if (res) {
101
- del_timer(&task->slow_task->timer);
102
- SAS_DPRINTK("executing SMP task failed:%d\n", res);
88
+ del_timer_sync(&task->slow_task->timer);
89
+ pr_notice("executing SMP task failed:%d\n", res);
10390 break;
10491 }
10592
10693 wait_for_completion(&task->slow_task->completion);
10794 res = -ECOMM;
10895 if ((task->task_state_flags & SAS_TASK_STATE_ABORTED)) {
109
- SAS_DPRINTK("smp task timed out or aborted\n");
96
+ pr_notice("smp task timed out or aborted\n");
11097 i->dft->lldd_abort_task(task);
11198 if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) {
112
- SAS_DPRINTK("SMP task aborted and not done\n");
99
+ pr_notice("SMP task aborted and not done\n");
113100 break;
114101 }
115102 }
116103 if (task->task_status.resp == SAS_TASK_COMPLETE &&
117
- task->task_status.stat == SAM_STAT_GOOD) {
104
+ task->task_status.stat == SAS_SAM_STAT_GOOD) {
118105 res = 0;
119106 break;
120107 }
....@@ -134,11 +121,11 @@
134121 task->task_status.stat == SAS_DEVICE_UNKNOWN)
135122 break;
136123 else {
137
- SAS_DPRINTK("%s: task to dev %016llx response: 0x%x "
138
- "status 0x%x\n", __func__,
139
- SAS_ADDR(dev->sas_addr),
140
- task->task_status.resp,
141
- task->task_status.stat);
124
+ pr_notice("%s: task to dev %016llx response: 0x%x status 0x%x\n",
125
+ __func__,
126
+ SAS_ADDR(dev->sas_addr),
127
+ task->task_status.resp,
128
+ task->task_status.stat);
142129 sas_free_task(task);
143130 task = NULL;
144131 }
....@@ -347,11 +334,11 @@
347334 if (test_bit(SAS_HA_ATA_EH_ACTIVE, &ha->state))
348335 set_bit(DISCE_REVALIDATE_DOMAIN, &dev->port->disc.pending);
349336
350
- SAS_DPRINTK("%sex %016llx phy%02d:%c:%X attached: %016llx (%s)\n",
351
- test_bit(SAS_HA_ATA_EH_ACTIVE, &ha->state) ? "ata: " : "",
352
- SAS_ADDR(dev->sas_addr), phy->phy_id,
353
- sas_route_char(dev, phy), phy->linkrate,
354
- SAS_ADDR(phy->attached_sas_addr), type);
337
+ pr_debug("%sex %016llx phy%02d:%c:%X attached: %016llx (%s)\n",
338
+ test_bit(SAS_HA_ATA_EH_ACTIVE, &ha->state) ? "ata: " : "",
339
+ SAS_ADDR(dev->sas_addr), phy->phy_id,
340
+ sas_route_char(dev, phy), phy->linkrate,
341
+ SAS_ADDR(phy->attached_sas_addr), type);
355342 }
356343
357344 /* check if we have an existing attached ata device on this expander phy */
....@@ -393,7 +380,7 @@
393380 return res;
394381 dr = &((struct smp_resp *)disc_resp)->disc;
395382 if (memcmp(dev->sas_addr, dr->attached_sas_addr, SAS_ADDR_SIZE) == 0) {
396
- sas_printk("Found loopback topology, just ignore it!\n");
383
+ pr_notice("Found loopback topology, just ignore it!\n");
397384 return 0;
398385 }
399386 sas_set_ex_phy(dev, single, disc_resp);
....@@ -440,7 +427,7 @@
440427 static int sas_expander_discover(struct domain_device *dev)
441428 {
442429 struct expander_device *ex = &dev->ex_dev;
443
- int res = -ENOMEM;
430
+ int res;
444431
445432 ex->ex_phy = kcalloc(ex->num_phys, sizeof(*ex->ex_phy), GFP_KERNEL);
446433 if (!ex->ex_phy)
....@@ -500,12 +487,12 @@
500487 RG_RESP_SIZE);
501488
502489 if (res) {
503
- SAS_DPRINTK("RG to ex %016llx failed:0x%x\n",
504
- SAS_ADDR(dev->sas_addr), res);
490
+ pr_notice("RG to ex %016llx failed:0x%x\n",
491
+ SAS_ADDR(dev->sas_addr), res);
505492 goto out;
506493 } else if (rg_resp->result != SMP_RESP_FUNC_ACC) {
507
- SAS_DPRINTK("RG:ex %016llx returned SMP result:0x%x\n",
508
- SAS_ADDR(dev->sas_addr), rg_resp->result);
494
+ pr_debug("RG:ex %016llx returned SMP result:0x%x\n",
495
+ SAS_ADDR(dev->sas_addr), rg_resp->result);
509496 res = rg_resp->result;
510497 goto out;
511498 }
....@@ -513,8 +500,8 @@
513500 ex_assign_report_general(dev, rg_resp);
514501
515502 if (dev->ex_dev.configuring) {
516
- SAS_DPRINTK("RG: ex %llx self-configuring...\n",
517
- SAS_ADDR(dev->sas_addr));
503
+ pr_debug("RG: ex %016llx self-configuring...\n",
504
+ SAS_ADDR(dev->sas_addr));
518505 schedule_timeout_interruptible(5*HZ);
519506 } else
520507 break;
....@@ -568,12 +555,12 @@
568555
569556 res = smp_execute_task(dev, mi_req, MI_REQ_SIZE, mi_resp,MI_RESP_SIZE);
570557 if (res) {
571
- SAS_DPRINTK("MI: ex %016llx failed:0x%x\n",
572
- SAS_ADDR(dev->sas_addr), res);
558
+ pr_notice("MI: ex %016llx failed:0x%x\n",
559
+ SAS_ADDR(dev->sas_addr), res);
573560 goto out;
574561 } else if (mi_resp[2] != SMP_RESP_FUNC_ACC) {
575
- SAS_DPRINTK("MI ex %016llx returned SMP result:0x%x\n",
576
- SAS_ADDR(dev->sas_addr), mi_resp[2]);
562
+ pr_debug("MI ex %016llx returned SMP result:0x%x\n",
563
+ SAS_ADDR(dev->sas_addr), mi_resp[2]);
577564 goto out;
578565 }
579566
....@@ -696,10 +683,10 @@
696683 if (res)
697684 goto out;
698685
699
- phy->invalid_dword_count = scsi_to_u32(&resp[12]);
700
- phy->running_disparity_error_count = scsi_to_u32(&resp[16]);
701
- phy->loss_of_dword_sync_count = scsi_to_u32(&resp[20]);
702
- phy->phy_reset_problem_count = scsi_to_u32(&resp[24]);
686
+ phy->invalid_dword_count = get_unaligned_be32(&resp[12]);
687
+ phy->running_disparity_error_count = get_unaligned_be32(&resp[16]);
688
+ phy->loss_of_dword_sync_count = get_unaligned_be32(&resp[20]);
689
+ phy->phy_reset_problem_count = get_unaligned_be32(&resp[24]);
703690
704691 out:
705692 kfree(req);
....@@ -825,9 +812,14 @@
825812 #ifdef CONFIG_SCSI_SAS_ATA
826813 if ((phy->attached_tproto & SAS_PROTOCOL_STP) || phy->attached_sata_dev) {
827814 if (child->linkrate > parent->min_linkrate) {
815
+ struct sas_phy *cphy = child->phy;
816
+ enum sas_linkrate min_prate = cphy->minimum_linkrate,
817
+ parent_min_lrate = parent->min_linkrate,
818
+ min_linkrate = (min_prate > parent_min_lrate) ?
819
+ parent_min_lrate : 0;
828820 struct sas_phy_linkrates rates = {
829821 .maximum_linkrate = parent->min_linkrate,
830
- .minimum_linkrate = parent->min_linkrate,
822
+ .minimum_linkrate = min_linkrate,
831823 };
832824 int ret;
833825
....@@ -864,10 +856,9 @@
864856
865857 res = sas_discover_sata(child);
866858 if (res) {
867
- SAS_DPRINTK("sas_discover_sata() for device %16llx at "
868
- "%016llx:0x%x returned 0x%x\n",
869
- SAS_ADDR(child->sas_addr),
870
- SAS_ADDR(parent->sas_addr), phy_id, res);
859
+ pr_notice("sas_discover_sata() for device %16llx at %016llx:%02d returned 0x%x\n",
860
+ SAS_ADDR(child->sas_addr),
861
+ SAS_ADDR(parent->sas_addr), phy_id, res);
871862 goto out_list_del;
872863 }
873864 } else
....@@ -890,16 +881,15 @@
890881
891882 res = sas_discover_end_dev(child);
892883 if (res) {
893
- SAS_DPRINTK("sas_discover_end_dev() for device %16llx "
894
- "at %016llx:0x%x returned 0x%x\n",
895
- SAS_ADDR(child->sas_addr),
896
- SAS_ADDR(parent->sas_addr), phy_id, res);
884
+ pr_notice("sas_discover_end_dev() for device %016llx at %016llx:%02d returned 0x%x\n",
885
+ SAS_ADDR(child->sas_addr),
886
+ SAS_ADDR(parent->sas_addr), phy_id, res);
897887 goto out_list_del;
898888 }
899889 } else {
900
- SAS_DPRINTK("target proto 0x%x at %016llx:0x%x not handled\n",
901
- phy->attached_tproto, SAS_ADDR(parent->sas_addr),
902
- phy_id);
890
+ pr_notice("target proto 0x%x at %016llx:0x%x not handled\n",
891
+ phy->attached_tproto, SAS_ADDR(parent->sas_addr),
892
+ phy_id);
903893 goto out_free;
904894 }
905895
....@@ -956,11 +946,10 @@
956946 int res;
957947
958948 if (phy->routing_attr == DIRECT_ROUTING) {
959
- SAS_DPRINTK("ex %016llx:0x%x:D <--> ex %016llx:0x%x is not "
960
- "allowed\n",
961
- SAS_ADDR(parent->sas_addr), phy_id,
962
- SAS_ADDR(phy->attached_sas_addr),
963
- phy->attached_phy_id);
949
+ pr_warn("ex %016llx:%02d:D <--> ex %016llx:0x%x is not allowed\n",
950
+ SAS_ADDR(parent->sas_addr), phy_id,
951
+ SAS_ADDR(phy->attached_sas_addr),
952
+ phy->attached_phy_id);
964953 return NULL;
965954 }
966955 child = sas_alloc_device();
....@@ -1069,25 +1058,24 @@
10691058 ex_phy->attached_dev_type != SAS_FANOUT_EXPANDER_DEVICE &&
10701059 ex_phy->attached_dev_type != SAS_EDGE_EXPANDER_DEVICE &&
10711060 ex_phy->attached_dev_type != SAS_SATA_PENDING) {
1072
- SAS_DPRINTK("unknown device type(0x%x) attached to ex %016llx "
1073
- "phy 0x%x\n", ex_phy->attached_dev_type,
1074
- SAS_ADDR(dev->sas_addr),
1075
- phy_id);
1061
+ pr_warn("unknown device type(0x%x) attached to ex %016llx phy%02d\n",
1062
+ ex_phy->attached_dev_type,
1063
+ SAS_ADDR(dev->sas_addr),
1064
+ phy_id);
10761065 return 0;
10771066 }
10781067
10791068 res = sas_configure_routing(dev, ex_phy->attached_sas_addr);
10801069 if (res) {
1081
- SAS_DPRINTK("configure routing for dev %016llx "
1082
- "reported 0x%x. Forgotten\n",
1083
- SAS_ADDR(ex_phy->attached_sas_addr), res);
1070
+ pr_notice("configure routing for dev %016llx reported 0x%x. Forgotten\n",
1071
+ SAS_ADDR(ex_phy->attached_sas_addr), res);
10841072 sas_disable_routing(dev, ex_phy->attached_sas_addr);
10851073 return res;
10861074 }
10871075
10881076 if (sas_ex_join_wide_port(dev, phy_id)) {
1089
- SAS_DPRINTK("Attaching ex phy%d to wide port %016llx\n",
1090
- phy_id, SAS_ADDR(ex_phy->attached_sas_addr));
1077
+ pr_debug("Attaching ex phy%02d to wide port %016llx\n",
1078
+ phy_id, SAS_ADDR(ex_phy->attached_sas_addr));
10911079 return res;
10921080 }
10931081
....@@ -1098,18 +1086,17 @@
10981086 break;
10991087 case SAS_FANOUT_EXPANDER_DEVICE:
11001088 if (SAS_ADDR(dev->port->disc.fanout_sas_addr)) {
1101
- SAS_DPRINTK("second fanout expander %016llx phy 0x%x "
1102
- "attached to ex %016llx phy 0x%x\n",
1103
- SAS_ADDR(ex_phy->attached_sas_addr),
1104
- ex_phy->attached_phy_id,
1105
- SAS_ADDR(dev->sas_addr),
1106
- phy_id);
1089
+ pr_debug("second fanout expander %016llx phy%02d attached to ex %016llx phy%02d\n",
1090
+ SAS_ADDR(ex_phy->attached_sas_addr),
1091
+ ex_phy->attached_phy_id,
1092
+ SAS_ADDR(dev->sas_addr),
1093
+ phy_id);
11071094 sas_ex_disable_phy(dev, phy_id);
1108
- break;
1095
+ return res;
11091096 } else
11101097 memcpy(dev->port->disc.fanout_sas_addr,
11111098 ex_phy->attached_sas_addr, SAS_ADDR_SIZE);
1112
- /* fallthrough */
1099
+ fallthrough;
11131100 case SAS_EDGE_EXPANDER_DEVICE:
11141101 child = sas_ex_discover_expander(dev, phy_id);
11151102 break;
....@@ -1117,28 +1104,9 @@
11171104 break;
11181105 }
11191106
1120
- if (child) {
1121
- int i;
1122
-
1123
- for (i = 0; i < ex->num_phys; i++) {
1124
- if (ex->ex_phy[i].phy_state == PHY_VACANT ||
1125
- ex->ex_phy[i].phy_state == PHY_NOT_PRESENT)
1126
- continue;
1127
- /*
1128
- * Due to races, the phy might not get added to the
1129
- * wide port, so we add the phy to the wide port here.
1130
- */
1131
- if (SAS_ADDR(ex->ex_phy[i].attached_sas_addr) ==
1132
- SAS_ADDR(child->sas_addr)) {
1133
- ex->ex_phy[i].phy_state= PHY_DEVICE_DISCOVERED;
1134
- if (sas_ex_join_wide_port(dev, i))
1135
- SAS_DPRINTK("Attaching ex phy%d to wide port %016llx\n",
1136
- i, SAS_ADDR(ex->ex_phy[i].attached_sas_addr));
1137
-
1138
- }
1139
- }
1140
- }
1141
-
1107
+ if (!child)
1108
+ pr_notice("ex %016llx phy%02d failed to discover\n",
1109
+ SAS_ADDR(dev->sas_addr), phy_id);
11421110 return res;
11431111 }
11441112
....@@ -1154,11 +1122,10 @@
11541122 phy->phy_state == PHY_NOT_PRESENT)
11551123 continue;
11561124
1157
- if ((phy->attached_dev_type == SAS_EDGE_EXPANDER_DEVICE ||
1158
- phy->attached_dev_type == SAS_FANOUT_EXPANDER_DEVICE) &&
1125
+ if (dev_is_expander(phy->attached_dev_type) &&
11591126 phy->routing_attr == SUBTRACTIVE_ROUTING) {
11601127
1161
- memcpy(sub_addr, phy->attached_sas_addr,SAS_ADDR_SIZE);
1128
+ memcpy(sub_addr, phy->attached_sas_addr, SAS_ADDR_SIZE);
11621129
11631130 return 1;
11641131 }
....@@ -1170,28 +1137,25 @@
11701137 {
11711138 struct expander_device *ex = &dev->ex_dev;
11721139 struct domain_device *child;
1173
- u8 sub_addr[8] = {0, };
1140
+ u8 sub_addr[SAS_ADDR_SIZE] = {0, };
11741141
11751142 list_for_each_entry(child, &ex->children, siblings) {
1176
- if (child->dev_type != SAS_EDGE_EXPANDER_DEVICE &&
1177
- child->dev_type != SAS_FANOUT_EXPANDER_DEVICE)
1143
+ if (!dev_is_expander(child->dev_type))
11781144 continue;
11791145 if (sub_addr[0] == 0) {
11801146 sas_find_sub_addr(child, sub_addr);
11811147 continue;
11821148 } else {
1183
- u8 s2[8];
1149
+ u8 s2[SAS_ADDR_SIZE];
11841150
11851151 if (sas_find_sub_addr(child, s2) &&
11861152 (SAS_ADDR(sub_addr) != SAS_ADDR(s2))) {
11871153
1188
- SAS_DPRINTK("ex %016llx->%016llx-?->%016llx "
1189
- "diverges from subtractive "
1190
- "boundary %016llx\n",
1191
- SAS_ADDR(dev->sas_addr),
1192
- SAS_ADDR(child->sas_addr),
1193
- SAS_ADDR(s2),
1194
- SAS_ADDR(sub_addr));
1154
+ pr_notice("ex %016llx->%016llx-?->%016llx diverges from subtractive boundary %016llx\n",
1155
+ SAS_ADDR(dev->sas_addr),
1156
+ SAS_ADDR(child->sas_addr),
1157
+ SAS_ADDR(s2),
1158
+ SAS_ADDR(sub_addr));
11951159
11961160 sas_ex_disable_port(child, s2);
11971161 }
....@@ -1261,8 +1225,7 @@
12611225 phy->phy_state == PHY_NOT_PRESENT)
12621226 continue;
12631227
1264
- if ((phy->attached_dev_type == SAS_FANOUT_EXPANDER_DEVICE ||
1265
- phy->attached_dev_type == SAS_EDGE_EXPANDER_DEVICE) &&
1228
+ if (dev_is_expander(phy->attached_dev_type) &&
12661229 phy->routing_attr == SUBTRACTIVE_ROUTING) {
12671230
12681231 if (!sub_sas_addr)
....@@ -1270,12 +1233,10 @@
12701233 else if (SAS_ADDR(sub_sas_addr) !=
12711234 SAS_ADDR(phy->attached_sas_addr)) {
12721235
1273
- SAS_DPRINTK("ex %016llx phy 0x%x "
1274
- "diverges(%016llx) on subtractive "
1275
- "boundary(%016llx). Disabled\n",
1276
- SAS_ADDR(dev->sas_addr), i,
1277
- SAS_ADDR(phy->attached_sas_addr),
1278
- SAS_ADDR(sub_sas_addr));
1236
+ pr_notice("ex %016llx phy%02d diverges(%016llx) on subtractive boundary(%016llx). Disabled\n",
1237
+ SAS_ADDR(dev->sas_addr), i,
1238
+ SAS_ADDR(phy->attached_sas_addr),
1239
+ SAS_ADDR(sub_sas_addr));
12791240 sas_ex_disable_phy(dev, i);
12801241 }
12811242 }
....@@ -1293,19 +1254,17 @@
12931254 };
12941255 struct domain_device *parent = child->parent;
12951256
1296
- sas_printk("%s ex %016llx phy 0x%x <--> %s ex %016llx "
1297
- "phy 0x%x has %c:%c routing link!\n",
1257
+ pr_notice("%s ex %016llx phy%02d <--> %s ex %016llx phy%02d has %c:%c routing link!\n",
1258
+ ex_type[parent->dev_type],
1259
+ SAS_ADDR(parent->sas_addr),
1260
+ parent_phy->phy_id,
12981261
1299
- ex_type[parent->dev_type],
1300
- SAS_ADDR(parent->sas_addr),
1301
- parent_phy->phy_id,
1262
+ ex_type[child->dev_type],
1263
+ SAS_ADDR(child->sas_addr),
1264
+ child_phy->phy_id,
13021265
1303
- ex_type[child->dev_type],
1304
- SAS_ADDR(child->sas_addr),
1305
- child_phy->phy_id,
1306
-
1307
- sas_route_char(parent, parent_phy),
1308
- sas_route_char(child, child_phy));
1266
+ sas_route_char(parent, parent_phy),
1267
+ sas_route_char(child, child_phy));
13091268 }
13101269
13111270 static int sas_check_eeds(struct domain_device *child,
....@@ -1317,13 +1276,12 @@
13171276
13181277 if (SAS_ADDR(parent->port->disc.fanout_sas_addr) != 0) {
13191278 res = -ENODEV;
1320
- SAS_DPRINTK("edge ex %016llx phy S:0x%x <--> edge ex %016llx "
1321
- "phy S:0x%x, while there is a fanout ex %016llx\n",
1322
- SAS_ADDR(parent->sas_addr),
1323
- parent_phy->phy_id,
1324
- SAS_ADDR(child->sas_addr),
1325
- child_phy->phy_id,
1326
- SAS_ADDR(parent->port->disc.fanout_sas_addr));
1279
+ pr_warn("edge ex %016llx phy S:%02d <--> edge ex %016llx phy S:%02d, while there is a fanout ex %016llx\n",
1280
+ SAS_ADDR(parent->sas_addr),
1281
+ parent_phy->phy_id,
1282
+ SAS_ADDR(child->sas_addr),
1283
+ child_phy->phy_id,
1284
+ SAS_ADDR(parent->port->disc.fanout_sas_addr));
13271285 } else if (SAS_ADDR(parent->port->disc.eeds_a) == 0) {
13281286 memcpy(parent->port->disc.eeds_a, parent->sas_addr,
13291287 SAS_ADDR_SIZE);
....@@ -1341,12 +1299,11 @@
13411299 ;
13421300 else {
13431301 res = -ENODEV;
1344
- SAS_DPRINTK("edge ex %016llx phy 0x%x <--> edge ex %016llx "
1345
- "phy 0x%x link forms a third EEDS!\n",
1346
- SAS_ADDR(parent->sas_addr),
1347
- parent_phy->phy_id,
1348
- SAS_ADDR(child->sas_addr),
1349
- child_phy->phy_id);
1302
+ pr_warn("edge ex %016llx phy%02d <--> edge ex %016llx phy%02d link forms a third EEDS!\n",
1303
+ SAS_ADDR(parent->sas_addr),
1304
+ parent_phy->phy_id,
1305
+ SAS_ADDR(child->sas_addr),
1306
+ child_phy->phy_id);
13501307 }
13511308
13521309 return res;
....@@ -1364,8 +1321,7 @@
13641321 if (!child->parent)
13651322 return 0;
13661323
1367
- if (child->parent->dev_type != SAS_EDGE_EXPANDER_DEVICE &&
1368
- child->parent->dev_type != SAS_FANOUT_EXPANDER_DEVICE)
1324
+ if (!dev_is_expander(child->parent->dev_type))
13691325 return 0;
13701326
13711327 parent_ex = &child->parent->ex_dev;
....@@ -1460,14 +1416,13 @@
14601416 goto out;
14611417 res = rri_resp[2];
14621418 if (res == SMP_RESP_NO_INDEX) {
1463
- SAS_DPRINTK("overflow of indexes: dev %016llx "
1464
- "phy 0x%x index 0x%x\n",
1465
- SAS_ADDR(dev->sas_addr), phy_id, i);
1419
+ pr_warn("overflow of indexes: dev %016llx phy%02d index 0x%x\n",
1420
+ SAS_ADDR(dev->sas_addr), phy_id, i);
14661421 goto out;
14671422 } else if (res != SMP_RESP_FUNC_ACC) {
1468
- SAS_DPRINTK("%s: dev %016llx phy 0x%x index 0x%x "
1469
- "result 0x%x\n", __func__,
1470
- SAS_ADDR(dev->sas_addr), phy_id, i, res);
1423
+ pr_notice("%s: dev %016llx phy%02d index 0x%x result 0x%x\n",
1424
+ __func__, SAS_ADDR(dev->sas_addr), phy_id,
1425
+ i, res);
14711426 goto out;
14721427 }
14731428 if (SAS_ADDR(sas_addr) != 0) {
....@@ -1531,9 +1486,8 @@
15311486 goto out;
15321487 res = cri_resp[2];
15331488 if (res == SMP_RESP_NO_INDEX) {
1534
- SAS_DPRINTK("overflow of indexes: dev %016llx phy 0x%x "
1535
- "index 0x%x\n",
1536
- SAS_ADDR(dev->sas_addr), phy_id, index);
1489
+ pr_warn("overflow of indexes: dev %016llx phy%02d index 0x%x\n",
1490
+ SAS_ADDR(dev->sas_addr), phy_id, index);
15371491 }
15381492 out:
15391493 kfree(cri_req);
....@@ -1580,8 +1534,8 @@
15801534 }
15811535
15821536 if (ex_parent->conf_route_table == 0) {
1583
- SAS_DPRINTK("ex %016llx has self-configuring routing table\n",
1584
- SAS_ADDR(parent->sas_addr));
1537
+ pr_debug("ex %016llx has self-configuring routing table\n",
1538
+ SAS_ADDR(parent->sas_addr));
15851539 return 0;
15861540 }
15871541
....@@ -1642,8 +1596,8 @@
16421596
16431597 res = sas_expander_discover(dev);
16441598 if (res) {
1645
- SAS_DPRINTK("expander %016llx discovery failed(0x%x)\n",
1646
- SAS_ADDR(dev->sas_addr), res);
1599
+ pr_warn("expander %016llx discovery failed(0x%x)\n",
1600
+ SAS_ADDR(dev->sas_addr), res);
16471601 goto out_err;
16481602 }
16491603
....@@ -1663,8 +1617,7 @@
16631617 struct domain_device *dev;
16641618
16651619 list_for_each_entry(dev, &port->dev_list, dev_list_node) {
1666
- if (dev->dev_type == SAS_EDGE_EXPANDER_DEVICE ||
1667
- dev->dev_type == SAS_FANOUT_EXPANDER_DEVICE) {
1620
+ if (dev_is_expander(dev->dev_type)) {
16681621 struct sas_expander_device *ex =
16691622 rphy_to_expander_device(dev->rphy);
16701623
....@@ -1777,10 +1730,11 @@
17771730
17781731 res = sas_get_phy_discover(dev, phy_id, disc_resp);
17791732 if (res == 0) {
1780
- memcpy(sas_addr, disc_resp->disc.attached_sas_addr, 8);
1733
+ memcpy(sas_addr, disc_resp->disc.attached_sas_addr,
1734
+ SAS_ADDR_SIZE);
17811735 *type = to_dev_type(dr);
17821736 if (*type == 0)
1783
- memset(sas_addr, 0, 8);
1737
+ memset(sas_addr, 0, SAS_ADDR_SIZE);
17841738 }
17851739 kfree(disc_resp);
17861740 return res;
....@@ -1887,13 +1841,15 @@
18871841 if (phy_id != -1) {
18881842 *src_dev = dev;
18891843 ex->ex_change_count = ex_change_count;
1890
- SAS_DPRINTK("Expander phy change count has changed\n");
1844
+ pr_info("ex %016llx phy%02d change count has changed\n",
1845
+ SAS_ADDR(dev->sas_addr), phy_id);
18911846 return res;
18921847 } else
1893
- SAS_DPRINTK("Expander phys DID NOT change\n");
1848
+ pr_info("ex %016llx phys DID NOT change\n",
1849
+ SAS_ADDR(dev->sas_addr));
18941850 }
18951851 list_for_each_entry(ch, &ex->children, siblings) {
1896
- if (ch->dev_type == SAS_EDGE_EXPANDER_DEVICE || ch->dev_type == SAS_FANOUT_EXPANDER_DEVICE) {
1852
+ if (dev_is_expander(ch->dev_type)) {
18971853 res = sas_find_bcast_dev(ch, src_dev);
18981854 if (*src_dev)
18991855 return res;
....@@ -1910,8 +1866,7 @@
19101866
19111867 list_for_each_entry_safe(child, n, &ex->children, siblings) {
19121868 set_bit(SAS_DEV_GONE, &child->state);
1913
- if (child->dev_type == SAS_EDGE_EXPANDER_DEVICE ||
1914
- child->dev_type == SAS_FANOUT_EXPANDER_DEVICE)
1869
+ if (dev_is_expander(child->dev_type))
19151870 sas_unregister_ex_tree(port, child);
19161871 else
19171872 sas_unregister_dev(port, child);
....@@ -1931,8 +1886,7 @@
19311886 if (SAS_ADDR(child->sas_addr) ==
19321887 SAS_ADDR(phy->attached_sas_addr)) {
19331888 set_bit(SAS_DEV_GONE, &child->state);
1934
- if (child->dev_type == SAS_EDGE_EXPANDER_DEVICE ||
1935
- child->dev_type == SAS_FANOUT_EXPANDER_DEVICE)
1889
+ if (dev_is_expander(child->dev_type))
19361890 sas_unregister_ex_tree(parent->port, child);
19371891 else
19381892 sas_unregister_dev(parent->port, child);
....@@ -1961,8 +1915,7 @@
19611915 int res = 0;
19621916
19631917 list_for_each_entry(child, &ex_root->children, siblings) {
1964
- if (child->dev_type == SAS_EDGE_EXPANDER_DEVICE ||
1965
- child->dev_type == SAS_FANOUT_EXPANDER_DEVICE) {
1918
+ if (dev_is_expander(child->dev_type)) {
19661919 struct sas_expander_device *ex =
19671920 rphy_to_expander_device(child->rphy);
19681921
....@@ -2000,8 +1953,8 @@
20001953 struct domain_device *child;
20011954 int res;
20021955
2003
- SAS_DPRINTK("ex %016llx phy%d new device attached\n",
2004
- SAS_ADDR(dev->sas_addr), phy_id);
1956
+ pr_debug("ex %016llx phy%02d new device attached\n",
1957
+ SAS_ADDR(dev->sas_addr), phy_id);
20051958 res = sas_ex_phy_discover(dev, phy_id);
20061959 if (res)
20071960 return res;
....@@ -2015,8 +1968,7 @@
20151968 list_for_each_entry(child, &dev->ex_dev.children, siblings) {
20161969 if (SAS_ADDR(child->sas_addr) ==
20171970 SAS_ADDR(ex_phy->attached_sas_addr)) {
2018
- if (child->dev_type == SAS_EDGE_EXPANDER_DEVICE ||
2019
- child->dev_type == SAS_FANOUT_EXPANDER_DEVICE)
1971
+ if (dev_is_expander(child->dev_type))
20201972 res = sas_discover_bfs_by_root(child);
20211973 break;
20221974 }
....@@ -2039,15 +1991,23 @@
20391991 return false;
20401992 }
20411993
2042
-static int sas_rediscover_dev(struct domain_device *dev, int phy_id, bool last)
1994
+static int sas_rediscover_dev(struct domain_device *dev, int phy_id,
1995
+ bool last, int sibling)
20431996 {
20441997 struct expander_device *ex = &dev->ex_dev;
20451998 struct ex_phy *phy = &ex->ex_phy[phy_id];
20461999 enum sas_device_type type = SAS_PHY_UNUSED;
2047
- u8 sas_addr[8];
2000
+ u8 sas_addr[SAS_ADDR_SIZE];
2001
+ char msg[80] = "";
20482002 int res;
20492003
2050
- memset(sas_addr, 0, 8);
2004
+ if (!last)
2005
+ sprintf(msg, ", part of a wide port with phy%02d", sibling);
2006
+
2007
+ pr_debug("ex %016llx rediscovering phy%02d%s\n",
2008
+ SAS_ADDR(dev->sas_addr), phy_id, msg);
2009
+
2010
+ memset(sas_addr, 0, SAS_ADDR_SIZE);
20512011 res = sas_get_phy_attached_dev(dev, phy_id, sas_addr, &type);
20522012 switch (res) {
20532013 case SMP_RESP_NO_PHY:
....@@ -2084,15 +2044,15 @@
20842044
20852045 if (ata_dev && phy->attached_dev_type == SAS_SATA_PENDING)
20862046 action = ", needs recovery";
2087
- SAS_DPRINTK("ex %016llx phy 0x%x broadcast flutter%s\n",
2088
- SAS_ADDR(dev->sas_addr), phy_id, action);
2047
+ pr_debug("ex %016llx phy%02d broadcast flutter%s\n",
2048
+ SAS_ADDR(dev->sas_addr), phy_id, action);
20892049 return res;
20902050 }
20912051
20922052 /* we always have to delete the old device when we went here */
2093
- SAS_DPRINTK("ex %016llx phy 0x%x replace %016llx\n",
2094
- SAS_ADDR(dev->sas_addr), phy_id,
2095
- SAS_ADDR(phy->attached_sas_addr));
2053
+ pr_info("ex %016llx phy%02d replace %016llx\n",
2054
+ SAS_ADDR(dev->sas_addr), phy_id,
2055
+ SAS_ADDR(phy->attached_sas_addr));
20962056 sas_unregister_devs_sas_addr(dev, phy_id, last);
20972057
20982058 return sas_discover_new(dev, phy_id);
....@@ -2120,8 +2080,8 @@
21202080 int i;
21212081 bool last = true; /* is this the last phy of the port */
21222082
2123
- SAS_DPRINTK("ex %016llx phy%d originated BROADCAST(CHANGE)\n",
2124
- SAS_ADDR(dev->sas_addr), phy_id);
2083
+ pr_debug("ex %016llx phy%02d originated BROADCAST(CHANGE)\n",
2084
+ SAS_ADDR(dev->sas_addr), phy_id);
21252085
21262086 if (SAS_ADDR(changed_phy->attached_sas_addr) != 0) {
21272087 for (i = 0; i < ex->num_phys; i++) {
....@@ -2131,13 +2091,11 @@
21312091 continue;
21322092 if (SAS_ADDR(phy->attached_sas_addr) ==
21332093 SAS_ADDR(changed_phy->attached_sas_addr)) {
2134
- SAS_DPRINTK("phy%d part of wide port with "
2135
- "phy%d\n", phy_id, i);
21362094 last = false;
21372095 break;
21382096 }
21392097 }
2140
- res = sas_rediscover_dev(dev, phy_id, last);
2098
+ res = sas_rediscover_dev(dev, phy_id, last, i);
21412099 } else
21422100 res = sas_discover_new(dev, phy_id);
21432101 return res;
....@@ -2190,23 +2148,23 @@
21902148 case SAS_FANOUT_EXPANDER_DEVICE:
21912149 break;
21922150 default:
2193
- printk("%s: can we send a smp request to a device?\n",
2151
+ pr_err("%s: can we send a smp request to a device?\n",
21942152 __func__);
21952153 goto out;
21962154 }
21972155
21982156 dev = sas_find_dev_by_rphy(rphy);
21992157 if (!dev) {
2200
- printk("%s: fail to find a domain_device?\n", __func__);
2158
+ pr_err("%s: fail to find a domain_device?\n", __func__);
22012159 goto out;
22022160 }
22032161
22042162 /* do we need to support multiple segments? */
22052163 if (job->request_payload.sg_cnt > 1 ||
22062164 job->reply_payload.sg_cnt > 1) {
2207
- printk("%s: multiple segments req %u, rsp %u\n",
2208
- __func__, job->request_payload.payload_len,
2209
- job->reply_payload.payload_len);
2165
+ pr_info("%s: multiple segments req %u, rsp %u\n",
2166
+ __func__, job->request_payload.payload_len,
2167
+ job->reply_payload.payload_len);
22102168 goto out;
22112169 }
22122170