diff options
Diffstat (limited to 'drivers/block/cciss.c')
-rw-r--r-- | drivers/block/cciss.c | 927 |
1 files changed, 560 insertions, 367 deletions
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 4d4d5e0d3fa6..b22cec97ea19 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
@@ -180,11 +180,13 @@ static void __devinit cciss_interrupt_mode(ctlr_info_t *, struct pci_dev *, | |||
180 | __u32); | 180 | __u32); |
181 | static void start_io(ctlr_info_t *h); | 181 | static void start_io(ctlr_info_t *h); |
182 | static int sendcmd(__u8 cmd, int ctlr, void *buff, size_t size, | 182 | static int sendcmd(__u8 cmd, int ctlr, void *buff, size_t size, |
183 | unsigned int use_unit_num, unsigned int log_unit, | ||
184 | __u8 page_code, unsigned char *scsi3addr, int cmd_type); | 183 | __u8 page_code, unsigned char *scsi3addr, int cmd_type); |
185 | static int sendcmd_withirq(__u8 cmd, int ctlr, void *buff, size_t size, | 184 | static int sendcmd_withirq(__u8 cmd, int ctlr, void *buff, size_t size, |
186 | unsigned int use_unit_num, unsigned int log_unit, | 185 | __u8 page_code, unsigned char scsi3addr[], |
187 | __u8 page_code, int cmd_type); | 186 | int cmd_type); |
187 | static int sendcmd_withirq_core(ctlr_info_t *h, CommandList_struct *c, | ||
188 | int attempt_retry); | ||
189 | static int process_sendcmd_error(ctlr_info_t *h, CommandList_struct *c); | ||
188 | 190 | ||
189 | static void fail_all_cmds(unsigned long ctlr); | 191 | static void fail_all_cmds(unsigned long ctlr); |
190 | static int scan_thread(void *data); | 192 | static int scan_thread(void *data); |
@@ -437,6 +439,194 @@ static void __devinit cciss_procinit(int i) | |||
437 | } | 439 | } |
438 | #endif /* CONFIG_PROC_FS */ | 440 | #endif /* CONFIG_PROC_FS */ |
439 | 441 | ||
442 | #define MAX_PRODUCT_NAME_LEN 19 | ||
443 | |||
444 | #define to_hba(n) container_of(n, struct ctlr_info, dev) | ||
445 | #define to_drv(n) container_of(n, drive_info_struct, dev) | ||
446 | |||
447 | static struct device_type cciss_host_type = { | ||
448 | .name = "cciss_host", | ||
449 | }; | ||
450 | |||
451 | static ssize_t dev_show_unique_id(struct device *dev, | ||
452 | struct device_attribute *attr, | ||
453 | char *buf) | ||
454 | { | ||
455 | drive_info_struct *drv = to_drv(dev); | ||
456 | struct ctlr_info *h = to_hba(drv->dev.parent); | ||
457 | __u8 sn[16]; | ||
458 | unsigned long flags; | ||
459 | int ret = 0; | ||
460 | |||
461 | spin_lock_irqsave(CCISS_LOCK(h->ctlr), flags); | ||
462 | if (h->busy_configuring) | ||
463 | ret = -EBUSY; | ||
464 | else | ||
465 | memcpy(sn, drv->serial_no, sizeof(sn)); | ||
466 | spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags); | ||
467 | |||
468 | if (ret) | ||
469 | return ret; | ||
470 | else | ||
471 | return snprintf(buf, 16 * 2 + 2, | ||
472 | "%02X%02X%02X%02X%02X%02X%02X%02X" | ||
473 | "%02X%02X%02X%02X%02X%02X%02X%02X\n", | ||
474 | sn[0], sn[1], sn[2], sn[3], | ||
475 | sn[4], sn[5], sn[6], sn[7], | ||
476 | sn[8], sn[9], sn[10], sn[11], | ||
477 | sn[12], sn[13], sn[14], sn[15]); | ||
478 | } | ||
479 | DEVICE_ATTR(unique_id, S_IRUGO, dev_show_unique_id, NULL); | ||
480 | |||
481 | static ssize_t dev_show_vendor(struct device *dev, | ||
482 | struct device_attribute *attr, | ||
483 | char *buf) | ||
484 | { | ||
485 | drive_info_struct *drv = to_drv(dev); | ||
486 | struct ctlr_info *h = to_hba(drv->dev.parent); | ||
487 | char vendor[VENDOR_LEN + 1]; | ||
488 | unsigned long flags; | ||
489 | int ret = 0; | ||
490 | |||
491 | spin_lock_irqsave(CCISS_LOCK(h->ctlr), flags); | ||
492 | if (h->busy_configuring) | ||
493 | ret = -EBUSY; | ||
494 | else | ||
495 | memcpy(vendor, drv->vendor, VENDOR_LEN + 1); | ||
496 | spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags); | ||
497 | |||
498 | if (ret) | ||
499 | return ret; | ||
500 | else | ||
501 | return snprintf(buf, sizeof(vendor) + 1, "%s\n", drv->vendor); | ||
502 | } | ||
503 | DEVICE_ATTR(vendor, S_IRUGO, dev_show_vendor, NULL); | ||
504 | |||
505 | static ssize_t dev_show_model(struct device *dev, | ||
506 | struct device_attribute *attr, | ||
507 | char *buf) | ||
508 | { | ||
509 | drive_info_struct *drv = to_drv(dev); | ||
510 | struct ctlr_info *h = to_hba(drv->dev.parent); | ||
511 | char model[MODEL_LEN + 1]; | ||
512 | unsigned long flags; | ||
513 | int ret = 0; | ||
514 | |||
515 | spin_lock_irqsave(CCISS_LOCK(h->ctlr), flags); | ||
516 | if (h->busy_configuring) | ||
517 | ret = -EBUSY; | ||
518 | else | ||
519 | memcpy(model, drv->model, MODEL_LEN + 1); | ||
520 | spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags); | ||
521 | |||
522 | if (ret) | ||
523 | return ret; | ||
524 | else | ||
525 | return snprintf(buf, sizeof(model) + 1, "%s\n", drv->model); | ||
526 | } | ||
527 | DEVICE_ATTR(model, S_IRUGO, dev_show_model, NULL); | ||
528 | |||
529 | static ssize_t dev_show_rev(struct device *dev, | ||
530 | struct device_attribute *attr, | ||
531 | char *buf) | ||
532 | { | ||
533 | drive_info_struct *drv = to_drv(dev); | ||
534 | struct ctlr_info *h = to_hba(drv->dev.parent); | ||
535 | char rev[REV_LEN + 1]; | ||
536 | unsigned long flags; | ||
537 | int ret = 0; | ||
538 | |||
539 | spin_lock_irqsave(CCISS_LOCK(h->ctlr), flags); | ||
540 | if (h->busy_configuring) | ||
541 | ret = -EBUSY; | ||
542 | else | ||
543 | memcpy(rev, drv->rev, REV_LEN + 1); | ||
544 | spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags); | ||
545 | |||
546 | if (ret) | ||
547 | return ret; | ||
548 | else | ||
549 | return snprintf(buf, sizeof(rev) + 1, "%s\n", drv->rev); | ||
550 | } | ||
551 | DEVICE_ATTR(rev, S_IRUGO, dev_show_rev, NULL); | ||
552 | |||
553 | static struct attribute *cciss_dev_attrs[] = { | ||
554 | &dev_attr_unique_id.attr, | ||
555 | &dev_attr_model.attr, | ||
556 | &dev_attr_vendor.attr, | ||
557 | &dev_attr_rev.attr, | ||
558 | NULL | ||
559 | }; | ||
560 | |||
561 | static struct attribute_group cciss_dev_attr_group = { | ||
562 | .attrs = cciss_dev_attrs, | ||
563 | }; | ||
564 | |||
565 | static struct attribute_group *cciss_dev_attr_groups[] = { | ||
566 | &cciss_dev_attr_group, | ||
567 | NULL | ||
568 | }; | ||
569 | |||
570 | static struct device_type cciss_dev_type = { | ||
571 | .name = "cciss_device", | ||
572 | .groups = cciss_dev_attr_groups, | ||
573 | }; | ||
574 | |||
575 | static struct bus_type cciss_bus_type = { | ||
576 | .name = "cciss", | ||
577 | }; | ||
578 | |||
579 | |||
580 | /* | ||
581 | * Initialize sysfs entry for each controller. This sets up and registers | ||
582 | * the 'cciss#' directory for each individual controller under | ||
583 | * /sys/bus/pci/devices/<dev>/. | ||
584 | */ | ||
585 | static int cciss_create_hba_sysfs_entry(struct ctlr_info *h) | ||
586 | { | ||
587 | device_initialize(&h->dev); | ||
588 | h->dev.type = &cciss_host_type; | ||
589 | h->dev.bus = &cciss_bus_type; | ||
590 | dev_set_name(&h->dev, "%s", h->devname); | ||
591 | h->dev.parent = &h->pdev->dev; | ||
592 | |||
593 | return device_add(&h->dev); | ||
594 | } | ||
595 | |||
596 | /* | ||
597 | * Remove sysfs entries for an hba. | ||
598 | */ | ||
599 | static void cciss_destroy_hba_sysfs_entry(struct ctlr_info *h) | ||
600 | { | ||
601 | device_del(&h->dev); | ||
602 | } | ||
603 | |||
604 | /* | ||
605 | * Initialize sysfs for each logical drive. This sets up and registers | ||
606 | * the 'c#d#' directory for each individual logical drive under | ||
607 | * /sys/bus/pci/devices/<dev/ccis#/. We also create a link from | ||
608 | * /sys/block/cciss!c#d# to this entry. | ||
609 | */ | ||
610 | static int cciss_create_ld_sysfs_entry(struct ctlr_info *h, | ||
611 | drive_info_struct *drv, | ||
612 | int drv_index) | ||
613 | { | ||
614 | device_initialize(&drv->dev); | ||
615 | drv->dev.type = &cciss_dev_type; | ||
616 | drv->dev.bus = &cciss_bus_type; | ||
617 | dev_set_name(&drv->dev, "c%dd%d", h->ctlr, drv_index); | ||
618 | drv->dev.parent = &h->dev; | ||
619 | return device_add(&drv->dev); | ||
620 | } | ||
621 | |||
622 | /* | ||
623 | * Remove sysfs entries for a logical drive. | ||
624 | */ | ||
625 | static void cciss_destroy_ld_sysfs_entry(drive_info_struct *drv) | ||
626 | { | ||
627 | device_del(&drv->dev); | ||
628 | } | ||
629 | |||
440 | /* | 630 | /* |
441 | * For operations that cannot sleep, a command block is allocated at init, | 631 | * For operations that cannot sleep, a command block is allocated at init, |
442 | * and managed by cmd_alloc() and cmd_free() using a simple bitmap to track | 632 | * and managed by cmd_alloc() and cmd_free() using a simple bitmap to track |
@@ -1299,7 +1489,6 @@ static void cciss_softirq_done(struct request *rq) | |||
1299 | { | 1489 | { |
1300 | CommandList_struct *cmd = rq->completion_data; | 1490 | CommandList_struct *cmd = rq->completion_data; |
1301 | ctlr_info_t *h = hba[cmd->ctlr]; | 1491 | ctlr_info_t *h = hba[cmd->ctlr]; |
1302 | unsigned int nr_bytes; | ||
1303 | unsigned long flags; | 1492 | unsigned long flags; |
1304 | u64bit temp64; | 1493 | u64bit temp64; |
1305 | int i, ddir; | 1494 | int i, ddir; |
@@ -1321,15 +1510,11 @@ static void cciss_softirq_done(struct request *rq) | |||
1321 | printk("Done with %p\n", rq); | 1510 | printk("Done with %p\n", rq); |
1322 | #endif /* CCISS_DEBUG */ | 1511 | #endif /* CCISS_DEBUG */ |
1323 | 1512 | ||
1324 | /* | 1513 | /* set the residual count for pc requests */ |
1325 | * Store the full size and set the residual count for pc requests | ||
1326 | */ | ||
1327 | nr_bytes = blk_rq_bytes(rq); | ||
1328 | if (blk_pc_request(rq)) | 1514 | if (blk_pc_request(rq)) |
1329 | rq->data_len = cmd->err_info->ResidualCnt; | 1515 | rq->resid_len = cmd->err_info->ResidualCnt; |
1330 | 1516 | ||
1331 | if (blk_end_request(rq, (rq->errors == 0) ? 0 : -EIO, nr_bytes)) | 1517 | blk_end_request_all(rq, (rq->errors == 0) ? 0 : -EIO); |
1332 | BUG(); | ||
1333 | 1518 | ||
1334 | spin_lock_irqsave(&h->lock, flags); | 1519 | spin_lock_irqsave(&h->lock, flags); |
1335 | cmd_free(h, cmd, 1); | 1520 | cmd_free(h, cmd, 1); |
@@ -1337,6 +1522,56 @@ static void cciss_softirq_done(struct request *rq) | |||
1337 | spin_unlock_irqrestore(&h->lock, flags); | 1522 | spin_unlock_irqrestore(&h->lock, flags); |
1338 | } | 1523 | } |
1339 | 1524 | ||
1525 | static void log_unit_to_scsi3addr(ctlr_info_t *h, unsigned char scsi3addr[], | ||
1526 | uint32_t log_unit) | ||
1527 | { | ||
1528 | log_unit = h->drv[log_unit].LunID & 0x03fff; | ||
1529 | memset(&scsi3addr[4], 0, 4); | ||
1530 | memcpy(&scsi3addr[0], &log_unit, 4); | ||
1531 | scsi3addr[3] |= 0x40; | ||
1532 | } | ||
1533 | |||
1534 | /* This function gets the SCSI vendor, model, and revision of a logical drive | ||
1535 | * via the inquiry page 0. Model, vendor, and rev are set to empty strings if | ||
1536 | * they cannot be read. | ||
1537 | */ | ||
1538 | static void cciss_get_device_descr(int ctlr, int logvol, int withirq, | ||
1539 | char *vendor, char *model, char *rev) | ||
1540 | { | ||
1541 | int rc; | ||
1542 | InquiryData_struct *inq_buf; | ||
1543 | unsigned char scsi3addr[8]; | ||
1544 | |||
1545 | *vendor = '\0'; | ||
1546 | *model = '\0'; | ||
1547 | *rev = '\0'; | ||
1548 | |||
1549 | inq_buf = kzalloc(sizeof(InquiryData_struct), GFP_KERNEL); | ||
1550 | if (!inq_buf) | ||
1551 | return; | ||
1552 | |||
1553 | log_unit_to_scsi3addr(hba[ctlr], scsi3addr, logvol); | ||
1554 | if (withirq) | ||
1555 | rc = sendcmd_withirq(CISS_INQUIRY, ctlr, inq_buf, | ||
1556 | sizeof(InquiryData_struct), 0, | ||
1557 | scsi3addr, TYPE_CMD); | ||
1558 | else | ||
1559 | rc = sendcmd(CISS_INQUIRY, ctlr, inq_buf, | ||
1560 | sizeof(InquiryData_struct), 0, | ||
1561 | scsi3addr, TYPE_CMD); | ||
1562 | if (rc == IO_OK) { | ||
1563 | memcpy(vendor, &inq_buf->data_byte[8], VENDOR_LEN); | ||
1564 | vendor[VENDOR_LEN] = '\0'; | ||
1565 | memcpy(model, &inq_buf->data_byte[16], MODEL_LEN); | ||
1566 | model[MODEL_LEN] = '\0'; | ||
1567 | memcpy(rev, &inq_buf->data_byte[32], REV_LEN); | ||
1568 | rev[REV_LEN] = '\0'; | ||
1569 | } | ||
1570 | |||
1571 | kfree(inq_buf); | ||
1572 | return; | ||
1573 | } | ||
1574 | |||
1340 | /* This function gets the serial number of a logical drive via | 1575 | /* This function gets the serial number of a logical drive via |
1341 | * inquiry page 0x83. Serial no. is 16 bytes. If the serial | 1576 | * inquiry page 0x83. Serial no. is 16 bytes. If the serial |
1342 | * number cannot be had, for whatever reason, 16 bytes of 0xff | 1577 | * number cannot be had, for whatever reason, 16 bytes of 0xff |
@@ -1348,6 +1583,7 @@ static void cciss_get_serial_no(int ctlr, int logvol, int withirq, | |||
1348 | #define PAGE_83_INQ_BYTES 64 | 1583 | #define PAGE_83_INQ_BYTES 64 |
1349 | int rc; | 1584 | int rc; |
1350 | unsigned char *buf; | 1585 | unsigned char *buf; |
1586 | unsigned char scsi3addr[8]; | ||
1351 | 1587 | ||
1352 | if (buflen > 16) | 1588 | if (buflen > 16) |
1353 | buflen = 16; | 1589 | buflen = 16; |
@@ -1356,12 +1592,13 @@ static void cciss_get_serial_no(int ctlr, int logvol, int withirq, | |||
1356 | if (!buf) | 1592 | if (!buf) |
1357 | return; | 1593 | return; |
1358 | memset(serial_no, 0, buflen); | 1594 | memset(serial_no, 0, buflen); |
1595 | log_unit_to_scsi3addr(hba[ctlr], scsi3addr, logvol); | ||
1359 | if (withirq) | 1596 | if (withirq) |
1360 | rc = sendcmd_withirq(CISS_INQUIRY, ctlr, buf, | 1597 | rc = sendcmd_withirq(CISS_INQUIRY, ctlr, buf, |
1361 | PAGE_83_INQ_BYTES, 1, logvol, 0x83, TYPE_CMD); | 1598 | PAGE_83_INQ_BYTES, 0x83, scsi3addr, TYPE_CMD); |
1362 | else | 1599 | else |
1363 | rc = sendcmd(CISS_INQUIRY, ctlr, buf, | 1600 | rc = sendcmd(CISS_INQUIRY, ctlr, buf, |
1364 | PAGE_83_INQ_BYTES, 1, logvol, 0x83, NULL, TYPE_CMD); | 1601 | PAGE_83_INQ_BYTES, 0x83, scsi3addr, TYPE_CMD); |
1365 | if (rc == IO_OK) | 1602 | if (rc == IO_OK) |
1366 | memcpy(serial_no, &buf[8], buflen); | 1603 | memcpy(serial_no, &buf[8], buflen); |
1367 | kfree(buf); | 1604 | kfree(buf); |
@@ -1377,7 +1614,7 @@ static void cciss_add_disk(ctlr_info_t *h, struct gendisk *disk, | |||
1377 | disk->first_minor = drv_index << NWD_SHIFT; | 1614 | disk->first_minor = drv_index << NWD_SHIFT; |
1378 | disk->fops = &cciss_fops; | 1615 | disk->fops = &cciss_fops; |
1379 | disk->private_data = &h->drv[drv_index]; | 1616 | disk->private_data = &h->drv[drv_index]; |
1380 | disk->driverfs_dev = &h->pdev->dev; | 1617 | disk->driverfs_dev = &h->drv[drv_index].dev; |
1381 | 1618 | ||
1382 | /* Set up queue information */ | 1619 | /* Set up queue information */ |
1383 | blk_queue_bounce_limit(disk->queue, h->pdev->dma_mask); | 1620 | blk_queue_bounce_limit(disk->queue, h->pdev->dma_mask); |
@@ -1394,8 +1631,8 @@ static void cciss_add_disk(ctlr_info_t *h, struct gendisk *disk, | |||
1394 | 1631 | ||
1395 | disk->queue->queuedata = h; | 1632 | disk->queue->queuedata = h; |
1396 | 1633 | ||
1397 | blk_queue_hardsect_size(disk->queue, | 1634 | blk_queue_logical_block_size(disk->queue, |
1398 | h->drv[drv_index].block_size); | 1635 | h->drv[drv_index].block_size); |
1399 | 1636 | ||
1400 | /* Make sure all queue data is written out before */ | 1637 | /* Make sure all queue data is written out before */ |
1401 | /* setting h->drv[drv_index].queue, as setting this */ | 1638 | /* setting h->drv[drv_index].queue, as setting this */ |
@@ -1468,6 +1705,8 @@ static void cciss_update_drive_info(int ctlr, int drv_index, int first_time) | |||
1468 | drvinfo->block_size = block_size; | 1705 | drvinfo->block_size = block_size; |
1469 | drvinfo->nr_blocks = total_size + 1; | 1706 | drvinfo->nr_blocks = total_size + 1; |
1470 | 1707 | ||
1708 | cciss_get_device_descr(ctlr, drv_index, 1, drvinfo->vendor, | ||
1709 | drvinfo->model, drvinfo->rev); | ||
1471 | cciss_get_serial_no(ctlr, drv_index, 1, drvinfo->serial_no, | 1710 | cciss_get_serial_no(ctlr, drv_index, 1, drvinfo->serial_no, |
1472 | sizeof(drvinfo->serial_no)); | 1711 | sizeof(drvinfo->serial_no)); |
1473 | 1712 | ||
@@ -1517,6 +1756,9 @@ static void cciss_update_drive_info(int ctlr, int drv_index, int first_time) | |||
1517 | h->drv[drv_index].cylinders = drvinfo->cylinders; | 1756 | h->drv[drv_index].cylinders = drvinfo->cylinders; |
1518 | h->drv[drv_index].raid_level = drvinfo->raid_level; | 1757 | h->drv[drv_index].raid_level = drvinfo->raid_level; |
1519 | memcpy(h->drv[drv_index].serial_no, drvinfo->serial_no, 16); | 1758 | memcpy(h->drv[drv_index].serial_no, drvinfo->serial_no, 16); |
1759 | memcpy(h->drv[drv_index].vendor, drvinfo->vendor, VENDOR_LEN + 1); | ||
1760 | memcpy(h->drv[drv_index].model, drvinfo->model, MODEL_LEN + 1); | ||
1761 | memcpy(h->drv[drv_index].rev, drvinfo->rev, REV_LEN + 1); | ||
1520 | 1762 | ||
1521 | ++h->num_luns; | 1763 | ++h->num_luns; |
1522 | disk = h->gendisk[drv_index]; | 1764 | disk = h->gendisk[drv_index]; |
@@ -1591,6 +1833,8 @@ static int cciss_add_gendisk(ctlr_info_t *h, __u32 lunid, int controller_node) | |||
1591 | } | 1833 | } |
1592 | } | 1834 | } |
1593 | h->drv[drv_index].LunID = lunid; | 1835 | h->drv[drv_index].LunID = lunid; |
1836 | if (cciss_create_ld_sysfs_entry(h, &h->drv[drv_index], drv_index)) | ||
1837 | goto err_free_disk; | ||
1594 | 1838 | ||
1595 | /* Don't need to mark this busy because nobody */ | 1839 | /* Don't need to mark this busy because nobody */ |
1596 | /* else knows about this disk yet to contend */ | 1840 | /* else knows about this disk yet to contend */ |
@@ -1598,6 +1842,11 @@ static int cciss_add_gendisk(ctlr_info_t *h, __u32 lunid, int controller_node) | |||
1598 | h->drv[drv_index].busy_configuring = 0; | 1842 | h->drv[drv_index].busy_configuring = 0; |
1599 | wmb(); | 1843 | wmb(); |
1600 | return drv_index; | 1844 | return drv_index; |
1845 | |||
1846 | err_free_disk: | ||
1847 | put_disk(h->gendisk[drv_index]); | ||
1848 | h->gendisk[drv_index] = NULL; | ||
1849 | return -1; | ||
1601 | } | 1850 | } |
1602 | 1851 | ||
1603 | /* This is for the special case of a controller which | 1852 | /* This is for the special case of a controller which |
@@ -1668,8 +1917,8 @@ static int rebuild_lun_table(ctlr_info_t *h, int first_time) | |||
1668 | goto mem_msg; | 1917 | goto mem_msg; |
1669 | 1918 | ||
1670 | return_code = sendcmd_withirq(CISS_REPORT_LOG, ctlr, ld_buff, | 1919 | return_code = sendcmd_withirq(CISS_REPORT_LOG, ctlr, ld_buff, |
1671 | sizeof(ReportLunData_struct), 0, | 1920 | sizeof(ReportLunData_struct), |
1672 | 0, 0, TYPE_CMD); | 1921 | 0, CTLR_LUNID, TYPE_CMD); |
1673 | 1922 | ||
1674 | if (return_code == IO_OK) | 1923 | if (return_code == IO_OK) |
1675 | listlength = be32_to_cpu(*(__be32 *) ld_buff->LUNListLength); | 1924 | listlength = be32_to_cpu(*(__be32 *) ld_buff->LUNListLength); |
@@ -1718,6 +1967,7 @@ static int rebuild_lun_table(ctlr_info_t *h, int first_time) | |||
1718 | h->drv[i].busy_configuring = 1; | 1967 | h->drv[i].busy_configuring = 1; |
1719 | spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags); | 1968 | spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags); |
1720 | return_code = deregister_disk(h, i, 1); | 1969 | return_code = deregister_disk(h, i, 1); |
1970 | cciss_destroy_ld_sysfs_entry(&h->drv[i]); | ||
1721 | h->drv[i].busy_configuring = 0; | 1971 | h->drv[i].busy_configuring = 0; |
1722 | } | 1972 | } |
1723 | } | 1973 | } |
@@ -1877,11 +2127,9 @@ static int deregister_disk(ctlr_info_t *h, int drv_index, | |||
1877 | return 0; | 2127 | return 0; |
1878 | } | 2128 | } |
1879 | 2129 | ||
1880 | static int fill_cmd(CommandList_struct *c, __u8 cmd, int ctlr, void *buff, size_t size, unsigned int use_unit_num, /* 0: address the controller, | 2130 | static int fill_cmd(CommandList_struct *c, __u8 cmd, int ctlr, void *buff, |
1881 | 1: address logical volume log_unit, | 2131 | size_t size, __u8 page_code, unsigned char *scsi3addr, |
1882 | 2: periph device address is scsi3addr */ | 2132 | int cmd_type) |
1883 | unsigned int log_unit, __u8 page_code, | ||
1884 | unsigned char *scsi3addr, int cmd_type) | ||
1885 | { | 2133 | { |
1886 | ctlr_info_t *h = hba[ctlr]; | 2134 | ctlr_info_t *h = hba[ctlr]; |
1887 | u64bit buff_dma_handle; | 2135 | u64bit buff_dma_handle; |
@@ -1897,27 +2145,12 @@ static int fill_cmd(CommandList_struct *c, __u8 cmd, int ctlr, void *buff, size_ | |||
1897 | c->Header.SGTotal = 0; | 2145 | c->Header.SGTotal = 0; |
1898 | } | 2146 | } |
1899 | c->Header.Tag.lower = c->busaddr; | 2147 | c->Header.Tag.lower = c->busaddr; |
2148 | memcpy(c->Header.LUN.LunAddrBytes, scsi3addr, 8); | ||
1900 | 2149 | ||
1901 | c->Request.Type.Type = cmd_type; | 2150 | c->Request.Type.Type = cmd_type; |
1902 | if (cmd_type == TYPE_CMD) { | 2151 | if (cmd_type == TYPE_CMD) { |
1903 | switch (cmd) { | 2152 | switch (cmd) { |
1904 | case CISS_INQUIRY: | 2153 | case CISS_INQUIRY: |
1905 | /* If the logical unit number is 0 then, this is going | ||
1906 | to controller so It's a physical command | ||
1907 | mode = 0 target = 0. So we have nothing to write. | ||
1908 | otherwise, if use_unit_num == 1, | ||
1909 | mode = 1(volume set addressing) target = LUNID | ||
1910 | otherwise, if use_unit_num == 2, | ||
1911 | mode = 0(periph dev addr) target = scsi3addr */ | ||
1912 | if (use_unit_num == 1) { | ||
1913 | c->Header.LUN.LogDev.VolId = | ||
1914 | h->drv[log_unit].LunID; | ||
1915 | c->Header.LUN.LogDev.Mode = 1; | ||
1916 | } else if (use_unit_num == 2) { | ||
1917 | memcpy(c->Header.LUN.LunAddrBytes, scsi3addr, | ||
1918 | 8); | ||
1919 | c->Header.LUN.LogDev.Mode = 0; | ||
1920 | } | ||
1921 | /* are we trying to read a vital product page */ | 2154 | /* are we trying to read a vital product page */ |
1922 | if (page_code != 0) { | 2155 | if (page_code != 0) { |
1923 | c->Request.CDB[1] = 0x01; | 2156 | c->Request.CDB[1] = 0x01; |
@@ -1947,8 +2180,6 @@ static int fill_cmd(CommandList_struct *c, __u8 cmd, int ctlr, void *buff, size_ | |||
1947 | break; | 2180 | break; |
1948 | 2181 | ||
1949 | case CCISS_READ_CAPACITY: | 2182 | case CCISS_READ_CAPACITY: |
1950 | c->Header.LUN.LogDev.VolId = h->drv[log_unit].LunID; | ||
1951 | c->Header.LUN.LogDev.Mode = 1; | ||
1952 | c->Request.CDBLen = 10; | 2183 | c->Request.CDBLen = 10; |
1953 | c->Request.Type.Attribute = ATTR_SIMPLE; | 2184 | c->Request.Type.Attribute = ATTR_SIMPLE; |
1954 | c->Request.Type.Direction = XFER_READ; | 2185 | c->Request.Type.Direction = XFER_READ; |
@@ -1956,8 +2187,6 @@ static int fill_cmd(CommandList_struct *c, __u8 cmd, int ctlr, void *buff, size_ | |||
1956 | c->Request.CDB[0] = cmd; | 2187 | c->Request.CDB[0] = cmd; |
1957 | break; | 2188 | break; |
1958 | case CCISS_READ_CAPACITY_16: | 2189 | case CCISS_READ_CAPACITY_16: |
1959 | c->Header.LUN.LogDev.VolId = h->drv[log_unit].LunID; | ||
1960 | c->Header.LUN.LogDev.Mode = 1; | ||
1961 | c->Request.CDBLen = 16; | 2190 | c->Request.CDBLen = 16; |
1962 | c->Request.Type.Attribute = ATTR_SIMPLE; | 2191 | c->Request.Type.Attribute = ATTR_SIMPLE; |
1963 | c->Request.Type.Direction = XFER_READ; | 2192 | c->Request.Type.Direction = XFER_READ; |
@@ -1979,6 +2208,12 @@ static int fill_cmd(CommandList_struct *c, __u8 cmd, int ctlr, void *buff, size_ | |||
1979 | c->Request.CDB[0] = BMIC_WRITE; | 2208 | c->Request.CDB[0] = BMIC_WRITE; |
1980 | c->Request.CDB[6] = BMIC_CACHE_FLUSH; | 2209 | c->Request.CDB[6] = BMIC_CACHE_FLUSH; |
1981 | break; | 2210 | break; |
2211 | case TEST_UNIT_READY: | ||
2212 | c->Request.CDBLen = 6; | ||
2213 | c->Request.Type.Attribute = ATTR_SIMPLE; | ||
2214 | c->Request.Type.Direction = XFER_NONE; | ||
2215 | c->Request.Timeout = 0; | ||
2216 | break; | ||
1982 | default: | 2217 | default: |
1983 | printk(KERN_WARNING | 2218 | printk(KERN_WARNING |
1984 | "cciss%d: Unknown Command 0x%c\n", ctlr, cmd); | 2219 | "cciss%d: Unknown Command 0x%c\n", ctlr, cmd); |
@@ -1997,13 +2232,13 @@ static int fill_cmd(CommandList_struct *c, __u8 cmd, int ctlr, void *buff, size_ | |||
1997 | memcpy(&c->Request.CDB[4], buff, 8); | 2232 | memcpy(&c->Request.CDB[4], buff, 8); |
1998 | break; | 2233 | break; |
1999 | case 1: /* RESET message */ | 2234 | case 1: /* RESET message */ |
2000 | c->Request.CDBLen = 12; | 2235 | c->Request.CDBLen = 16; |
2001 | c->Request.Type.Attribute = ATTR_SIMPLE; | 2236 | c->Request.Type.Attribute = ATTR_SIMPLE; |
2002 | c->Request.Type.Direction = XFER_WRITE; | 2237 | c->Request.Type.Direction = XFER_NONE; |
2003 | c->Request.Timeout = 0; | 2238 | c->Request.Timeout = 0; |
2004 | memset(&c->Request.CDB[0], 0, sizeof(c->Request.CDB)); | 2239 | memset(&c->Request.CDB[0], 0, sizeof(c->Request.CDB)); |
2005 | c->Request.CDB[0] = cmd; /* reset */ | 2240 | c->Request.CDB[0] = cmd; /* reset */ |
2006 | c->Request.CDB[1] = 0x04; /* reset a LUN */ | 2241 | c->Request.CDB[1] = 0x03; /* reset a target */ |
2007 | break; | 2242 | break; |
2008 | case 3: /* No-Op message */ | 2243 | case 3: /* No-Op message */ |
2009 | c->Request.CDBLen = 1; | 2244 | c->Request.CDBLen = 1; |
@@ -2035,114 +2270,152 @@ static int fill_cmd(CommandList_struct *c, __u8 cmd, int ctlr, void *buff, size_ | |||
2035 | return status; | 2270 | return status; |
2036 | } | 2271 | } |
2037 | 2272 | ||
2038 | static int sendcmd_withirq(__u8 cmd, | 2273 | static int check_target_status(ctlr_info_t *h, CommandList_struct *c) |
2039 | int ctlr, | ||
2040 | void *buff, | ||
2041 | size_t size, | ||
2042 | unsigned int use_unit_num, | ||
2043 | unsigned int log_unit, __u8 page_code, int cmd_type) | ||
2044 | { | 2274 | { |
2045 | ctlr_info_t *h = hba[ctlr]; | 2275 | switch (c->err_info->ScsiStatus) { |
2046 | CommandList_struct *c; | 2276 | case SAM_STAT_GOOD: |
2277 | return IO_OK; | ||
2278 | case SAM_STAT_CHECK_CONDITION: | ||
2279 | switch (0xf & c->err_info->SenseInfo[2]) { | ||
2280 | case 0: return IO_OK; /* no sense */ | ||
2281 | case 1: return IO_OK; /* recovered error */ | ||
2282 | default: | ||
2283 | printk(KERN_WARNING "cciss%d: cmd 0x%02x " | ||
2284 | "check condition, sense key = 0x%02x\n", | ||
2285 | h->ctlr, c->Request.CDB[0], | ||
2286 | c->err_info->SenseInfo[2]); | ||
2287 | } | ||
2288 | break; | ||
2289 | default: | ||
2290 | printk(KERN_WARNING "cciss%d: cmd 0x%02x" | ||
2291 | "scsi status = 0x%02x\n", h->ctlr, | ||
2292 | c->Request.CDB[0], c->err_info->ScsiStatus); | ||
2293 | break; | ||
2294 | } | ||
2295 | return IO_ERROR; | ||
2296 | } | ||
2297 | |||
2298 | static int process_sendcmd_error(ctlr_info_t *h, CommandList_struct *c) | ||
2299 | { | ||
2300 | int return_status = IO_OK; | ||
2301 | |||
2302 | if (c->err_info->CommandStatus == CMD_SUCCESS) | ||
2303 | return IO_OK; | ||
2304 | |||
2305 | switch (c->err_info->CommandStatus) { | ||
2306 | case CMD_TARGET_STATUS: | ||
2307 | return_status = check_target_status(h, c); | ||
2308 | break; | ||
2309 | case CMD_DATA_UNDERRUN: | ||
2310 | case CMD_DATA_OVERRUN: | ||
2311 | /* expected for inquiry and report lun commands */ | ||
2312 | break; | ||
2313 | case CMD_INVALID: | ||
2314 | printk(KERN_WARNING "cciss: cmd 0x%02x is " | ||
2315 | "reported invalid\n", c->Request.CDB[0]); | ||
2316 | return_status = IO_ERROR; | ||
2317 | break; | ||
2318 | case CMD_PROTOCOL_ERR: | ||
2319 | printk(KERN_WARNING "cciss: cmd 0x%02x has " | ||
2320 | "protocol error \n", c->Request.CDB[0]); | ||
2321 | return_status = IO_ERROR; | ||
2322 | break; | ||
2323 | case CMD_HARDWARE_ERR: | ||
2324 | printk(KERN_WARNING "cciss: cmd 0x%02x had " | ||
2325 | " hardware error\n", c->Request.CDB[0]); | ||
2326 | return_status = IO_ERROR; | ||
2327 | break; | ||
2328 | case CMD_CONNECTION_LOST: | ||
2329 | printk(KERN_WARNING "cciss: cmd 0x%02x had " | ||
2330 | "connection lost\n", c->Request.CDB[0]); | ||
2331 | return_status = IO_ERROR; | ||
2332 | break; | ||
2333 | case CMD_ABORTED: | ||
2334 | printk(KERN_WARNING "cciss: cmd 0x%02x was " | ||
2335 | "aborted\n", c->Request.CDB[0]); | ||
2336 | return_status = IO_ERROR; | ||
2337 | break; | ||
2338 | case CMD_ABORT_FAILED: | ||
2339 | printk(KERN_WARNING "cciss: cmd 0x%02x reports " | ||
2340 | "abort failed\n", c->Request.CDB[0]); | ||
2341 | return_status = IO_ERROR; | ||
2342 | break; | ||
2343 | case CMD_UNSOLICITED_ABORT: | ||
2344 | printk(KERN_WARNING | ||
2345 | "cciss%d: unsolicited abort 0x%02x\n", h->ctlr, | ||
2346 | c->Request.CDB[0]); | ||
2347 | return_status = IO_NEEDS_RETRY; | ||
2348 | break; | ||
2349 | default: | ||
2350 | printk(KERN_WARNING "cciss: cmd 0x%02x returned " | ||
2351 | "unknown status %x\n", c->Request.CDB[0], | ||
2352 | c->err_info->CommandStatus); | ||
2353 | return_status = IO_ERROR; | ||
2354 | } | ||
2355 | return return_status; | ||
2356 | } | ||
2357 | |||
2358 | static int sendcmd_withirq_core(ctlr_info_t *h, CommandList_struct *c, | ||
2359 | int attempt_retry) | ||
2360 | { | ||
2361 | DECLARE_COMPLETION_ONSTACK(wait); | ||
2047 | u64bit buff_dma_handle; | 2362 | u64bit buff_dma_handle; |
2048 | unsigned long flags; | 2363 | unsigned long flags; |
2049 | int return_status; | 2364 | int return_status = IO_OK; |
2050 | DECLARE_COMPLETION_ONSTACK(wait); | ||
2051 | 2365 | ||
2052 | if ((c = cmd_alloc(h, 0)) == NULL) | 2366 | resend_cmd2: |
2053 | return -ENOMEM; | ||
2054 | return_status = fill_cmd(c, cmd, ctlr, buff, size, use_unit_num, | ||
2055 | log_unit, page_code, NULL, cmd_type); | ||
2056 | if (return_status != IO_OK) { | ||
2057 | cmd_free(h, c, 0); | ||
2058 | return return_status; | ||
2059 | } | ||
2060 | resend_cmd2: | ||
2061 | c->waiting = &wait; | 2367 | c->waiting = &wait; |
2062 | |||
2063 | /* Put the request on the tail of the queue and send it */ | 2368 | /* Put the request on the tail of the queue and send it */ |
2064 | spin_lock_irqsave(CCISS_LOCK(ctlr), flags); | 2369 | spin_lock_irqsave(CCISS_LOCK(h->ctlr), flags); |
2065 | addQ(&h->reqQ, c); | 2370 | addQ(&h->reqQ, c); |
2066 | h->Qdepth++; | 2371 | h->Qdepth++; |
2067 | start_io(h); | 2372 | start_io(h); |
2068 | spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags); | 2373 | spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags); |
2069 | 2374 | ||
2070 | wait_for_completion(&wait); | 2375 | wait_for_completion(&wait); |
2071 | 2376 | ||
2072 | if (c->err_info->CommandStatus != 0) { /* an error has occurred */ | 2377 | if (c->err_info->CommandStatus == 0 || !attempt_retry) |
2073 | switch (c->err_info->CommandStatus) { | 2378 | goto command_done; |
2074 | case CMD_TARGET_STATUS: | ||
2075 | printk(KERN_WARNING "cciss: cmd %p has " | ||
2076 | " completed with errors\n", c); | ||
2077 | if (c->err_info->ScsiStatus) { | ||
2078 | printk(KERN_WARNING "cciss: cmd %p " | ||
2079 | "has SCSI Status = %x\n", | ||
2080 | c, c->err_info->ScsiStatus); | ||
2081 | } | ||
2082 | 2379 | ||
2083 | break; | 2380 | return_status = process_sendcmd_error(h, c); |
2084 | case CMD_DATA_UNDERRUN: | 2381 | |
2085 | case CMD_DATA_OVERRUN: | 2382 | if (return_status == IO_NEEDS_RETRY && |
2086 | /* expected for inquire and report lun commands */ | 2383 | c->retry_count < MAX_CMD_RETRIES) { |
2087 | break; | 2384 | printk(KERN_WARNING "cciss%d: retrying 0x%02x\n", h->ctlr, |
2088 | case CMD_INVALID: | 2385 | c->Request.CDB[0]); |
2089 | printk(KERN_WARNING "cciss: Cmd %p is " | 2386 | c->retry_count++; |
2090 | "reported invalid\n", c); | 2387 | /* erase the old error information */ |
2091 | return_status = IO_ERROR; | 2388 | memset(c->err_info, 0, sizeof(ErrorInfo_struct)); |
2092 | break; | 2389 | return_status = IO_OK; |
2093 | case CMD_PROTOCOL_ERR: | 2390 | INIT_COMPLETION(wait); |
2094 | printk(KERN_WARNING "cciss: cmd %p has " | 2391 | goto resend_cmd2; |
2095 | "protocol error \n", c); | ||
2096 | return_status = IO_ERROR; | ||
2097 | break; | ||
2098 | case CMD_HARDWARE_ERR: | ||
2099 | printk(KERN_WARNING "cciss: cmd %p had " | ||
2100 | " hardware error\n", c); | ||
2101 | return_status = IO_ERROR; | ||
2102 | break; | ||
2103 | case CMD_CONNECTION_LOST: | ||
2104 | printk(KERN_WARNING "cciss: cmd %p had " | ||
2105 | "connection lost\n", c); | ||
2106 | return_status = IO_ERROR; | ||
2107 | break; | ||
2108 | case CMD_ABORTED: | ||
2109 | printk(KERN_WARNING "cciss: cmd %p was " | ||
2110 | "aborted\n", c); | ||
2111 | return_status = IO_ERROR; | ||
2112 | break; | ||
2113 | case CMD_ABORT_FAILED: | ||
2114 | printk(KERN_WARNING "cciss: cmd %p reports " | ||
2115 | "abort failed\n", c); | ||
2116 | return_status = IO_ERROR; | ||
2117 | break; | ||
2118 | case CMD_UNSOLICITED_ABORT: | ||
2119 | printk(KERN_WARNING | ||
2120 | "cciss%d: unsolicited abort %p\n", ctlr, c); | ||
2121 | if (c->retry_count < MAX_CMD_RETRIES) { | ||
2122 | printk(KERN_WARNING | ||
2123 | "cciss%d: retrying %p\n", ctlr, c); | ||
2124 | c->retry_count++; | ||
2125 | /* erase the old error information */ | ||
2126 | memset(c->err_info, 0, | ||
2127 | sizeof(ErrorInfo_struct)); | ||
2128 | return_status = IO_OK; | ||
2129 | INIT_COMPLETION(wait); | ||
2130 | goto resend_cmd2; | ||
2131 | } | ||
2132 | return_status = IO_ERROR; | ||
2133 | break; | ||
2134 | default: | ||
2135 | printk(KERN_WARNING "cciss: cmd %p returned " | ||
2136 | "unknown status %x\n", c, | ||
2137 | c->err_info->CommandStatus); | ||
2138 | return_status = IO_ERROR; | ||
2139 | } | ||
2140 | } | 2392 | } |
2393 | |||
2394 | command_done: | ||
2141 | /* unlock the buffers from DMA */ | 2395 | /* unlock the buffers from DMA */ |
2142 | buff_dma_handle.val32.lower = c->SG[0].Addr.lower; | 2396 | buff_dma_handle.val32.lower = c->SG[0].Addr.lower; |
2143 | buff_dma_handle.val32.upper = c->SG[0].Addr.upper; | 2397 | buff_dma_handle.val32.upper = c->SG[0].Addr.upper; |
2144 | pci_unmap_single(h->pdev, (dma_addr_t) buff_dma_handle.val, | 2398 | pci_unmap_single(h->pdev, (dma_addr_t) buff_dma_handle.val, |
2145 | c->SG[0].Len, PCI_DMA_BIDIRECTIONAL); | 2399 | c->SG[0].Len, PCI_DMA_BIDIRECTIONAL); |
2400 | return return_status; | ||
2401 | } | ||
2402 | |||
2403 | static int sendcmd_withirq(__u8 cmd, int ctlr, void *buff, size_t size, | ||
2404 | __u8 page_code, unsigned char scsi3addr[], | ||
2405 | int cmd_type) | ||
2406 | { | ||
2407 | ctlr_info_t *h = hba[ctlr]; | ||
2408 | CommandList_struct *c; | ||
2409 | int return_status; | ||
2410 | |||
2411 | c = cmd_alloc(h, 0); | ||
2412 | if (!c) | ||
2413 | return -ENOMEM; | ||
2414 | return_status = fill_cmd(c, cmd, ctlr, buff, size, page_code, | ||
2415 | scsi3addr, cmd_type); | ||
2416 | if (return_status == IO_OK) | ||
2417 | return_status = sendcmd_withirq_core(h, c, 1); | ||
2418 | |||
2146 | cmd_free(h, c, 0); | 2419 | cmd_free(h, c, 0); |
2147 | return return_status; | 2420 | return return_status; |
2148 | } | 2421 | } |
@@ -2155,15 +2428,17 @@ static void cciss_geometry_inquiry(int ctlr, int logvol, | |||
2155 | { | 2428 | { |
2156 | int return_code; | 2429 | int return_code; |
2157 | unsigned long t; | 2430 | unsigned long t; |
2431 | unsigned char scsi3addr[8]; | ||
2158 | 2432 | ||
2159 | memset(inq_buff, 0, sizeof(InquiryData_struct)); | 2433 | memset(inq_buff, 0, sizeof(InquiryData_struct)); |
2434 | log_unit_to_scsi3addr(hba[ctlr], scsi3addr, logvol); | ||
2160 | if (withirq) | 2435 | if (withirq) |
2161 | return_code = sendcmd_withirq(CISS_INQUIRY, ctlr, | 2436 | return_code = sendcmd_withirq(CISS_INQUIRY, ctlr, |
2162 | inq_buff, sizeof(*inq_buff), 1, | 2437 | inq_buff, sizeof(*inq_buff), |
2163 | logvol, 0xC1, TYPE_CMD); | 2438 | 0xC1, scsi3addr, TYPE_CMD); |
2164 | else | 2439 | else |
2165 | return_code = sendcmd(CISS_INQUIRY, ctlr, inq_buff, | 2440 | return_code = sendcmd(CISS_INQUIRY, ctlr, inq_buff, |
2166 | sizeof(*inq_buff), 1, logvol, 0xC1, NULL, | 2441 | sizeof(*inq_buff), 0xC1, scsi3addr, |
2167 | TYPE_CMD); | 2442 | TYPE_CMD); |
2168 | if (return_code == IO_OK) { | 2443 | if (return_code == IO_OK) { |
2169 | if (inq_buff->data_byte[8] == 0xFF) { | 2444 | if (inq_buff->data_byte[8] == 0xFF) { |
@@ -2204,6 +2479,7 @@ cciss_read_capacity(int ctlr, int logvol, int withirq, sector_t *total_size, | |||
2204 | { | 2479 | { |
2205 | ReadCapdata_struct *buf; | 2480 | ReadCapdata_struct *buf; |
2206 | int return_code; | 2481 | int return_code; |
2482 | unsigned char scsi3addr[8]; | ||
2207 | 2483 | ||
2208 | buf = kzalloc(sizeof(ReadCapdata_struct), GFP_KERNEL); | 2484 | buf = kzalloc(sizeof(ReadCapdata_struct), GFP_KERNEL); |
2209 | if (!buf) { | 2485 | if (!buf) { |
@@ -2211,14 +2487,15 @@ cciss_read_capacity(int ctlr, int logvol, int withirq, sector_t *total_size, | |||
2211 | return; | 2487 | return; |
2212 | } | 2488 | } |
2213 | 2489 | ||
2490 | log_unit_to_scsi3addr(hba[ctlr], scsi3addr, logvol); | ||
2214 | if (withirq) | 2491 | if (withirq) |
2215 | return_code = sendcmd_withirq(CCISS_READ_CAPACITY, | 2492 | return_code = sendcmd_withirq(CCISS_READ_CAPACITY, |
2216 | ctlr, buf, sizeof(ReadCapdata_struct), | 2493 | ctlr, buf, sizeof(ReadCapdata_struct), |
2217 | 1, logvol, 0, TYPE_CMD); | 2494 | 0, scsi3addr, TYPE_CMD); |
2218 | else | 2495 | else |
2219 | return_code = sendcmd(CCISS_READ_CAPACITY, | 2496 | return_code = sendcmd(CCISS_READ_CAPACITY, |
2220 | ctlr, buf, sizeof(ReadCapdata_struct), | 2497 | ctlr, buf, sizeof(ReadCapdata_struct), |
2221 | 1, logvol, 0, NULL, TYPE_CMD); | 2498 | 0, scsi3addr, TYPE_CMD); |
2222 | if (return_code == IO_OK) { | 2499 | if (return_code == IO_OK) { |
2223 | *total_size = be32_to_cpu(*(__be32 *) buf->total_size); | 2500 | *total_size = be32_to_cpu(*(__be32 *) buf->total_size); |
2224 | *block_size = be32_to_cpu(*(__be32 *) buf->block_size); | 2501 | *block_size = be32_to_cpu(*(__be32 *) buf->block_size); |
@@ -2238,6 +2515,7 @@ cciss_read_capacity_16(int ctlr, int logvol, int withirq, sector_t *total_size, | |||
2238 | { | 2515 | { |
2239 | ReadCapdata_struct_16 *buf; | 2516 | ReadCapdata_struct_16 *buf; |
2240 | int return_code; | 2517 | int return_code; |
2518 | unsigned char scsi3addr[8]; | ||
2241 | 2519 | ||
2242 | buf = kzalloc(sizeof(ReadCapdata_struct_16), GFP_KERNEL); | 2520 | buf = kzalloc(sizeof(ReadCapdata_struct_16), GFP_KERNEL); |
2243 | if (!buf) { | 2521 | if (!buf) { |
@@ -2245,15 +2523,16 @@ cciss_read_capacity_16(int ctlr, int logvol, int withirq, sector_t *total_size, | |||
2245 | return; | 2523 | return; |
2246 | } | 2524 | } |
2247 | 2525 | ||
2526 | log_unit_to_scsi3addr(hba[ctlr], scsi3addr, logvol); | ||
2248 | if (withirq) { | 2527 | if (withirq) { |
2249 | return_code = sendcmd_withirq(CCISS_READ_CAPACITY_16, | 2528 | return_code = sendcmd_withirq(CCISS_READ_CAPACITY_16, |
2250 | ctlr, buf, sizeof(ReadCapdata_struct_16), | 2529 | ctlr, buf, sizeof(ReadCapdata_struct_16), |
2251 | 1, logvol, 0, TYPE_CMD); | 2530 | 0, scsi3addr, TYPE_CMD); |
2252 | } | 2531 | } |
2253 | else { | 2532 | else { |
2254 | return_code = sendcmd(CCISS_READ_CAPACITY_16, | 2533 | return_code = sendcmd(CCISS_READ_CAPACITY_16, |
2255 | ctlr, buf, sizeof(ReadCapdata_struct_16), | 2534 | ctlr, buf, sizeof(ReadCapdata_struct_16), |
2256 | 1, logvol, 0, NULL, TYPE_CMD); | 2535 | 0, scsi3addr, TYPE_CMD); |
2257 | } | 2536 | } |
2258 | if (return_code == IO_OK) { | 2537 | if (return_code == IO_OK) { |
2259 | *total_size = be64_to_cpu(*(__be64 *) buf->total_size); | 2538 | *total_size = be64_to_cpu(*(__be64 *) buf->total_size); |
@@ -2303,7 +2582,7 @@ static int cciss_revalidate(struct gendisk *disk) | |||
2303 | cciss_geometry_inquiry(h->ctlr, logvol, 1, total_size, block_size, | 2582 | cciss_geometry_inquiry(h->ctlr, logvol, 1, total_size, block_size, |
2304 | inq_buff, drv); | 2583 | inq_buff, drv); |
2305 | 2584 | ||
2306 | blk_queue_hardsect_size(drv->queue, drv->block_size); | 2585 | blk_queue_logical_block_size(drv->queue, drv->block_size); |
2307 | set_capacity(disk, drv->nr_blocks); | 2586 | set_capacity(disk, drv->nr_blocks); |
2308 | 2587 | ||
2309 | kfree(inq_buff); | 2588 | kfree(inq_buff); |
@@ -2333,86 +2612,21 @@ static unsigned long pollcomplete(int ctlr) | |||
2333 | return 1; | 2612 | return 1; |
2334 | } | 2613 | } |
2335 | 2614 | ||
2336 | static int add_sendcmd_reject(__u8 cmd, int ctlr, unsigned long complete) | 2615 | /* Send command c to controller h and poll for it to complete. |
2337 | { | 2616 | * Turns interrupts off on the board. Used at driver init time |
2338 | /* We get in here if sendcmd() is polling for completions | 2617 | * and during SCSI error recovery. |
2339 | and gets some command back that it wasn't expecting -- | ||
2340 | something other than that which it just sent down. | ||
2341 | Ordinarily, that shouldn't happen, but it can happen when | ||
2342 | the scsi tape stuff gets into error handling mode, and | ||
2343 | starts using sendcmd() to try to abort commands and | ||
2344 | reset tape drives. In that case, sendcmd may pick up | ||
2345 | completions of commands that were sent to logical drives | ||
2346 | through the block i/o system, or cciss ioctls completing, etc. | ||
2347 | In that case, we need to save those completions for later | ||
2348 | processing by the interrupt handler. | ||
2349 | */ | ||
2350 | |||
2351 | #ifdef CONFIG_CISS_SCSI_TAPE | ||
2352 | struct sendcmd_reject_list *srl = &hba[ctlr]->scsi_rejects; | ||
2353 | |||
2354 | /* If it's not the scsi tape stuff doing error handling, (abort */ | ||
2355 | /* or reset) then we don't expect anything weird. */ | ||
2356 | if (cmd != CCISS_RESET_MSG && cmd != CCISS_ABORT_MSG) { | ||
2357 | #endif | ||
2358 | printk(KERN_WARNING "cciss cciss%d: SendCmd " | ||
2359 | "Invalid command list address returned! (%lx)\n", | ||
2360 | ctlr, complete); | ||
2361 | /* not much we can do. */ | ||
2362 | #ifdef CONFIG_CISS_SCSI_TAPE | ||
2363 | return 1; | ||
2364 | } | ||
2365 | |||
2366 | /* We've sent down an abort or reset, but something else | ||
2367 | has completed */ | ||
2368 | if (srl->ncompletions >= (hba[ctlr]->nr_cmds + 2)) { | ||
2369 | /* Uh oh. No room to save it for later... */ | ||
2370 | printk(KERN_WARNING "cciss%d: Sendcmd: Invalid command addr, " | ||
2371 | "reject list overflow, command lost!\n", ctlr); | ||
2372 | return 1; | ||
2373 | } | ||
2374 | /* Save it for later */ | ||
2375 | srl->complete[srl->ncompletions] = complete; | ||
2376 | srl->ncompletions++; | ||
2377 | #endif | ||
2378 | return 0; | ||
2379 | } | ||
2380 | |||
2381 | /* | ||
2382 | * Send a command to the controller, and wait for it to complete. | ||
2383 | * Only used at init time. | ||
2384 | */ | 2618 | */ |
2385 | static int sendcmd(__u8 cmd, int ctlr, void *buff, size_t size, unsigned int use_unit_num, /* 0: address the controller, | 2619 | static int sendcmd_core(ctlr_info_t *h, CommandList_struct *c) |
2386 | 1: address logical volume log_unit, | ||
2387 | 2: periph device address is scsi3addr */ | ||
2388 | unsigned int log_unit, | ||
2389 | __u8 page_code, unsigned char *scsi3addr, int cmd_type) | ||
2390 | { | 2620 | { |
2391 | CommandList_struct *c; | ||
2392 | int i; | 2621 | int i; |
2393 | unsigned long complete; | 2622 | unsigned long complete; |
2394 | ctlr_info_t *info_p = hba[ctlr]; | 2623 | int status = IO_ERROR; |
2395 | u64bit buff_dma_handle; | 2624 | u64bit buff_dma_handle; |
2396 | int status, done = 0; | ||
2397 | 2625 | ||
2398 | if ((c = cmd_alloc(info_p, 1)) == NULL) { | 2626 | resend_cmd1: |
2399 | printk(KERN_WARNING "cciss: unable to get memory"); | 2627 | |
2400 | return IO_ERROR; | 2628 | /* Disable interrupt on the board. */ |
2401 | } | 2629 | h->access.set_intr_mask(h, CCISS_INTR_OFF); |
2402 | status = fill_cmd(c, cmd, ctlr, buff, size, use_unit_num, | ||
2403 | log_unit, page_code, scsi3addr, cmd_type); | ||
2404 | if (status != IO_OK) { | ||
2405 | cmd_free(info_p, c, 1); | ||
2406 | return status; | ||
2407 | } | ||
2408 | resend_cmd1: | ||
2409 | /* | ||
2410 | * Disable interrupt | ||
2411 | */ | ||
2412 | #ifdef CCISS_DEBUG | ||
2413 | printk(KERN_DEBUG "cciss: turning intr off\n"); | ||
2414 | #endif /* CCISS_DEBUG */ | ||
2415 | info_p->access.set_intr_mask(info_p, CCISS_INTR_OFF); | ||
2416 | 2630 | ||
2417 | /* Make sure there is room in the command FIFO */ | 2631 | /* Make sure there is room in the command FIFO */ |
2418 | /* Actually it should be completely empty at this time */ | 2632 | /* Actually it should be completely empty at this time */ |
@@ -2420,21 +2634,15 @@ static int sendcmd(__u8 cmd, int ctlr, void *buff, size_t size, unsigned int use | |||
2420 | /* tape side of the driver. */ | 2634 | /* tape side of the driver. */ |
2421 | for (i = 200000; i > 0; i--) { | 2635 | for (i = 200000; i > 0; i--) { |
2422 | /* if fifo isn't full go */ | 2636 | /* if fifo isn't full go */ |
2423 | if (!(info_p->access.fifo_full(info_p))) { | 2637 | if (!(h->access.fifo_full(h))) |
2424 | |||
2425 | break; | 2638 | break; |
2426 | } | ||
2427 | udelay(10); | 2639 | udelay(10); |
2428 | printk(KERN_WARNING "cciss cciss%d: SendCmd FIFO full," | 2640 | printk(KERN_WARNING "cciss cciss%d: SendCmd FIFO full," |
2429 | " waiting!\n", ctlr); | 2641 | " waiting!\n", h->ctlr); |
2430 | } | 2642 | } |
2431 | /* | 2643 | h->access.submit_command(h, c); /* Send the cmd */ |
2432 | * Send the cmd | ||
2433 | */ | ||
2434 | info_p->access.submit_command(info_p, c); | ||
2435 | done = 0; | ||
2436 | do { | 2644 | do { |
2437 | complete = pollcomplete(ctlr); | 2645 | complete = pollcomplete(h->ctlr); |
2438 | 2646 | ||
2439 | #ifdef CCISS_DEBUG | 2647 | #ifdef CCISS_DEBUG |
2440 | printk(KERN_DEBUG "cciss: command completed\n"); | 2648 | printk(KERN_DEBUG "cciss: command completed\n"); |
@@ -2443,97 +2651,102 @@ static int sendcmd(__u8 cmd, int ctlr, void *buff, size_t size, unsigned int use | |||
2443 | if (complete == 1) { | 2651 | if (complete == 1) { |
2444 | printk(KERN_WARNING | 2652 | printk(KERN_WARNING |
2445 | "cciss cciss%d: SendCmd Timeout out, " | 2653 | "cciss cciss%d: SendCmd Timeout out, " |
2446 | "No command list address returned!\n", ctlr); | 2654 | "No command list address returned!\n", h->ctlr); |
2447 | status = IO_ERROR; | 2655 | status = IO_ERROR; |
2448 | done = 1; | ||
2449 | break; | 2656 | break; |
2450 | } | 2657 | } |
2451 | 2658 | ||
2452 | /* This will need to change for direct lookup completions */ | 2659 | /* Make sure it's the command we're expecting. */ |
2453 | if ((complete & CISS_ERROR_BIT) | 2660 | if ((complete & ~CISS_ERROR_BIT) != c->busaddr) { |
2454 | && (complete & ~CISS_ERROR_BIT) == c->busaddr) { | 2661 | printk(KERN_WARNING "cciss%d: Unexpected command " |
2455 | /* if data overrun or underun on Report command | 2662 | "completion.\n", h->ctlr); |
2456 | ignore it | 2663 | continue; |
2457 | */ | 2664 | } |
2458 | if (((c->Request.CDB[0] == CISS_REPORT_LOG) || | 2665 | |
2459 | (c->Request.CDB[0] == CISS_REPORT_PHYS) || | 2666 | /* It is our command. If no error, we're done. */ |
2460 | (c->Request.CDB[0] == CISS_INQUIRY)) && | 2667 | if (!(complete & CISS_ERROR_BIT)) { |
2461 | ((c->err_info->CommandStatus == | 2668 | status = IO_OK; |
2462 | CMD_DATA_OVERRUN) || | 2669 | break; |
2463 | (c->err_info->CommandStatus == CMD_DATA_UNDERRUN) | ||
2464 | )) { | ||
2465 | complete = c->busaddr; | ||
2466 | } else { | ||
2467 | if (c->err_info->CommandStatus == | ||
2468 | CMD_UNSOLICITED_ABORT) { | ||
2469 | printk(KERN_WARNING "cciss%d: " | ||
2470 | "unsolicited abort %p\n", | ||
2471 | ctlr, c); | ||
2472 | if (c->retry_count < MAX_CMD_RETRIES) { | ||
2473 | printk(KERN_WARNING | ||
2474 | "cciss%d: retrying %p\n", | ||
2475 | ctlr, c); | ||
2476 | c->retry_count++; | ||
2477 | /* erase the old error */ | ||
2478 | /* information */ | ||
2479 | memset(c->err_info, 0, | ||
2480 | sizeof | ||
2481 | (ErrorInfo_struct)); | ||
2482 | goto resend_cmd1; | ||
2483 | } else { | ||
2484 | printk(KERN_WARNING | ||
2485 | "cciss%d: retried %p too " | ||
2486 | "many times\n", ctlr, c); | ||
2487 | status = IO_ERROR; | ||
2488 | goto cleanup1; | ||
2489 | } | ||
2490 | } else if (c->err_info->CommandStatus == | ||
2491 | CMD_UNABORTABLE) { | ||
2492 | printk(KERN_WARNING | ||
2493 | "cciss%d: command could not be aborted.\n", | ||
2494 | ctlr); | ||
2495 | status = IO_ERROR; | ||
2496 | goto cleanup1; | ||
2497 | } | ||
2498 | printk(KERN_WARNING "ciss ciss%d: sendcmd" | ||
2499 | " Error %x \n", ctlr, | ||
2500 | c->err_info->CommandStatus); | ||
2501 | printk(KERN_WARNING "ciss ciss%d: sendcmd" | ||
2502 | " offensive info\n" | ||
2503 | " size %x\n num %x value %x\n", | ||
2504 | ctlr, | ||
2505 | c->err_info->MoreErrInfo.Invalid_Cmd. | ||
2506 | offense_size, | ||
2507 | c->err_info->MoreErrInfo.Invalid_Cmd. | ||
2508 | offense_num, | ||
2509 | c->err_info->MoreErrInfo.Invalid_Cmd. | ||
2510 | offense_value); | ||
2511 | status = IO_ERROR; | ||
2512 | goto cleanup1; | ||
2513 | } | ||
2514 | } | 2670 | } |
2515 | /* This will need changing for direct lookup completions */ | 2671 | |
2516 | if (complete != c->busaddr) { | 2672 | /* There is an error... */ |
2517 | if (add_sendcmd_reject(cmd, ctlr, complete) != 0) { | 2673 | |
2518 | BUG(); /* we are pretty much hosed if we get here. */ | 2674 | /* if data overrun or underun on Report command ignore it */ |
2675 | if (((c->Request.CDB[0] == CISS_REPORT_LOG) || | ||
2676 | (c->Request.CDB[0] == CISS_REPORT_PHYS) || | ||
2677 | (c->Request.CDB[0] == CISS_INQUIRY)) && | ||
2678 | ((c->err_info->CommandStatus == CMD_DATA_OVERRUN) || | ||
2679 | (c->err_info->CommandStatus == CMD_DATA_UNDERRUN))) { | ||
2680 | complete = c->busaddr; | ||
2681 | status = IO_OK; | ||
2682 | break; | ||
2683 | } | ||
2684 | |||
2685 | if (c->err_info->CommandStatus == CMD_UNSOLICITED_ABORT) { | ||
2686 | printk(KERN_WARNING "cciss%d: unsolicited abort %p\n", | ||
2687 | h->ctlr, c); | ||
2688 | if (c->retry_count < MAX_CMD_RETRIES) { | ||
2689 | printk(KERN_WARNING "cciss%d: retrying %p\n", | ||
2690 | h->ctlr, c); | ||
2691 | c->retry_count++; | ||
2692 | /* erase the old error information */ | ||
2693 | memset(c->err_info, 0, sizeof(c->err_info)); | ||
2694 | goto resend_cmd1; | ||
2519 | } | 2695 | } |
2520 | continue; | 2696 | printk(KERN_WARNING "cciss%d: retried %p too many " |
2521 | } else | 2697 | "times\n", h->ctlr, c); |
2522 | done = 1; | 2698 | status = IO_ERROR; |
2523 | } while (!done); | 2699 | break; |
2700 | } | ||
2701 | |||
2702 | if (c->err_info->CommandStatus == CMD_UNABORTABLE) { | ||
2703 | printk(KERN_WARNING "cciss%d: command could not be " | ||
2704 | "aborted.\n", h->ctlr); | ||
2705 | status = IO_ERROR; | ||
2706 | break; | ||
2707 | } | ||
2708 | |||
2709 | if (c->err_info->CommandStatus == CMD_TARGET_STATUS) { | ||
2710 | status = check_target_status(h, c); | ||
2711 | break; | ||
2712 | } | ||
2713 | |||
2714 | printk(KERN_WARNING "cciss%d: sendcmd error\n", h->ctlr); | ||
2715 | printk(KERN_WARNING "cmd = 0x%02x, CommandStatus = 0x%02x\n", | ||
2716 | c->Request.CDB[0], c->err_info->CommandStatus); | ||
2717 | status = IO_ERROR; | ||
2718 | break; | ||
2719 | |||
2720 | } while (1); | ||
2524 | 2721 | ||
2525 | cleanup1: | ||
2526 | /* unlock the data buffer from DMA */ | 2722 | /* unlock the data buffer from DMA */ |
2527 | buff_dma_handle.val32.lower = c->SG[0].Addr.lower; | 2723 | buff_dma_handle.val32.lower = c->SG[0].Addr.lower; |
2528 | buff_dma_handle.val32.upper = c->SG[0].Addr.upper; | 2724 | buff_dma_handle.val32.upper = c->SG[0].Addr.upper; |
2529 | pci_unmap_single(info_p->pdev, (dma_addr_t) buff_dma_handle.val, | 2725 | pci_unmap_single(h->pdev, (dma_addr_t) buff_dma_handle.val, |
2530 | c->SG[0].Len, PCI_DMA_BIDIRECTIONAL); | 2726 | c->SG[0].Len, PCI_DMA_BIDIRECTIONAL); |
2531 | #ifdef CONFIG_CISS_SCSI_TAPE | 2727 | return status; |
2532 | /* if we saved some commands for later, process them now. */ | 2728 | } |
2533 | if (info_p->scsi_rejects.ncompletions > 0) | 2729 | |
2534 | do_cciss_intr(0, info_p); | 2730 | /* |
2535 | #endif | 2731 | * Send a command to the controller, and wait for it to complete. |
2536 | cmd_free(info_p, c, 1); | 2732 | * Used at init time, and during SCSI error recovery. |
2733 | */ | ||
2734 | static int sendcmd(__u8 cmd, int ctlr, void *buff, size_t size, | ||
2735 | __u8 page_code, unsigned char *scsi3addr, int cmd_type) | ||
2736 | { | ||
2737 | CommandList_struct *c; | ||
2738 | int status; | ||
2739 | |||
2740 | c = cmd_alloc(hba[ctlr], 1); | ||
2741 | if (!c) { | ||
2742 | printk(KERN_WARNING "cciss: unable to get memory"); | ||
2743 | return IO_ERROR; | ||
2744 | } | ||
2745 | status = fill_cmd(c, cmd, ctlr, buff, size, page_code, | ||
2746 | scsi3addr, cmd_type); | ||
2747 | if (status == IO_OK) | ||
2748 | status = sendcmd_core(hba[ctlr], c); | ||
2749 | cmd_free(hba[ctlr], c, 1); | ||
2537 | return status; | 2750 | return status; |
2538 | } | 2751 | } |
2539 | 2752 | ||
@@ -2691,7 +2904,7 @@ static inline void complete_command(ctlr_info_t *h, CommandList_struct *cmd, | |||
2691 | printk(KERN_WARNING "cciss: cmd %p has" | 2904 | printk(KERN_WARNING "cciss: cmd %p has" |
2692 | " completed with data underrun " | 2905 | " completed with data underrun " |
2693 | "reported\n", cmd); | 2906 | "reported\n", cmd); |
2694 | cmd->rq->data_len = cmd->err_info->ResidualCnt; | 2907 | cmd->rq->resid_len = cmd->err_info->ResidualCnt; |
2695 | } | 2908 | } |
2696 | break; | 2909 | break; |
2697 | case CMD_DATA_OVERRUN: | 2910 | case CMD_DATA_OVERRUN: |
@@ -2806,7 +3019,7 @@ static void do_cciss_request(struct request_queue *q) | |||
2806 | goto startio; | 3019 | goto startio; |
2807 | 3020 | ||
2808 | queue: | 3021 | queue: |
2809 | creq = elv_next_request(q); | 3022 | creq = blk_peek_request(q); |
2810 | if (!creq) | 3023 | if (!creq) |
2811 | goto startio; | 3024 | goto startio; |
2812 | 3025 | ||
@@ -2815,7 +3028,7 @@ static void do_cciss_request(struct request_queue *q) | |||
2815 | if ((c = cmd_alloc(h, 1)) == NULL) | 3028 | if ((c = cmd_alloc(h, 1)) == NULL) |
2816 | goto full; | 3029 | goto full; |
2817 | 3030 | ||
2818 | blkdev_dequeue_request(creq); | 3031 | blk_start_request(creq); |
2819 | 3032 | ||
2820 | spin_unlock_irq(q->queue_lock); | 3033 | spin_unlock_irq(q->queue_lock); |
2821 | 3034 | ||
@@ -2840,10 +3053,10 @@ static void do_cciss_request(struct request_queue *q) | |||
2840 | c->Request.Timeout = 0; // Don't time out | 3053 | c->Request.Timeout = 0; // Don't time out |
2841 | c->Request.CDB[0] = | 3054 | c->Request.CDB[0] = |
2842 | (rq_data_dir(creq) == READ) ? h->cciss_read : h->cciss_write; | 3055 | (rq_data_dir(creq) == READ) ? h->cciss_read : h->cciss_write; |
2843 | start_blk = creq->sector; | 3056 | start_blk = blk_rq_pos(creq); |
2844 | #ifdef CCISS_DEBUG | 3057 | #ifdef CCISS_DEBUG |
2845 | printk(KERN_DEBUG "ciss: sector =%d nr_sectors=%d\n", (int)creq->sector, | 3058 | printk(KERN_DEBUG "ciss: sector =%d nr_sectors=%d\n", |
2846 | (int)creq->nr_sectors); | 3059 | (int)blk_rq_pos(creq), (int)blk_rq_sectors(creq)); |
2847 | #endif /* CCISS_DEBUG */ | 3060 | #endif /* CCISS_DEBUG */ |
2848 | 3061 | ||
2849 | sg_init_table(tmp_sg, MAXSGENTRIES); | 3062 | sg_init_table(tmp_sg, MAXSGENTRIES); |
@@ -2869,8 +3082,8 @@ static void do_cciss_request(struct request_queue *q) | |||
2869 | h->maxSG = seg; | 3082 | h->maxSG = seg; |
2870 | 3083 | ||
2871 | #ifdef CCISS_DEBUG | 3084 | #ifdef CCISS_DEBUG |
2872 | printk(KERN_DEBUG "cciss: Submitting %lu sectors in %d segments\n", | 3085 | printk(KERN_DEBUG "cciss: Submitting %u sectors in %d segments\n", |
2873 | creq->nr_sectors, seg); | 3086 | blk_rq_sectors(creq), seg); |
2874 | #endif /* CCISS_DEBUG */ | 3087 | #endif /* CCISS_DEBUG */ |
2875 | 3088 | ||
2876 | c->Header.SGList = c->Header.SGTotal = seg; | 3089 | c->Header.SGList = c->Header.SGTotal = seg; |
@@ -2882,8 +3095,8 @@ static void do_cciss_request(struct request_queue *q) | |||
2882 | c->Request.CDB[4] = (start_blk >> 8) & 0xff; | 3095 | c->Request.CDB[4] = (start_blk >> 8) & 0xff; |
2883 | c->Request.CDB[5] = start_blk & 0xff; | 3096 | c->Request.CDB[5] = start_blk & 0xff; |
2884 | c->Request.CDB[6] = 0; // (sect >> 24) & 0xff; MSB | 3097 | c->Request.CDB[6] = 0; // (sect >> 24) & 0xff; MSB |
2885 | c->Request.CDB[7] = (creq->nr_sectors >> 8) & 0xff; | 3098 | c->Request.CDB[7] = (blk_rq_sectors(creq) >> 8) & 0xff; |
2886 | c->Request.CDB[8] = creq->nr_sectors & 0xff; | 3099 | c->Request.CDB[8] = blk_rq_sectors(creq) & 0xff; |
2887 | c->Request.CDB[9] = c->Request.CDB[11] = c->Request.CDB[12] = 0; | 3100 | c->Request.CDB[9] = c->Request.CDB[11] = c->Request.CDB[12] = 0; |
2888 | } else { | 3101 | } else { |
2889 | u32 upper32 = upper_32_bits(start_blk); | 3102 | u32 upper32 = upper_32_bits(start_blk); |
@@ -2898,10 +3111,10 @@ static void do_cciss_request(struct request_queue *q) | |||
2898 | c->Request.CDB[7]= (start_blk >> 16) & 0xff; | 3111 | c->Request.CDB[7]= (start_blk >> 16) & 0xff; |
2899 | c->Request.CDB[8]= (start_blk >> 8) & 0xff; | 3112 | c->Request.CDB[8]= (start_blk >> 8) & 0xff; |
2900 | c->Request.CDB[9]= start_blk & 0xff; | 3113 | c->Request.CDB[9]= start_blk & 0xff; |
2901 | c->Request.CDB[10]= (creq->nr_sectors >> 24) & 0xff; | 3114 | c->Request.CDB[10]= (blk_rq_sectors(creq) >> 24) & 0xff; |
2902 | c->Request.CDB[11]= (creq->nr_sectors >> 16) & 0xff; | 3115 | c->Request.CDB[11]= (blk_rq_sectors(creq) >> 16) & 0xff; |
2903 | c->Request.CDB[12]= (creq->nr_sectors >> 8) & 0xff; | 3116 | c->Request.CDB[12]= (blk_rq_sectors(creq) >> 8) & 0xff; |
2904 | c->Request.CDB[13]= creq->nr_sectors & 0xff; | 3117 | c->Request.CDB[13]= blk_rq_sectors(creq) & 0xff; |
2905 | c->Request.CDB[14] = c->Request.CDB[15] = 0; | 3118 | c->Request.CDB[14] = c->Request.CDB[15] = 0; |
2906 | } | 3119 | } |
2907 | } else if (blk_pc_request(creq)) { | 3120 | } else if (blk_pc_request(creq)) { |
@@ -2931,44 +3144,18 @@ startio: | |||
2931 | 3144 | ||
2932 | static inline unsigned long get_next_completion(ctlr_info_t *h) | 3145 | static inline unsigned long get_next_completion(ctlr_info_t *h) |
2933 | { | 3146 | { |
2934 | #ifdef CONFIG_CISS_SCSI_TAPE | ||
2935 | /* Any rejects from sendcmd() lying around? Process them first */ | ||
2936 | if (h->scsi_rejects.ncompletions == 0) | ||
2937 | return h->access.command_completed(h); | ||
2938 | else { | ||
2939 | struct sendcmd_reject_list *srl; | ||
2940 | int n; | ||
2941 | srl = &h->scsi_rejects; | ||
2942 | n = --srl->ncompletions; | ||
2943 | /* printk("cciss%d: processing saved reject\n", h->ctlr); */ | ||
2944 | printk("p"); | ||
2945 | return srl->complete[n]; | ||
2946 | } | ||
2947 | #else | ||
2948 | return h->access.command_completed(h); | 3147 | return h->access.command_completed(h); |
2949 | #endif | ||
2950 | } | 3148 | } |
2951 | 3149 | ||
2952 | static inline int interrupt_pending(ctlr_info_t *h) | 3150 | static inline int interrupt_pending(ctlr_info_t *h) |
2953 | { | 3151 | { |
2954 | #ifdef CONFIG_CISS_SCSI_TAPE | ||
2955 | return (h->access.intr_pending(h) | ||
2956 | || (h->scsi_rejects.ncompletions > 0)); | ||
2957 | #else | ||
2958 | return h->access.intr_pending(h); | 3152 | return h->access.intr_pending(h); |
2959 | #endif | ||
2960 | } | 3153 | } |
2961 | 3154 | ||
2962 | static inline long interrupt_not_for_us(ctlr_info_t *h) | 3155 | static inline long interrupt_not_for_us(ctlr_info_t *h) |
2963 | { | 3156 | { |
2964 | #ifdef CONFIG_CISS_SCSI_TAPE | ||
2965 | return (((h->access.intr_pending(h) == 0) || | ||
2966 | (h->interrupts_enabled == 0)) | ||
2967 | && (h->scsi_rejects.ncompletions == 0)); | ||
2968 | #else | ||
2969 | return (((h->access.intr_pending(h) == 0) || | 3157 | return (((h->access.intr_pending(h) == 0) || |
2970 | (h->interrupts_enabled == 0))); | 3158 | (h->interrupts_enabled == 0))); |
2971 | #endif | ||
2972 | } | 3159 | } |
2973 | 3160 | ||
2974 | static irqreturn_t do_cciss_intr(int irq, void *dev_id) | 3161 | static irqreturn_t do_cciss_intr(int irq, void *dev_id) |
@@ -3723,12 +3910,15 @@ static int __devinit cciss_init_one(struct pci_dev *pdev, | |||
3723 | INIT_HLIST_HEAD(&hba[i]->reqQ); | 3910 | INIT_HLIST_HEAD(&hba[i]->reqQ); |
3724 | 3911 | ||
3725 | if (cciss_pci_init(hba[i], pdev) != 0) | 3912 | if (cciss_pci_init(hba[i], pdev) != 0) |
3726 | goto clean1; | 3913 | goto clean0; |
3727 | 3914 | ||
3728 | sprintf(hba[i]->devname, "cciss%d", i); | 3915 | sprintf(hba[i]->devname, "cciss%d", i); |
3729 | hba[i]->ctlr = i; | 3916 | hba[i]->ctlr = i; |
3730 | hba[i]->pdev = pdev; | 3917 | hba[i]->pdev = pdev; |
3731 | 3918 | ||
3919 | if (cciss_create_hba_sysfs_entry(hba[i])) | ||
3920 | goto clean0; | ||
3921 | |||
3732 | /* configure PCI DMA stuff */ | 3922 | /* configure PCI DMA stuff */ |
3733 | if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) | 3923 | if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) |
3734 | dac = 1; | 3924 | dac = 1; |
@@ -3787,15 +3977,6 @@ static int __devinit cciss_init_one(struct pci_dev *pdev, | |||
3787 | printk(KERN_ERR "cciss: out of memory"); | 3977 | printk(KERN_ERR "cciss: out of memory"); |
3788 | goto clean4; | 3978 | goto clean4; |
3789 | } | 3979 | } |
3790 | #ifdef CONFIG_CISS_SCSI_TAPE | ||
3791 | hba[i]->scsi_rejects.complete = | ||
3792 | kmalloc(sizeof(hba[i]->scsi_rejects.complete[0]) * | ||
3793 | (hba[i]->nr_cmds + 5), GFP_KERNEL); | ||
3794 | if (hba[i]->scsi_rejects.complete == NULL) { | ||
3795 | printk(KERN_ERR "cciss: out of memory"); | ||
3796 | goto clean4; | ||
3797 | } | ||
3798 | #endif | ||
3799 | spin_lock_init(&hba[i]->lock); | 3980 | spin_lock_init(&hba[i]->lock); |
3800 | 3981 | ||
3801 | /* Initialize the pdev driver private data. | 3982 | /* Initialize the pdev driver private data. |
@@ -3828,7 +4009,7 @@ static int __devinit cciss_init_one(struct pci_dev *pdev, | |||
3828 | } | 4009 | } |
3829 | 4010 | ||
3830 | return_code = sendcmd_withirq(CISS_INQUIRY, i, inq_buff, | 4011 | return_code = sendcmd_withirq(CISS_INQUIRY, i, inq_buff, |
3831 | sizeof(InquiryData_struct), 0, 0 , 0, TYPE_CMD); | 4012 | sizeof(InquiryData_struct), 0, CTLR_LUNID, TYPE_CMD); |
3832 | if (return_code == IO_OK) { | 4013 | if (return_code == IO_OK) { |
3833 | hba[i]->firm_ver[0] = inq_buff->data_byte[32]; | 4014 | hba[i]->firm_ver[0] = inq_buff->data_byte[32]; |
3834 | hba[i]->firm_ver[1] = inq_buff->data_byte[33]; | 4015 | hba[i]->firm_ver[1] = inq_buff->data_byte[33]; |
@@ -3855,9 +4036,6 @@ static int __devinit cciss_init_one(struct pci_dev *pdev, | |||
3855 | 4036 | ||
3856 | clean4: | 4037 | clean4: |
3857 | kfree(inq_buff); | 4038 | kfree(inq_buff); |
3858 | #ifdef CONFIG_CISS_SCSI_TAPE | ||
3859 | kfree(hba[i]->scsi_rejects.complete); | ||
3860 | #endif | ||
3861 | kfree(hba[i]->cmd_pool_bits); | 4039 | kfree(hba[i]->cmd_pool_bits); |
3862 | if (hba[i]->cmd_pool) | 4040 | if (hba[i]->cmd_pool) |
3863 | pci_free_consistent(hba[i]->pdev, | 4041 | pci_free_consistent(hba[i]->pdev, |
@@ -3872,6 +4050,8 @@ clean4: | |||
3872 | clean2: | 4050 | clean2: |
3873 | unregister_blkdev(hba[i]->major, hba[i]->devname); | 4051 | unregister_blkdev(hba[i]->major, hba[i]->devname); |
3874 | clean1: | 4052 | clean1: |
4053 | cciss_destroy_hba_sysfs_entry(hba[i]); | ||
4054 | clean0: | ||
3875 | hba[i]->busy_initializing = 0; | 4055 | hba[i]->busy_initializing = 0; |
3876 | /* cleanup any queues that may have been initialized */ | 4056 | /* cleanup any queues that may have been initialized */ |
3877 | for (j=0; j <= hba[i]->highest_lun; j++){ | 4057 | for (j=0; j <= hba[i]->highest_lun; j++){ |
@@ -3907,8 +4087,8 @@ static void cciss_shutdown(struct pci_dev *pdev) | |||
3907 | /* sendcmd will turn off interrupt, and send the flush... | 4087 | /* sendcmd will turn off interrupt, and send the flush... |
3908 | * To write all data in the battery backed cache to disks */ | 4088 | * To write all data in the battery backed cache to disks */ |
3909 | memset(flush_buf, 0, 4); | 4089 | memset(flush_buf, 0, 4); |
3910 | return_code = sendcmd(CCISS_CACHE_FLUSH, i, flush_buf, 4, 0, 0, 0, NULL, | 4090 | return_code = sendcmd(CCISS_CACHE_FLUSH, i, flush_buf, 4, 0, |
3911 | TYPE_CMD); | 4091 | CTLR_LUNID, TYPE_CMD); |
3912 | if (return_code == IO_OK) { | 4092 | if (return_code == IO_OK) { |
3913 | printk(KERN_INFO "Completed flushing cache on controller %d\n", i); | 4093 | printk(KERN_INFO "Completed flushing cache on controller %d\n", i); |
3914 | } else { | 4094 | } else { |
@@ -3973,15 +4153,13 @@ static void __devexit cciss_remove_one(struct pci_dev *pdev) | |||
3973 | pci_free_consistent(hba[i]->pdev, hba[i]->nr_cmds * sizeof(ErrorInfo_struct), | 4153 | pci_free_consistent(hba[i]->pdev, hba[i]->nr_cmds * sizeof(ErrorInfo_struct), |
3974 | hba[i]->errinfo_pool, hba[i]->errinfo_pool_dhandle); | 4154 | hba[i]->errinfo_pool, hba[i]->errinfo_pool_dhandle); |
3975 | kfree(hba[i]->cmd_pool_bits); | 4155 | kfree(hba[i]->cmd_pool_bits); |
3976 | #ifdef CONFIG_CISS_SCSI_TAPE | ||
3977 | kfree(hba[i]->scsi_rejects.complete); | ||
3978 | #endif | ||
3979 | /* | 4156 | /* |
3980 | * Deliberately omit pci_disable_device(): it does something nasty to | 4157 | * Deliberately omit pci_disable_device(): it does something nasty to |
3981 | * Smart Array controllers that pci_enable_device does not undo | 4158 | * Smart Array controllers that pci_enable_device does not undo |
3982 | */ | 4159 | */ |
3983 | pci_release_regions(pdev); | 4160 | pci_release_regions(pdev); |
3984 | pci_set_drvdata(pdev, NULL); | 4161 | pci_set_drvdata(pdev, NULL); |
4162 | cciss_destroy_hba_sysfs_entry(hba[i]); | ||
3985 | free_hba(i); | 4163 | free_hba(i); |
3986 | } | 4164 | } |
3987 | 4165 | ||
@@ -3999,6 +4177,8 @@ static struct pci_driver cciss_pci_driver = { | |||
3999 | */ | 4177 | */ |
4000 | static int __init cciss_init(void) | 4178 | static int __init cciss_init(void) |
4001 | { | 4179 | { |
4180 | int err; | ||
4181 | |||
4002 | /* | 4182 | /* |
4003 | * The hardware requires that commands are aligned on a 64-bit | 4183 | * The hardware requires that commands are aligned on a 64-bit |
4004 | * boundary. Given that we use pci_alloc_consistent() to allocate an | 4184 | * boundary. Given that we use pci_alloc_consistent() to allocate an |
@@ -4008,8 +4188,20 @@ static int __init cciss_init(void) | |||
4008 | 4188 | ||
4009 | printk(KERN_INFO DRIVER_NAME "\n"); | 4189 | printk(KERN_INFO DRIVER_NAME "\n"); |
4010 | 4190 | ||
4191 | err = bus_register(&cciss_bus_type); | ||
4192 | if (err) | ||
4193 | return err; | ||
4194 | |||
4011 | /* Register for our PCI devices */ | 4195 | /* Register for our PCI devices */ |
4012 | return pci_register_driver(&cciss_pci_driver); | 4196 | err = pci_register_driver(&cciss_pci_driver); |
4197 | if (err) | ||
4198 | goto err_bus_register; | ||
4199 | |||
4200 | return 0; | ||
4201 | |||
4202 | err_bus_register: | ||
4203 | bus_unregister(&cciss_bus_type); | ||
4204 | return err; | ||
4013 | } | 4205 | } |
4014 | 4206 | ||
4015 | static void __exit cciss_cleanup(void) | 4207 | static void __exit cciss_cleanup(void) |
@@ -4026,6 +4218,7 @@ static void __exit cciss_cleanup(void) | |||
4026 | } | 4218 | } |
4027 | } | 4219 | } |
4028 | remove_proc_entry("driver/cciss", NULL); | 4220 | remove_proc_entry("driver/cciss", NULL); |
4221 | bus_unregister(&cciss_bus_type); | ||
4029 | } | 4222 | } |
4030 | 4223 | ||
4031 | static void fail_all_cmds(unsigned long ctlr) | 4224 | static void fail_all_cmds(unsigned long ctlr) |