diff options
Diffstat (limited to 'drivers/scsi/mvsas/mv_sas.c')
-rw-r--r-- | drivers/scsi/mvsas/mv_sas.c | 79 |
1 files changed, 19 insertions, 60 deletions
diff --git a/drivers/scsi/mvsas/mv_sas.c b/drivers/scsi/mvsas/mv_sas.c index 4958fefff365..a4884a57cf79 100644 --- a/drivers/scsi/mvsas/mv_sas.c +++ b/drivers/scsi/mvsas/mv_sas.c | |||
@@ -214,7 +214,7 @@ int mvs_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func, | |||
214 | break; | 214 | break; |
215 | case PHY_FUNC_RELEASE_SPINUP_HOLD: | 215 | case PHY_FUNC_RELEASE_SPINUP_HOLD: |
216 | default: | 216 | default: |
217 | rc = -EOPNOTSUPP; | 217 | rc = -ENOSYS; |
218 | } | 218 | } |
219 | msleep(200); | 219 | msleep(200); |
220 | return rc; | 220 | return rc; |
@@ -265,6 +265,12 @@ static void mvs_bytes_dmaed(struct mvs_info *mvi, int i) | |||
265 | id->dev_type = phy->identify.device_type; | 265 | id->dev_type = phy->identify.device_type; |
266 | id->initiator_bits = SAS_PROTOCOL_ALL; | 266 | id->initiator_bits = SAS_PROTOCOL_ALL; |
267 | id->target_bits = phy->identify.target_port_protocols; | 267 | id->target_bits = phy->identify.target_port_protocols; |
268 | |||
269 | /* direct attached SAS device */ | ||
270 | if (phy->att_dev_info & PORT_SSP_TRGT_MASK) { | ||
271 | MVS_CHIP_DISP->write_port_cfg_addr(mvi, i, PHYR_PHY_STAT); | ||
272 | MVS_CHIP_DISP->write_port_cfg_data(mvi, i, 0x00); | ||
273 | } | ||
268 | } else if (phy->phy_type & PORT_TYPE_SATA) { | 274 | } else if (phy->phy_type & PORT_TYPE_SATA) { |
269 | /*Nothing*/ | 275 | /*Nothing*/ |
270 | } | 276 | } |
@@ -276,36 +282,6 @@ static void mvs_bytes_dmaed(struct mvs_info *mvi, int i) | |||
276 | PORTE_BYTES_DMAED); | 282 | PORTE_BYTES_DMAED); |
277 | } | 283 | } |
278 | 284 | ||
279 | int mvs_slave_alloc(struct scsi_device *scsi_dev) | ||
280 | { | ||
281 | struct domain_device *dev = sdev_to_domain_dev(scsi_dev); | ||
282 | if (dev_is_sata(dev)) { | ||
283 | /* We don't need to rescan targets | ||
284 | * if REPORT_LUNS request is failed | ||
285 | */ | ||
286 | if (scsi_dev->lun > 0) | ||
287 | return -ENXIO; | ||
288 | scsi_dev->tagged_supported = 1; | ||
289 | } | ||
290 | |||
291 | return sas_slave_alloc(scsi_dev); | ||
292 | } | ||
293 | |||
294 | int mvs_slave_configure(struct scsi_device *sdev) | ||
295 | { | ||
296 | struct domain_device *dev = sdev_to_domain_dev(sdev); | ||
297 | int ret = sas_slave_configure(sdev); | ||
298 | |||
299 | if (ret) | ||
300 | return ret; | ||
301 | if (!dev_is_sata(dev)) { | ||
302 | sas_change_queue_depth(sdev, | ||
303 | MVS_QUEUE_SIZE, | ||
304 | SCSI_QDEPTH_DEFAULT); | ||
305 | } | ||
306 | return 0; | ||
307 | } | ||
308 | |||
309 | void mvs_scan_start(struct Scsi_Host *shost) | 285 | void mvs_scan_start(struct Scsi_Host *shost) |
310 | { | 286 | { |
311 | int i, j; | 287 | int i, j; |
@@ -426,7 +402,7 @@ static int mvs_task_prep_smp(struct mvs_info *mvi, | |||
426 | /* generate open address frame hdr (first 12 bytes) */ | 402 | /* generate open address frame hdr (first 12 bytes) */ |
427 | /* initiator, SMP, ftype 1h */ | 403 | /* initiator, SMP, ftype 1h */ |
428 | buf_oaf[0] = (1 << 7) | (PROTOCOL_SMP << 4) | 0x01; | 404 | buf_oaf[0] = (1 << 7) | (PROTOCOL_SMP << 4) | 0x01; |
429 | buf_oaf[1] = dev->linkrate & 0xf; | 405 | buf_oaf[1] = min(sas_port->linkrate, dev->linkrate) & 0xf; |
430 | *(u16 *)(buf_oaf + 2) = 0xFFFF; /* SAS SPEC */ | 406 | *(u16 *)(buf_oaf + 2) = 0xFFFF; /* SAS SPEC */ |
431 | memcpy(buf_oaf + 4, dev->sas_addr, SAS_ADDR_SIZE); | 407 | memcpy(buf_oaf + 4, dev->sas_addr, SAS_ADDR_SIZE); |
432 | 408 | ||
@@ -571,7 +547,7 @@ static int mvs_task_prep_ata(struct mvs_info *mvi, | |||
571 | /* generate open address frame hdr (first 12 bytes) */ | 547 | /* generate open address frame hdr (first 12 bytes) */ |
572 | /* initiator, STP, ftype 1h */ | 548 | /* initiator, STP, ftype 1h */ |
573 | buf_oaf[0] = (1 << 7) | (PROTOCOL_STP << 4) | 0x1; | 549 | buf_oaf[0] = (1 << 7) | (PROTOCOL_STP << 4) | 0x1; |
574 | buf_oaf[1] = dev->linkrate & 0xf; | 550 | buf_oaf[1] = min(sas_port->linkrate, dev->linkrate) & 0xf; |
575 | *(u16 *)(buf_oaf + 2) = cpu_to_be16(mvi_dev->device_id + 1); | 551 | *(u16 *)(buf_oaf + 2) = cpu_to_be16(mvi_dev->device_id + 1); |
576 | memcpy(buf_oaf + 4, dev->sas_addr, SAS_ADDR_SIZE); | 552 | memcpy(buf_oaf + 4, dev->sas_addr, SAS_ADDR_SIZE); |
577 | 553 | ||
@@ -679,7 +655,7 @@ static int mvs_task_prep_ssp(struct mvs_info *mvi, | |||
679 | /* generate open address frame hdr (first 12 bytes) */ | 655 | /* generate open address frame hdr (first 12 bytes) */ |
680 | /* initiator, SSP, ftype 1h */ | 656 | /* initiator, SSP, ftype 1h */ |
681 | buf_oaf[0] = (1 << 7) | (PROTOCOL_SSP << 4) | 0x1; | 657 | buf_oaf[0] = (1 << 7) | (PROTOCOL_SSP << 4) | 0x1; |
682 | buf_oaf[1] = dev->linkrate & 0xf; | 658 | buf_oaf[1] = min(sas_port->linkrate, dev->linkrate) & 0xf; |
683 | *(u16 *)(buf_oaf + 2) = cpu_to_be16(mvi_dev->device_id + 1); | 659 | *(u16 *)(buf_oaf + 2) = cpu_to_be16(mvi_dev->device_id + 1); |
684 | memcpy(buf_oaf + 4, dev->sas_addr, SAS_ADDR_SIZE); | 660 | memcpy(buf_oaf + 4, dev->sas_addr, SAS_ADDR_SIZE); |
685 | 661 | ||
@@ -1241,6 +1217,12 @@ static void mvs_port_notify_formed(struct asd_sas_phy *sas_phy, int lock) | |||
1241 | port->wide_port_phymap = sas_port->phy_mask; | 1217 | port->wide_port_phymap = sas_port->phy_mask; |
1242 | mv_printk("set wide port phy map %x\n", sas_port->phy_mask); | 1218 | mv_printk("set wide port phy map %x\n", sas_port->phy_mask); |
1243 | mvs_update_wideport(mvi, sas_phy->id); | 1219 | mvs_update_wideport(mvi, sas_phy->id); |
1220 | |||
1221 | /* direct attached SAS device */ | ||
1222 | if (phy->att_dev_info & PORT_SSP_TRGT_MASK) { | ||
1223 | MVS_CHIP_DISP->write_port_cfg_addr(mvi, i, PHYR_PHY_STAT); | ||
1224 | MVS_CHIP_DISP->write_port_cfg_data(mvi, i, 0x04); | ||
1225 | } | ||
1244 | } | 1226 | } |
1245 | if (lock) | 1227 | if (lock) |
1246 | spin_unlock_irqrestore(&mvi->lock, flags); | 1228 | spin_unlock_irqrestore(&mvi->lock, flags); |
@@ -1387,28 +1369,6 @@ void mvs_dev_gone(struct domain_device *dev) | |||
1387 | mvs_dev_gone_notify(dev); | 1369 | mvs_dev_gone_notify(dev); |
1388 | } | 1370 | } |
1389 | 1371 | ||
1390 | static struct sas_task *mvs_alloc_task(void) | ||
1391 | { | ||
1392 | struct sas_task *task = kzalloc(sizeof(struct sas_task), GFP_KERNEL); | ||
1393 | |||
1394 | if (task) { | ||
1395 | INIT_LIST_HEAD(&task->list); | ||
1396 | spin_lock_init(&task->task_state_lock); | ||
1397 | task->task_state_flags = SAS_TASK_STATE_PENDING; | ||
1398 | init_timer(&task->timer); | ||
1399 | init_completion(&task->completion); | ||
1400 | } | ||
1401 | return task; | ||
1402 | } | ||
1403 | |||
1404 | static void mvs_free_task(struct sas_task *task) | ||
1405 | { | ||
1406 | if (task) { | ||
1407 | BUG_ON(!list_empty(&task->list)); | ||
1408 | kfree(task); | ||
1409 | } | ||
1410 | } | ||
1411 | |||
1412 | static void mvs_task_done(struct sas_task *task) | 1372 | static void mvs_task_done(struct sas_task *task) |
1413 | { | 1373 | { |
1414 | if (!del_timer(&task->timer)) | 1374 | if (!del_timer(&task->timer)) |
@@ -1432,7 +1392,7 @@ static int mvs_exec_internal_tmf_task(struct domain_device *dev, | |||
1432 | struct sas_task *task = NULL; | 1392 | struct sas_task *task = NULL; |
1433 | 1393 | ||
1434 | for (retry = 0; retry < 3; retry++) { | 1394 | for (retry = 0; retry < 3; retry++) { |
1435 | task = mvs_alloc_task(); | 1395 | task = sas_alloc_task(GFP_KERNEL); |
1436 | if (!task) | 1396 | if (!task) |
1437 | return -ENOMEM; | 1397 | return -ENOMEM; |
1438 | 1398 | ||
@@ -1490,15 +1450,14 @@ static int mvs_exec_internal_tmf_task(struct domain_device *dev, | |||
1490 | SAS_ADDR(dev->sas_addr), | 1450 | SAS_ADDR(dev->sas_addr), |
1491 | task->task_status.resp, | 1451 | task->task_status.resp, |
1492 | task->task_status.stat); | 1452 | task->task_status.stat); |
1493 | mvs_free_task(task); | 1453 | sas_free_task(task); |
1494 | task = NULL; | 1454 | task = NULL; |
1495 | 1455 | ||
1496 | } | 1456 | } |
1497 | } | 1457 | } |
1498 | ex_err: | 1458 | ex_err: |
1499 | BUG_ON(retry == 3 && task != NULL); | 1459 | BUG_ON(retry == 3 && task != NULL); |
1500 | if (task != NULL) | 1460 | sas_free_task(task); |
1501 | mvs_free_task(task); | ||
1502 | return res; | 1461 | return res; |
1503 | } | 1462 | } |
1504 | 1463 | ||