diff options
Diffstat (limited to 'drivers/message/i2o/i2o_scsi.c')
-rw-r--r-- | drivers/message/i2o/i2o_scsi.c | 89 |
1 files changed, 46 insertions, 43 deletions
diff --git a/drivers/message/i2o/i2o_scsi.c b/drivers/message/i2o/i2o_scsi.c index 9f1744c3933b..f9e5a23697a1 100644 --- a/drivers/message/i2o/i2o_scsi.c +++ b/drivers/message/i2o/i2o_scsi.c | |||
@@ -70,7 +70,7 @@ | |||
70 | #include <scsi/sg_request.h> | 70 | #include <scsi/sg_request.h> |
71 | 71 | ||
72 | #define OSM_NAME "scsi-osm" | 72 | #define OSM_NAME "scsi-osm" |
73 | #define OSM_VERSION "1.282" | 73 | #define OSM_VERSION "1.316" |
74 | #define OSM_DESCRIPTION "I2O SCSI Peripheral OSM" | 74 | #define OSM_DESCRIPTION "I2O SCSI Peripheral OSM" |
75 | 75 | ||
76 | static struct i2o_driver i2o_scsi_driver; | 76 | static struct i2o_driver i2o_scsi_driver; |
@@ -113,7 +113,7 @@ static struct i2o_scsi_host *i2o_scsi_host_alloc(struct i2o_controller *c) | |||
113 | 113 | ||
114 | list_for_each_entry(i2o_dev, &c->devices, list) | 114 | list_for_each_entry(i2o_dev, &c->devices, list) |
115 | if (i2o_dev->lct_data.class_id == I2O_CLASS_BUS_ADAPTER) { | 115 | if (i2o_dev->lct_data.class_id == I2O_CLASS_BUS_ADAPTER) { |
116 | if (i2o_parm_field_get(i2o_dev, 0x0000, 0, &type, 1) | 116 | if (!i2o_parm_field_get(i2o_dev, 0x0000, 0, &type, 1) |
117 | && (type == 0x01)) /* SCSI bus */ | 117 | && (type == 0x01)) /* SCSI bus */ |
118 | max_channel++; | 118 | max_channel++; |
119 | } | 119 | } |
@@ -146,7 +146,7 @@ static struct i2o_scsi_host *i2o_scsi_host_alloc(struct i2o_controller *c) | |||
146 | i = 0; | 146 | i = 0; |
147 | list_for_each_entry(i2o_dev, &c->devices, list) | 147 | list_for_each_entry(i2o_dev, &c->devices, list) |
148 | if (i2o_dev->lct_data.class_id == I2O_CLASS_BUS_ADAPTER) { | 148 | if (i2o_dev->lct_data.class_id == I2O_CLASS_BUS_ADAPTER) { |
149 | if (i2o_parm_field_get(i2o_dev, 0x0000, 0, &type, 1) | 149 | if (!i2o_parm_field_get(i2o_dev, 0x0000, 0, &type, 1) |
150 | && (type == 0x01)) /* only SCSI bus */ | 150 | && (type == 0x01)) /* only SCSI bus */ |
151 | i2o_shost->channel[i++] = i2o_dev; | 151 | i2o_shost->channel[i++] = i2o_dev; |
152 | 152 | ||
@@ -238,13 +238,15 @@ static int i2o_scsi_probe(struct device *dev) | |||
238 | u8 type; | 238 | u8 type; |
239 | struct i2o_device *d = i2o_shost->channel[0]; | 239 | struct i2o_device *d = i2o_shost->channel[0]; |
240 | 240 | ||
241 | if (i2o_parm_field_get(d, 0x0000, 0, &type, 1) | 241 | if (!i2o_parm_field_get(d, 0x0000, 0, &type, 1) |
242 | && (type == 0x01)) /* SCSI bus */ | 242 | && (type == 0x01)) /* SCSI bus */ |
243 | if (i2o_parm_field_get(d, 0x0200, 4, &id, 4)) { | 243 | if (!i2o_parm_field_get(d, 0x0200, 4, &id, 4)) { |
244 | channel = 0; | 244 | channel = 0; |
245 | if (i2o_dev->lct_data.class_id == | 245 | if (i2o_dev->lct_data.class_id == |
246 | I2O_CLASS_RANDOM_BLOCK_STORAGE) | 246 | I2O_CLASS_RANDOM_BLOCK_STORAGE) |
247 | lun = i2o_shost->lun++; | 247 | lun = |
248 | cpu_to_le64(i2o_shost-> | ||
249 | lun++); | ||
248 | else | 250 | else |
249 | lun = 0; | 251 | lun = 0; |
250 | } | 252 | } |
@@ -253,10 +255,10 @@ static int i2o_scsi_probe(struct device *dev) | |||
253 | break; | 255 | break; |
254 | 256 | ||
255 | case I2O_CLASS_SCSI_PERIPHERAL: | 257 | case I2O_CLASS_SCSI_PERIPHERAL: |
256 | if (i2o_parm_field_get(i2o_dev, 0x0000, 3, &id, 4) < 0) | 258 | if (i2o_parm_field_get(i2o_dev, 0x0000, 3, &id, 4)) |
257 | return -EFAULT; | 259 | return -EFAULT; |
258 | 260 | ||
259 | if (i2o_parm_field_get(i2o_dev, 0x0000, 4, &lun, 8) < 0) | 261 | if (i2o_parm_field_get(i2o_dev, 0x0000, 4, &lun, 8)) |
260 | return -EFAULT; | 262 | return -EFAULT; |
261 | 263 | ||
262 | parent = i2o_iop_find_device(c, i2o_dev->lct_data.parent_tid); | 264 | parent = i2o_iop_find_device(c, i2o_dev->lct_data.parent_tid); |
@@ -281,20 +283,22 @@ static int i2o_scsi_probe(struct device *dev) | |||
281 | return -EFAULT; | 283 | return -EFAULT; |
282 | } | 284 | } |
283 | 285 | ||
284 | if (id >= scsi_host->max_id) { | 286 | if (le32_to_cpu(id) >= scsi_host->max_id) { |
285 | osm_warn("SCSI device id (%d) >= max_id of I2O host (%d)", id, | 287 | osm_warn("SCSI device id (%d) >= max_id of I2O host (%d)", |
286 | scsi_host->max_id); | 288 | le32_to_cpu(id), scsi_host->max_id); |
287 | return -EFAULT; | 289 | return -EFAULT; |
288 | } | 290 | } |
289 | 291 | ||
290 | if (lun >= scsi_host->max_lun) { | 292 | if (le64_to_cpu(lun) >= scsi_host->max_lun) { |
291 | osm_warn("SCSI device id (%d) >= max_lun of I2O host (%d)", | 293 | osm_warn("SCSI device lun (%lu) >= max_lun of I2O host (%d)", |
292 | (unsigned int)lun, scsi_host->max_lun); | 294 | (long unsigned int)le64_to_cpu(lun), |
295 | scsi_host->max_lun); | ||
293 | return -EFAULT; | 296 | return -EFAULT; |
294 | } | 297 | } |
295 | 298 | ||
296 | scsi_dev = | 299 | scsi_dev = |
297 | __scsi_add_device(i2o_shost->scsi_host, channel, id, lun, i2o_dev); | 300 | __scsi_add_device(i2o_shost->scsi_host, channel, le32_to_cpu(id), |
301 | le64_to_cpu(lun), i2o_dev); | ||
298 | 302 | ||
299 | if (IS_ERR(scsi_dev)) { | 303 | if (IS_ERR(scsi_dev)) { |
300 | osm_warn("can not add SCSI device %03x\n", | 304 | osm_warn("can not add SCSI device %03x\n", |
@@ -305,8 +309,9 @@ static int i2o_scsi_probe(struct device *dev) | |||
305 | sysfs_create_link(&i2o_dev->device.kobj, &scsi_dev->sdev_gendev.kobj, | 309 | sysfs_create_link(&i2o_dev->device.kobj, &scsi_dev->sdev_gendev.kobj, |
306 | "scsi"); | 310 | "scsi"); |
307 | 311 | ||
308 | osm_info("device added (TID: %03x) channel: %d, id: %d, lun: %d\n", | 312 | osm_info("device added (TID: %03x) channel: %d, id: %d, lun: %ld\n", |
309 | i2o_dev->lct_data.tid, channel, id, (unsigned int)lun); | 313 | i2o_dev->lct_data.tid, channel, le32_to_cpu(id), |
314 | (long unsigned int)le64_to_cpu(lun)); | ||
310 | 315 | ||
311 | return 0; | 316 | return 0; |
312 | }; | 317 | }; |
@@ -510,8 +515,7 @@ static int i2o_scsi_queuecommand(struct scsi_cmnd *SCpnt, | |||
510 | struct i2o_controller *c; | 515 | struct i2o_controller *c; |
511 | struct i2o_device *i2o_dev; | 516 | struct i2o_device *i2o_dev; |
512 | int tid; | 517 | int tid; |
513 | struct i2o_message __iomem *msg; | 518 | struct i2o_message *msg; |
514 | u32 m; | ||
515 | /* | 519 | /* |
516 | * ENABLE_DISCONNECT | 520 | * ENABLE_DISCONNECT |
517 | * SIMPLE_TAG | 521 | * SIMPLE_TAG |
@@ -519,7 +523,7 @@ static int i2o_scsi_queuecommand(struct scsi_cmnd *SCpnt, | |||
519 | */ | 523 | */ |
520 | u32 scsi_flags = 0x20a00000; | 524 | u32 scsi_flags = 0x20a00000; |
521 | u32 sgl_offset; | 525 | u32 sgl_offset; |
522 | u32 __iomem *mptr; | 526 | u32 *mptr; |
523 | u32 cmd = I2O_CMD_SCSI_EXEC << 24; | 527 | u32 cmd = I2O_CMD_SCSI_EXEC << 24; |
524 | int rc = 0; | 528 | int rc = 0; |
525 | 529 | ||
@@ -576,8 +580,8 @@ static int i2o_scsi_queuecommand(struct scsi_cmnd *SCpnt, | |||
576 | * throw it back to the scsi layer | 580 | * throw it back to the scsi layer |
577 | */ | 581 | */ |
578 | 582 | ||
579 | m = i2o_msg_get_wait(c, &msg, I2O_TIMEOUT_MESSAGE_GET); | 583 | msg = i2o_msg_get(c); |
580 | if (m == I2O_QUEUE_EMPTY) { | 584 | if (IS_ERR(msg)) { |
581 | rc = SCSI_MLQUEUE_HOST_BUSY; | 585 | rc = SCSI_MLQUEUE_HOST_BUSY; |
582 | goto exit; | 586 | goto exit; |
583 | } | 587 | } |
@@ -617,16 +621,16 @@ static int i2o_scsi_queuecommand(struct scsi_cmnd *SCpnt, | |||
617 | if (sgl_offset == SGL_OFFSET_10) | 621 | if (sgl_offset == SGL_OFFSET_10) |
618 | sgl_offset = SGL_OFFSET_12; | 622 | sgl_offset = SGL_OFFSET_12; |
619 | cmd = I2O_CMD_PRIVATE << 24; | 623 | cmd = I2O_CMD_PRIVATE << 24; |
620 | writel(I2O_VENDOR_DPT << 16 | I2O_CMD_SCSI_EXEC, mptr++); | 624 | *mptr++ = cpu_to_le32(I2O_VENDOR_DPT << 16 | I2O_CMD_SCSI_EXEC); |
621 | writel(adpt_flags | tid, mptr++); | 625 | *mptr++ = cpu_to_le32(adpt_flags | tid); |
622 | } | 626 | } |
623 | #endif | 627 | #endif |
624 | 628 | ||
625 | writel(cmd | HOST_TID << 12 | tid, &msg->u.head[1]); | 629 | msg->u.head[1] = cpu_to_le32(cmd | HOST_TID << 12 | tid); |
626 | writel(i2o_scsi_driver.context, &msg->u.s.icntxt); | 630 | msg->u.s.icntxt = cpu_to_le32(i2o_scsi_driver.context); |
627 | 631 | ||
628 | /* We want the SCSI control block back */ | 632 | /* We want the SCSI control block back */ |
629 | writel(i2o_cntxt_list_add(c, SCpnt), &msg->u.s.tcntxt); | 633 | msg->u.s.tcntxt = cpu_to_le32(i2o_cntxt_list_add(c, SCpnt)); |
630 | 634 | ||
631 | /* LSI_920_PCI_QUIRK | 635 | /* LSI_920_PCI_QUIRK |
632 | * | 636 | * |
@@ -649,15 +653,15 @@ static int i2o_scsi_queuecommand(struct scsi_cmnd *SCpnt, | |||
649 | } | 653 | } |
650 | */ | 654 | */ |
651 | 655 | ||
652 | writel(scsi_flags | SCpnt->cmd_len, mptr++); | 656 | *mptr++ = cpu_to_le32(scsi_flags | SCpnt->cmd_len); |
653 | 657 | ||
654 | /* Write SCSI command into the message - always 16 byte block */ | 658 | /* Write SCSI command into the message - always 16 byte block */ |
655 | memcpy_toio(mptr, SCpnt->cmnd, 16); | 659 | memcpy(mptr, SCpnt->cmnd, 16); |
656 | mptr += 4; | 660 | mptr += 4; |
657 | 661 | ||
658 | if (sgl_offset != SGL_OFFSET_0) { | 662 | if (sgl_offset != SGL_OFFSET_0) { |
659 | /* write size of data addressed by SGL */ | 663 | /* write size of data addressed by SGL */ |
660 | writel(SCpnt->request_bufflen, mptr++); | 664 | *mptr++ = cpu_to_le32(SCpnt->request_bufflen); |
661 | 665 | ||
662 | /* Now fill in the SGList and command */ | 666 | /* Now fill in the SGList and command */ |
663 | if (SCpnt->use_sg) { | 667 | if (SCpnt->use_sg) { |
@@ -676,11 +680,11 @@ static int i2o_scsi_queuecommand(struct scsi_cmnd *SCpnt, | |||
676 | } | 680 | } |
677 | 681 | ||
678 | /* Stick the headers on */ | 682 | /* Stick the headers on */ |
679 | writel(I2O_MESSAGE_SIZE(mptr - &msg->u.head[0]) | sgl_offset, | 683 | msg->u.head[0] = |
680 | &msg->u.head[0]); | 684 | cpu_to_le32(I2O_MESSAGE_SIZE(mptr - &msg->u.head[0]) | sgl_offset); |
681 | 685 | ||
682 | /* Queue the message */ | 686 | /* Queue the message */ |
683 | i2o_msg_post(c, m); | 687 | i2o_msg_post(c, msg); |
684 | 688 | ||
685 | osm_debug("Issued %ld\n", SCpnt->serial_number); | 689 | osm_debug("Issued %ld\n", SCpnt->serial_number); |
686 | 690 | ||
@@ -688,7 +692,7 @@ static int i2o_scsi_queuecommand(struct scsi_cmnd *SCpnt, | |||
688 | 692 | ||
689 | nomem: | 693 | nomem: |
690 | rc = -ENOMEM; | 694 | rc = -ENOMEM; |
691 | i2o_msg_nop(c, m); | 695 | i2o_msg_nop(c, msg); |
692 | 696 | ||
693 | exit: | 697 | exit: |
694 | return rc; | 698 | return rc; |
@@ -709,8 +713,7 @@ static int i2o_scsi_abort(struct scsi_cmnd *SCpnt) | |||
709 | { | 713 | { |
710 | struct i2o_device *i2o_dev; | 714 | struct i2o_device *i2o_dev; |
711 | struct i2o_controller *c; | 715 | struct i2o_controller *c; |
712 | struct i2o_message __iomem *msg; | 716 | struct i2o_message *msg; |
713 | u32 m; | ||
714 | int tid; | 717 | int tid; |
715 | int status = FAILED; | 718 | int status = FAILED; |
716 | 719 | ||
@@ -720,16 +723,16 @@ static int i2o_scsi_abort(struct scsi_cmnd *SCpnt) | |||
720 | c = i2o_dev->iop; | 723 | c = i2o_dev->iop; |
721 | tid = i2o_dev->lct_data.tid; | 724 | tid = i2o_dev->lct_data.tid; |
722 | 725 | ||
723 | m = i2o_msg_get_wait(c, &msg, I2O_TIMEOUT_MESSAGE_GET); | 726 | msg = i2o_msg_get_wait(c, I2O_TIMEOUT_MESSAGE_GET); |
724 | if (m == I2O_QUEUE_EMPTY) | 727 | if (IS_ERR(msg)) |
725 | return SCSI_MLQUEUE_HOST_BUSY; | 728 | return SCSI_MLQUEUE_HOST_BUSY; |
726 | 729 | ||
727 | writel(FIVE_WORD_MSG_SIZE | SGL_OFFSET_0, &msg->u.head[0]); | 730 | msg->u.head[0] = cpu_to_le32(FIVE_WORD_MSG_SIZE | SGL_OFFSET_0); |
728 | writel(I2O_CMD_SCSI_ABORT << 24 | HOST_TID << 12 | tid, | 731 | msg->u.head[1] = |
729 | &msg->u.head[1]); | 732 | cpu_to_le32(I2O_CMD_SCSI_ABORT << 24 | HOST_TID << 12 | tid); |
730 | writel(i2o_cntxt_list_get_ptr(c, SCpnt), &msg->body[0]); | 733 | msg->body[0] = cpu_to_le32(i2o_cntxt_list_get_ptr(c, SCpnt)); |
731 | 734 | ||
732 | if (i2o_msg_post_wait(c, m, I2O_TIMEOUT_SCSI_SCB_ABORT)) | 735 | if (i2o_msg_post_wait(c, msg, I2O_TIMEOUT_SCSI_SCB_ABORT)) |
733 | status = SUCCESS; | 736 | status = SUCCESS; |
734 | 737 | ||
735 | return status; | 738 | return status; |