aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/message/fusion/mptsas.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/message/fusion/mptsas.c')
-rw-r--r--drivers/message/fusion/mptsas.c45
1 files changed, 40 insertions, 5 deletions
diff --git a/drivers/message/fusion/mptsas.c b/drivers/message/fusion/mptsas.c
index be4eb8a308b7..010d4a39269b 100644
--- a/drivers/message/fusion/mptsas.c
+++ b/drivers/message/fusion/mptsas.c
@@ -363,6 +363,14 @@ mptsas_sas_enclosure_pg0(MPT_ADAPTER *ioc, struct mptsas_enclosure *enclosure,
363 return error; 363 return error;
364} 364}
365 365
366static int
367mptsas_slave_configure(struct scsi_device *sdev)
368{
369 sas_read_port_mode_page(sdev);
370
371 return mptscsih_slave_configure(sdev);
372}
373
366/* 374/*
367 * This is pretty ugly. We will be able to seriously clean it up 375 * This is pretty ugly. We will be able to seriously clean it up
368 * once the DV code in mptscsih goes away and we can properly 376 * once the DV code in mptscsih goes away and we can properly
@@ -486,7 +494,7 @@ static struct scsi_host_template mptsas_driver_template = {
486 .queuecommand = mptscsih_qcmd, 494 .queuecommand = mptscsih_qcmd,
487 .target_alloc = mptscsih_target_alloc, 495 .target_alloc = mptscsih_target_alloc,
488 .slave_alloc = mptsas_slave_alloc, 496 .slave_alloc = mptsas_slave_alloc,
489 .slave_configure = mptscsih_slave_configure, 497 .slave_configure = mptsas_slave_configure,
490 .target_destroy = mptscsih_target_destroy, 498 .target_destroy = mptscsih_target_destroy,
491 .slave_destroy = mptsas_slave_destroy, 499 .slave_destroy = mptsas_slave_destroy,
492 .change_queue_depth = mptscsih_change_queue_depth, 500 .change_queue_depth = mptscsih_change_queue_depth,
@@ -1249,6 +1257,7 @@ static int mptsas_probe_one_phy(struct device *dev,
1249 (!phy_info->rphy)) { 1257 (!phy_info->rphy)) {
1250 1258
1251 struct sas_rphy *rphy; 1259 struct sas_rphy *rphy;
1260 struct sas_identify identify;
1252 1261
1253 ioc = phy_to_ioc(phy_info->phy); 1262 ioc = phy_to_ioc(phy_info->phy);
1254 1263
@@ -1261,11 +1270,24 @@ static int mptsas_probe_one_phy(struct device *dev,
1261 mptsas_is_end_device(&phy_info->attached)) 1270 mptsas_is_end_device(&phy_info->attached))
1262 return 0; 1271 return 0;
1263 1272
1264 rphy = sas_rphy_alloc(phy); 1273 mptsas_parse_device_info(&identify, &phy_info->attached);
1274 switch (identify.device_type) {
1275 case SAS_END_DEVICE:
1276 rphy = sas_end_device_alloc(phy);
1277 break;
1278 case SAS_EDGE_EXPANDER_DEVICE:
1279 case SAS_FANOUT_EXPANDER_DEVICE:
1280 rphy = sas_expander_alloc(phy, identify.device_type);
1281 break;
1282 default:
1283 rphy = NULL;
1284 break;
1285 }
1265 if (!rphy) 1286 if (!rphy)
1266 return 0; /* non-fatal: an rphy can be added later */ 1287 return 0; /* non-fatal: an rphy can be added later */
1267 1288
1268 mptsas_parse_device_info(&rphy->identify, &phy_info->attached); 1289 rphy->identify = identify;
1290
1269 error = sas_rphy_add(rphy); 1291 error = sas_rphy_add(rphy);
1270 if (error) { 1292 if (error) {
1271 sas_rphy_free(rphy); 1293 sas_rphy_free(rphy);
@@ -1654,6 +1676,7 @@ mptsas_hotplug_work(void *arg)
1654 struct mptsas_phyinfo *phy_info; 1676 struct mptsas_phyinfo *phy_info;
1655 struct sas_rphy *rphy; 1677 struct sas_rphy *rphy;
1656 struct scsi_device *sdev; 1678 struct scsi_device *sdev;
1679 struct sas_identify identify;
1657 char *ds = NULL; 1680 char *ds = NULL;
1658 struct mptsas_devinfo sas_device; 1681 struct mptsas_devinfo sas_device;
1659 VirtTarget *vtarget; 1682 VirtTarget *vtarget;
@@ -1779,11 +1802,23 @@ mptsas_hotplug_work(void *arg)
1779 "attaching %s device, channel %d, id %d, phy %d\n", 1802 "attaching %s device, channel %d, id %d, phy %d\n",
1780 ioc->name, ds, ev->channel, ev->id, ev->phy_id); 1803 ioc->name, ds, ev->channel, ev->id, ev->phy_id);
1781 1804
1782 rphy = sas_rphy_alloc(phy_info->phy); 1805 mptsas_parse_device_info(&identify, &phy_info->attached);
1806 switch (identify.device_type) {
1807 case SAS_END_DEVICE:
1808 rphy = sas_end_device_alloc(phy_info->phy);
1809 break;
1810 case SAS_EDGE_EXPANDER_DEVICE:
1811 case SAS_FANOUT_EXPANDER_DEVICE:
1812 rphy = sas_expander_alloc(phy_info->phy, identify.device_type);
1813 break;
1814 default:
1815 rphy = NULL;
1816 break;
1817 }
1783 if (!rphy) 1818 if (!rphy)
1784 break; /* non-fatal: an rphy can be added later */ 1819 break; /* non-fatal: an rphy can be added later */
1785 1820
1786 mptsas_parse_device_info(&rphy->identify, &phy_info->attached); 1821 rphy->identify = identify;
1787 if (sas_rphy_add(rphy)) { 1822 if (sas_rphy_add(rphy)) {
1788 sas_rphy_free(rphy); 1823 sas_rphy_free(rphy);
1789 break; 1824 break;