diff options
| -rw-r--r-- | drivers/message/fusion/mptsas.c | 45 |
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 | ||
| 366 | static int | ||
| 367 | mptsas_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; |
