diff options
Diffstat (limited to 'drivers/scsi')
35 files changed, 261 insertions, 86 deletions
diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig index c7f06298bd3c..4e0322b1c1ea 100644 --- a/drivers/scsi/Kconfig +++ b/drivers/scsi/Kconfig | |||
| @@ -63,7 +63,7 @@ comment "SCSI support type (disk, tape, CD-ROM)" | |||
| 63 | config BLK_DEV_SD | 63 | config BLK_DEV_SD |
| 64 | tristate "SCSI disk support" | 64 | tristate "SCSI disk support" |
| 65 | depends on SCSI | 65 | depends on SCSI |
| 66 | select CRC_T10DIF | 66 | select CRC_T10DIF if BLK_DEV_INTEGRITY |
| 67 | ---help--- | 67 | ---help--- |
| 68 | If you want to use SCSI hard disks, Fibre Channel disks, | 68 | If you want to use SCSI hard disks, Fibre Channel disks, |
| 69 | Serial ATA (SATA) or Parallel ATA (PATA) hard disks, | 69 | Serial ATA (SATA) or Parallel ATA (PATA) hard disks, |
diff --git a/drivers/scsi/arm/acornscsi-io.S b/drivers/scsi/arm/acornscsi-io.S index 5cebe3105260..22171b2110a8 100644 --- a/drivers/scsi/arm/acornscsi-io.S +++ b/drivers/scsi/arm/acornscsi-io.S | |||
| @@ -8,7 +8,7 @@ | |||
| 8 | #include <linux/linkage.h> | 8 | #include <linux/linkage.h> |
| 9 | 9 | ||
| 10 | #include <asm/assembler.h> | 10 | #include <asm/assembler.h> |
| 11 | #include <asm/hardware.h> | 11 | #include <mach/hardware.h> |
| 12 | 12 | ||
| 13 | #if defined(__APCS_32__) | 13 | #if defined(__APCS_32__) |
| 14 | #define LOADREGS(t,r,l...) ldm##t r, l | 14 | #define LOADREGS(t,r,l...) ldm##t r, l |
diff --git a/drivers/scsi/device_handler/scsi_dh_alua.c b/drivers/scsi/device_handler/scsi_dh_alua.c index fcdd73f25625..708e475896b9 100644 --- a/drivers/scsi/device_handler/scsi_dh_alua.c +++ b/drivers/scsi/device_handler/scsi_dh_alua.c | |||
| @@ -425,7 +425,7 @@ static int alua_check_sense(struct scsi_device *sdev, | |||
| 425 | /* | 425 | /* |
| 426 | * LUN Not Accessible - ALUA state transition | 426 | * LUN Not Accessible - ALUA state transition |
| 427 | */ | 427 | */ |
| 428 | return NEEDS_RETRY; | 428 | return ADD_TO_MLQUEUE; |
| 429 | if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0x0b) | 429 | if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0x0b) |
| 430 | /* | 430 | /* |
| 431 | * LUN Not Accessible -- Target port in standby state | 431 | * LUN Not Accessible -- Target port in standby state |
| @@ -447,18 +447,18 @@ static int alua_check_sense(struct scsi_device *sdev, | |||
| 447 | /* | 447 | /* |
| 448 | * Power On, Reset, or Bus Device Reset, just retry. | 448 | * Power On, Reset, or Bus Device Reset, just retry. |
| 449 | */ | 449 | */ |
| 450 | return NEEDS_RETRY; | 450 | return ADD_TO_MLQUEUE; |
| 451 | if (sense_hdr->asc == 0x2a && sense_hdr->ascq == 0x06) { | 451 | if (sense_hdr->asc == 0x2a && sense_hdr->ascq == 0x06) { |
| 452 | /* | 452 | /* |
| 453 | * ALUA state changed | 453 | * ALUA state changed |
| 454 | */ | 454 | */ |
| 455 | return NEEDS_RETRY; | 455 | return ADD_TO_MLQUEUE; |
| 456 | } | 456 | } |
| 457 | if (sense_hdr->asc == 0x2a && sense_hdr->ascq == 0x07) { | 457 | if (sense_hdr->asc == 0x2a && sense_hdr->ascq == 0x07) { |
| 458 | /* | 458 | /* |
| 459 | * Implicit ALUA state transition failed | 459 | * Implicit ALUA state transition failed |
| 460 | */ | 460 | */ |
| 461 | return NEEDS_RETRY; | 461 | return ADD_TO_MLQUEUE; |
| 462 | } | 462 | } |
| 463 | break; | 463 | break; |
| 464 | } | 464 | } |
| @@ -490,7 +490,7 @@ static int alua_stpg(struct scsi_device *sdev, int state, | |||
| 490 | if (!err) | 490 | if (!err) |
| 491 | return SCSI_DH_IO; | 491 | return SCSI_DH_IO; |
| 492 | err = alua_check_sense(sdev, &sense_hdr); | 492 | err = alua_check_sense(sdev, &sense_hdr); |
| 493 | if (retry > 0 && err == NEEDS_RETRY) { | 493 | if (retry > 0 && err == ADD_TO_MLQUEUE) { |
| 494 | retry--; | 494 | retry--; |
| 495 | goto retry; | 495 | goto retry; |
| 496 | } | 496 | } |
| @@ -535,7 +535,7 @@ static int alua_rtpg(struct scsi_device *sdev, struct alua_dh_data *h) | |||
| 535 | return SCSI_DH_IO; | 535 | return SCSI_DH_IO; |
| 536 | 536 | ||
| 537 | err = alua_check_sense(sdev, &sense_hdr); | 537 | err = alua_check_sense(sdev, &sense_hdr); |
| 538 | if (err == NEEDS_RETRY) | 538 | if (err == ADD_TO_MLQUEUE) |
| 539 | goto retry; | 539 | goto retry; |
| 540 | sdev_printk(KERN_INFO, sdev, | 540 | sdev_printk(KERN_INFO, sdev, |
| 541 | "%s: rtpg sense code %02x/%02x/%02x\n", | 541 | "%s: rtpg sense code %02x/%02x/%02x\n", |
| @@ -680,7 +680,7 @@ static int alua_prep_fn(struct scsi_device *sdev, struct request *req) | |||
| 680 | 680 | ||
| 681 | } | 681 | } |
| 682 | 682 | ||
| 683 | const struct scsi_dh_devlist alua_dev_list[] = { | 683 | static const struct scsi_dh_devlist alua_dev_list[] = { |
| 684 | {"HP", "MSA VOLUME" }, | 684 | {"HP", "MSA VOLUME" }, |
| 685 | {"HP", "HSV101" }, | 685 | {"HP", "HSV101" }, |
| 686 | {"HP", "HSV111" }, | 686 | {"HP", "HSV111" }, |
diff --git a/drivers/scsi/device_handler/scsi_dh_emc.c b/drivers/scsi/device_handler/scsi_dh_emc.c index aa46b131b20e..ef693e8412e9 100644 --- a/drivers/scsi/device_handler/scsi_dh_emc.c +++ b/drivers/scsi/device_handler/scsi_dh_emc.c | |||
| @@ -439,7 +439,7 @@ static int clariion_check_sense(struct scsi_device *sdev, | |||
| 439 | * Unit Attention Code. This is the first IO | 439 | * Unit Attention Code. This is the first IO |
| 440 | * to the new path, so just retry. | 440 | * to the new path, so just retry. |
| 441 | */ | 441 | */ |
| 442 | return NEEDS_RETRY; | 442 | return ADD_TO_MLQUEUE; |
| 443 | break; | 443 | break; |
| 444 | } | 444 | } |
| 445 | 445 | ||
| @@ -514,7 +514,7 @@ retry: | |||
| 514 | return SCSI_DH_IO; | 514 | return SCSI_DH_IO; |
| 515 | 515 | ||
| 516 | err = clariion_check_sense(sdev, &sshdr); | 516 | err = clariion_check_sense(sdev, &sshdr); |
| 517 | if (retry > 0 && err == NEEDS_RETRY) { | 517 | if (retry > 0 && err == ADD_TO_MLQUEUE) { |
| 518 | retry--; | 518 | retry--; |
| 519 | goto retry; | 519 | goto retry; |
| 520 | } | 520 | } |
| @@ -562,7 +562,7 @@ done: | |||
| 562 | return result; | 562 | return result; |
| 563 | } | 563 | } |
| 564 | 564 | ||
| 565 | const struct scsi_dh_devlist clariion_dev_list[] = { | 565 | static const struct scsi_dh_devlist clariion_dev_list[] = { |
| 566 | {"DGC", "RAID"}, | 566 | {"DGC", "RAID"}, |
| 567 | {"DGC", "DISK"}, | 567 | {"DGC", "DISK"}, |
| 568 | {"DGC", "VRAID"}, | 568 | {"DGC", "VRAID"}, |
diff --git a/drivers/scsi/device_handler/scsi_dh_hp_sw.c b/drivers/scsi/device_handler/scsi_dh_hp_sw.c index 9c7a1f8ebb72..a6a4ef3ad51c 100644 --- a/drivers/scsi/device_handler/scsi_dh_hp_sw.c +++ b/drivers/scsi/device_handler/scsi_dh_hp_sw.c | |||
| @@ -282,7 +282,7 @@ static int hp_sw_activate(struct scsi_device *sdev) | |||
| 282 | return ret; | 282 | return ret; |
| 283 | } | 283 | } |
| 284 | 284 | ||
| 285 | const struct scsi_dh_devlist hp_sw_dh_data_list[] = { | 285 | static const struct scsi_dh_devlist hp_sw_dh_data_list[] = { |
| 286 | {"COMPAQ", "MSA1000 VOLUME"}, | 286 | {"COMPAQ", "MSA1000 VOLUME"}, |
| 287 | {"COMPAQ", "HSV110"}, | 287 | {"COMPAQ", "HSV110"}, |
| 288 | {"HP", "HSV100"}, | 288 | {"HP", "HSV100"}, |
diff --git a/drivers/scsi/device_handler/scsi_dh_rdac.c b/drivers/scsi/device_handler/scsi_dh_rdac.c index b093a501f8ae..6e2f130d56de 100644 --- a/drivers/scsi/device_handler/scsi_dh_rdac.c +++ b/drivers/scsi/device_handler/scsi_dh_rdac.c | |||
| @@ -376,7 +376,7 @@ static int get_lun(struct scsi_device *sdev, struct rdac_dh_data *h) | |||
| 376 | if (inqp->page_id[0] != 'e' || inqp->page_id[1] != 'd' || | 376 | if (inqp->page_id[0] != 'e' || inqp->page_id[1] != 'd' || |
| 377 | inqp->page_id[2] != 'i' || inqp->page_id[3] != 'd') | 377 | inqp->page_id[2] != 'i' || inqp->page_id[3] != 'd') |
| 378 | return SCSI_DH_NOSYS; | 378 | return SCSI_DH_NOSYS; |
| 379 | h->lun = scsilun_to_int((struct scsi_lun *)inqp->lun); | 379 | h->lun = inqp->lun[7]; /* Uses only the last byte */ |
| 380 | } | 380 | } |
| 381 | return err; | 381 | return err; |
| 382 | } | 382 | } |
| @@ -386,6 +386,7 @@ static int check_ownership(struct scsi_device *sdev, struct rdac_dh_data *h) | |||
| 386 | int err; | 386 | int err; |
| 387 | struct c9_inquiry *inqp; | 387 | struct c9_inquiry *inqp; |
| 388 | 388 | ||
| 389 | h->lun_state = RDAC_LUN_UNOWNED; | ||
| 389 | err = submit_inquiry(sdev, 0xC9, sizeof(struct c9_inquiry), h); | 390 | err = submit_inquiry(sdev, 0xC9, sizeof(struct c9_inquiry), h); |
| 390 | if (err == SCSI_DH_OK) { | 391 | if (err == SCSI_DH_OK) { |
| 391 | inqp = &h->inq.c9; | 392 | inqp = &h->inq.c9; |
| @@ -550,7 +551,7 @@ static int rdac_check_sense(struct scsi_device *sdev, | |||
| 550 | * | 551 | * |
| 551 | * Just retry and wait. | 552 | * Just retry and wait. |
| 552 | */ | 553 | */ |
| 553 | return NEEDS_RETRY; | 554 | return ADD_TO_MLQUEUE; |
| 554 | break; | 555 | break; |
| 555 | case ILLEGAL_REQUEST: | 556 | case ILLEGAL_REQUEST: |
| 556 | if (sense_hdr->asc == 0x94 && sense_hdr->ascq == 0x01) { | 557 | if (sense_hdr->asc == 0x94 && sense_hdr->ascq == 0x01) { |
| @@ -567,14 +568,14 @@ static int rdac_check_sense(struct scsi_device *sdev, | |||
| 567 | /* | 568 | /* |
| 568 | * Power On, Reset, or Bus Device Reset, just retry. | 569 | * Power On, Reset, or Bus Device Reset, just retry. |
| 569 | */ | 570 | */ |
| 570 | return NEEDS_RETRY; | 571 | return ADD_TO_MLQUEUE; |
| 571 | break; | 572 | break; |
| 572 | } | 573 | } |
| 573 | /* success just means we do not care what scsi-ml does */ | 574 | /* success just means we do not care what scsi-ml does */ |
| 574 | return SCSI_RETURN_NOT_HANDLED; | 575 | return SCSI_RETURN_NOT_HANDLED; |
| 575 | } | 576 | } |
| 576 | 577 | ||
| 577 | const struct scsi_dh_devlist rdac_dev_list[] = { | 578 | static const struct scsi_dh_devlist rdac_dev_list[] = { |
| 578 | {"IBM", "1722"}, | 579 | {"IBM", "1722"}, |
| 579 | {"IBM", "1724"}, | 580 | {"IBM", "1724"}, |
| 580 | {"IBM", "1726"}, | 581 | {"IBM", "1726"}, |
diff --git a/drivers/scsi/dpt/dpti_i2o.h b/drivers/scsi/dpt/dpti_i2o.h index 19406cea6d6a..179ad77f6cc9 100644 --- a/drivers/scsi/dpt/dpti_i2o.h +++ b/drivers/scsi/dpt/dpti_i2o.h | |||
| @@ -21,7 +21,6 @@ | |||
| 21 | 21 | ||
| 22 | #include <linux/i2o-dev.h> | 22 | #include <linux/i2o-dev.h> |
| 23 | 23 | ||
| 24 | #include <linux/version.h> | ||
| 25 | #include <linux/notifier.h> | 24 | #include <linux/notifier.h> |
| 26 | #include <asm/atomic.h> | 25 | #include <asm/atomic.h> |
| 27 | 26 | ||
diff --git a/drivers/scsi/hptiop.c b/drivers/scsi/hptiop.c index da876d3924be..a48e4990fe12 100644 --- a/drivers/scsi/hptiop.c +++ b/drivers/scsi/hptiop.c | |||
| @@ -25,7 +25,6 @@ | |||
| 25 | #include <linux/delay.h> | 25 | #include <linux/delay.h> |
| 26 | #include <linux/timer.h> | 26 | #include <linux/timer.h> |
| 27 | #include <linux/spinlock.h> | 27 | #include <linux/spinlock.h> |
| 28 | #include <linux/hdreg.h> | ||
| 29 | #include <asm/uaccess.h> | 28 | #include <asm/uaccess.h> |
| 30 | #include <asm/io.h> | 29 | #include <asm/io.h> |
| 31 | #include <asm/div64.h> | 30 | #include <asm/div64.h> |
| @@ -1249,6 +1248,13 @@ static struct pci_device_id hptiop_id_table[] = { | |||
| 1249 | { PCI_VDEVICE(TTI, 0x3522), (kernel_ulong_t)&hptiop_itl_ops }, | 1248 | { PCI_VDEVICE(TTI, 0x3522), (kernel_ulong_t)&hptiop_itl_ops }, |
| 1250 | { PCI_VDEVICE(TTI, 0x3410), (kernel_ulong_t)&hptiop_itl_ops }, | 1249 | { PCI_VDEVICE(TTI, 0x3410), (kernel_ulong_t)&hptiop_itl_ops }, |
| 1251 | { PCI_VDEVICE(TTI, 0x3540), (kernel_ulong_t)&hptiop_itl_ops }, | 1250 | { PCI_VDEVICE(TTI, 0x3540), (kernel_ulong_t)&hptiop_itl_ops }, |
| 1251 | { PCI_VDEVICE(TTI, 0x3530), (kernel_ulong_t)&hptiop_itl_ops }, | ||
| 1252 | { PCI_VDEVICE(TTI, 0x3560), (kernel_ulong_t)&hptiop_itl_ops }, | ||
| 1253 | { PCI_VDEVICE(TTI, 0x4322), (kernel_ulong_t)&hptiop_itl_ops }, | ||
| 1254 | { PCI_VDEVICE(TTI, 0x4210), (kernel_ulong_t)&hptiop_itl_ops }, | ||
| 1255 | { PCI_VDEVICE(TTI, 0x4211), (kernel_ulong_t)&hptiop_itl_ops }, | ||
| 1256 | { PCI_VDEVICE(TTI, 0x4310), (kernel_ulong_t)&hptiop_itl_ops }, | ||
| 1257 | { PCI_VDEVICE(TTI, 0x4311), (kernel_ulong_t)&hptiop_itl_ops }, | ||
| 1252 | { PCI_VDEVICE(TTI, 0x3120), (kernel_ulong_t)&hptiop_mv_ops }, | 1258 | { PCI_VDEVICE(TTI, 0x3120), (kernel_ulong_t)&hptiop_mv_ops }, |
| 1253 | { PCI_VDEVICE(TTI, 0x3122), (kernel_ulong_t)&hptiop_mv_ops }, | 1259 | { PCI_VDEVICE(TTI, 0x3122), (kernel_ulong_t)&hptiop_mv_ops }, |
| 1254 | { PCI_VDEVICE(TTI, 0x3020), (kernel_ulong_t)&hptiop_mv_ops }, | 1260 | { PCI_VDEVICE(TTI, 0x3020), (kernel_ulong_t)&hptiop_mv_ops }, |
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c index ae560bc04f9d..4e0b7c8eb32e 100644 --- a/drivers/scsi/ibmvscsi/ibmvfc.c +++ b/drivers/scsi/ibmvscsi/ibmvfc.c | |||
| @@ -556,11 +556,12 @@ static void ibmvfc_link_down(struct ibmvfc_host *vhost, | |||
| 556 | /** | 556 | /** |
| 557 | * ibmvfc_init_host - Start host initialization | 557 | * ibmvfc_init_host - Start host initialization |
| 558 | * @vhost: ibmvfc host struct | 558 | * @vhost: ibmvfc host struct |
| 559 | * @relogin: is this a re-login? | ||
| 559 | * | 560 | * |
| 560 | * Return value: | 561 | * Return value: |
| 561 | * nothing | 562 | * nothing |
| 562 | **/ | 563 | **/ |
| 563 | static void ibmvfc_init_host(struct ibmvfc_host *vhost) | 564 | static void ibmvfc_init_host(struct ibmvfc_host *vhost, int relogin) |
| 564 | { | 565 | { |
| 565 | struct ibmvfc_target *tgt; | 566 | struct ibmvfc_target *tgt; |
| 566 | 567 | ||
| @@ -574,6 +575,11 @@ static void ibmvfc_init_host(struct ibmvfc_host *vhost) | |||
| 574 | } | 575 | } |
| 575 | 576 | ||
| 576 | if (!ibmvfc_set_host_state(vhost, IBMVFC_INITIALIZING)) { | 577 | if (!ibmvfc_set_host_state(vhost, IBMVFC_INITIALIZING)) { |
| 578 | if (!relogin) { | ||
| 579 | memset(vhost->async_crq.msgs, 0, PAGE_SIZE); | ||
| 580 | vhost->async_crq.cur = 0; | ||
| 581 | } | ||
| 582 | |||
| 577 | list_for_each_entry(tgt, &vhost->targets, queue) | 583 | list_for_each_entry(tgt, &vhost->targets, queue) |
| 578 | tgt->need_login = 1; | 584 | tgt->need_login = 1; |
| 579 | scsi_block_requests(vhost->host); | 585 | scsi_block_requests(vhost->host); |
| @@ -1059,9 +1065,10 @@ static void ibmvfc_get_starget_port_id(struct scsi_target *starget) | |||
| 1059 | static int ibmvfc_wait_while_resetting(struct ibmvfc_host *vhost) | 1065 | static int ibmvfc_wait_while_resetting(struct ibmvfc_host *vhost) |
| 1060 | { | 1066 | { |
| 1061 | long timeout = wait_event_timeout(vhost->init_wait_q, | 1067 | long timeout = wait_event_timeout(vhost->init_wait_q, |
| 1062 | (vhost->state == IBMVFC_ACTIVE || | 1068 | ((vhost->state == IBMVFC_ACTIVE || |
| 1063 | vhost->state == IBMVFC_HOST_OFFLINE || | 1069 | vhost->state == IBMVFC_HOST_OFFLINE || |
| 1064 | vhost->state == IBMVFC_LINK_DEAD), | 1070 | vhost->state == IBMVFC_LINK_DEAD) && |
| 1071 | vhost->action == IBMVFC_HOST_ACTION_NONE), | ||
| 1065 | (init_timeout * HZ)); | 1072 | (init_timeout * HZ)); |
| 1066 | 1073 | ||
| 1067 | return timeout ? 0 : -EIO; | 1074 | return timeout ? 0 : -EIO; |
| @@ -1450,8 +1457,8 @@ static void ibmvfc_scsi_done(struct ibmvfc_event *evt) | |||
| 1450 | struct ibmvfc_cmd *vfc_cmd = &evt->xfer_iu->cmd; | 1457 | struct ibmvfc_cmd *vfc_cmd = &evt->xfer_iu->cmd; |
| 1451 | struct ibmvfc_fcp_rsp *rsp = &vfc_cmd->rsp; | 1458 | struct ibmvfc_fcp_rsp *rsp = &vfc_cmd->rsp; |
| 1452 | struct scsi_cmnd *cmnd = evt->cmnd; | 1459 | struct scsi_cmnd *cmnd = evt->cmnd; |
| 1453 | int rsp_len = 0; | 1460 | u32 rsp_len = 0; |
| 1454 | int sense_len = rsp->fcp_sense_len; | 1461 | u32 sense_len = rsp->fcp_sense_len; |
| 1455 | 1462 | ||
| 1456 | if (cmnd) { | 1463 | if (cmnd) { |
| 1457 | if (vfc_cmd->response_flags & IBMVFC_ADAPTER_RESID_VALID) | 1464 | if (vfc_cmd->response_flags & IBMVFC_ADAPTER_RESID_VALID) |
| @@ -1468,7 +1475,7 @@ static void ibmvfc_scsi_done(struct ibmvfc_event *evt) | |||
| 1468 | rsp_len = rsp->fcp_rsp_len; | 1475 | rsp_len = rsp->fcp_rsp_len; |
| 1469 | if ((sense_len + rsp_len) > SCSI_SENSE_BUFFERSIZE) | 1476 | if ((sense_len + rsp_len) > SCSI_SENSE_BUFFERSIZE) |
| 1470 | sense_len = SCSI_SENSE_BUFFERSIZE - rsp_len; | 1477 | sense_len = SCSI_SENSE_BUFFERSIZE - rsp_len; |
| 1471 | if ((rsp->flags & FCP_SNS_LEN_VALID) && rsp->fcp_sense_len) | 1478 | if ((rsp->flags & FCP_SNS_LEN_VALID) && rsp->fcp_sense_len && rsp_len <= 8) |
| 1472 | memcpy(cmnd->sense_buffer, rsp->data.sense + rsp_len, sense_len); | 1479 | memcpy(cmnd->sense_buffer, rsp->data.sense + rsp_len, sense_len); |
| 1473 | 1480 | ||
| 1474 | ibmvfc_log_error(evt); | 1481 | ibmvfc_log_error(evt); |
| @@ -2077,17 +2084,18 @@ static void ibmvfc_handle_async(struct ibmvfc_async_crq *crq, | |||
| 2077 | { | 2084 | { |
| 2078 | const char *desc = ibmvfc_get_ae_desc(crq->event); | 2085 | const char *desc = ibmvfc_get_ae_desc(crq->event); |
| 2079 | 2086 | ||
| 2080 | ibmvfc_log(vhost, 3, "%s event received\n", desc); | 2087 | ibmvfc_log(vhost, 3, "%s event received. scsi_id: %lx, wwpn: %lx," |
| 2088 | " node_name: %lx\n", desc, crq->scsi_id, crq->wwpn, crq->node_name); | ||
| 2081 | 2089 | ||
| 2082 | switch (crq->event) { | 2090 | switch (crq->event) { |
| 2083 | case IBMVFC_AE_LINK_UP: | 2091 | case IBMVFC_AE_LINK_UP: |
| 2084 | case IBMVFC_AE_RESUME: | 2092 | case IBMVFC_AE_RESUME: |
| 2085 | vhost->events_to_log |= IBMVFC_AE_LINKUP; | 2093 | vhost->events_to_log |= IBMVFC_AE_LINKUP; |
| 2086 | ibmvfc_init_host(vhost); | 2094 | ibmvfc_init_host(vhost, 1); |
| 2087 | break; | 2095 | break; |
| 2088 | case IBMVFC_AE_SCN_FABRIC: | 2096 | case IBMVFC_AE_SCN_FABRIC: |
| 2089 | vhost->events_to_log |= IBMVFC_AE_RSCN; | 2097 | vhost->events_to_log |= IBMVFC_AE_RSCN; |
| 2090 | ibmvfc_init_host(vhost); | 2098 | ibmvfc_init_host(vhost, 1); |
| 2091 | break; | 2099 | break; |
| 2092 | case IBMVFC_AE_SCN_NPORT: | 2100 | case IBMVFC_AE_SCN_NPORT: |
| 2093 | case IBMVFC_AE_SCN_GROUP: | 2101 | case IBMVFC_AE_SCN_GROUP: |
| @@ -2133,13 +2141,13 @@ static void ibmvfc_handle_crq(struct ibmvfc_crq *crq, struct ibmvfc_host *vhost) | |||
| 2133 | /* Send back a response */ | 2141 | /* Send back a response */ |
| 2134 | rc = ibmvfc_send_crq_init_complete(vhost); | 2142 | rc = ibmvfc_send_crq_init_complete(vhost); |
| 2135 | if (rc == 0) | 2143 | if (rc == 0) |
| 2136 | ibmvfc_init_host(vhost); | 2144 | ibmvfc_init_host(vhost, 0); |
| 2137 | else | 2145 | else |
| 2138 | dev_err(vhost->dev, "Unable to send init rsp. rc=%ld\n", rc); | 2146 | dev_err(vhost->dev, "Unable to send init rsp. rc=%ld\n", rc); |
| 2139 | break; | 2147 | break; |
| 2140 | case IBMVFC_CRQ_INIT_COMPLETE: | 2148 | case IBMVFC_CRQ_INIT_COMPLETE: |
| 2141 | dev_info(vhost->dev, "Partner initialization complete\n"); | 2149 | dev_info(vhost->dev, "Partner initialization complete\n"); |
| 2142 | ibmvfc_init_host(vhost); | 2150 | ibmvfc_init_host(vhost, 0); |
| 2143 | break; | 2151 | break; |
| 2144 | default: | 2152 | default: |
| 2145 | dev_err(vhost->dev, "Unknown crq message type: %d\n", crq->format); | 2153 | dev_err(vhost->dev, "Unknown crq message type: %d\n", crq->format); |
| @@ -3357,8 +3365,6 @@ static void ibmvfc_npiv_login(struct ibmvfc_host *vhost) | |||
| 3357 | mad->buffer.va = vhost->login_buf_dma; | 3365 | mad->buffer.va = vhost->login_buf_dma; |
| 3358 | mad->buffer.len = sizeof(*vhost->login_buf); | 3366 | mad->buffer.len = sizeof(*vhost->login_buf); |
| 3359 | 3367 | ||
| 3360 | memset(vhost->async_crq.msgs, 0, PAGE_SIZE); | ||
| 3361 | vhost->async_crq.cur = 0; | ||
| 3362 | ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT_WAIT); | 3368 | ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT_WAIT); |
| 3363 | 3369 | ||
| 3364 | if (!ibmvfc_send_event(evt, vhost, default_timeout)) | 3370 | if (!ibmvfc_send_event(evt, vhost, default_timeout)) |
| @@ -3601,8 +3607,9 @@ static void ibmvfc_do_work(struct ibmvfc_host *vhost) | |||
| 3601 | } | 3607 | } |
| 3602 | } | 3608 | } |
| 3603 | 3609 | ||
| 3604 | if (vhost->reinit) { | 3610 | if (vhost->reinit && !ibmvfc_set_host_state(vhost, IBMVFC_INITIALIZING)) { |
| 3605 | vhost->reinit = 0; | 3611 | vhost->reinit = 0; |
| 3612 | scsi_block_requests(vhost->host); | ||
| 3606 | ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY); | 3613 | ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY); |
| 3607 | } else { | 3614 | } else { |
| 3608 | ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_NONE); | 3615 | ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_NONE); |
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.h b/drivers/scsi/ibmvscsi/ibmvfc.h index 4bf6e374f076..fb3177ab6691 100644 --- a/drivers/scsi/ibmvscsi/ibmvfc.h +++ b/drivers/scsi/ibmvscsi/ibmvfc.h | |||
| @@ -29,8 +29,8 @@ | |||
| 29 | #include "viosrp.h" | 29 | #include "viosrp.h" |
| 30 | 30 | ||
| 31 | #define IBMVFC_NAME "ibmvfc" | 31 | #define IBMVFC_NAME "ibmvfc" |
| 32 | #define IBMVFC_DRIVER_VERSION "1.0.1" | 32 | #define IBMVFC_DRIVER_VERSION "1.0.2" |
| 33 | #define IBMVFC_DRIVER_DATE "(July 11, 2008)" | 33 | #define IBMVFC_DRIVER_DATE "(August 14, 2008)" |
| 34 | 34 | ||
| 35 | #define IBMVFC_DEFAULT_TIMEOUT 15 | 35 | #define IBMVFC_DEFAULT_TIMEOUT 15 |
| 36 | #define IBMVFC_INIT_TIMEOUT 30 | 36 | #define IBMVFC_INIT_TIMEOUT 30 |
diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.c b/drivers/scsi/ibmvscsi/ibmvscsi.c index 6b24b9cdb04c..7b1502c0ab6e 100644 --- a/drivers/scsi/ibmvscsi/ibmvscsi.c +++ b/drivers/scsi/ibmvscsi/ibmvscsi.c | |||
| @@ -1636,7 +1636,7 @@ static unsigned long ibmvscsi_get_desired_dma(struct vio_dev *vdev) | |||
| 1636 | unsigned long desired_io = max_requests * sizeof(union viosrp_iu); | 1636 | unsigned long desired_io = max_requests * sizeof(union viosrp_iu); |
| 1637 | 1637 | ||
| 1638 | /* add io space for sg data */ | 1638 | /* add io space for sg data */ |
| 1639 | desired_io += (IBMVSCSI_MAX_SECTORS_DEFAULT * | 1639 | desired_io += (IBMVSCSI_MAX_SECTORS_DEFAULT * 512 * |
| 1640 | IBMVSCSI_CMDS_PER_LUN_DEFAULT); | 1640 | IBMVSCSI_CMDS_PER_LUN_DEFAULT); |
| 1641 | 1641 | ||
| 1642 | return desired_io; | 1642 | return desired_io; |
diff --git a/drivers/scsi/ide-scsi.c b/drivers/scsi/ide-scsi.c index b40a673985aa..461331d3dc45 100644 --- a/drivers/scsi/ide-scsi.c +++ b/drivers/scsi/ide-scsi.c | |||
| @@ -102,11 +102,10 @@ static struct ide_scsi_obj *ide_scsi_get(struct gendisk *disk) | |||
| 102 | mutex_lock(&idescsi_ref_mutex); | 102 | mutex_lock(&idescsi_ref_mutex); |
| 103 | scsi = ide_scsi_g(disk); | 103 | scsi = ide_scsi_g(disk); |
| 104 | if (scsi) { | 104 | if (scsi) { |
| 105 | scsi_host_get(scsi->host); | 105 | if (ide_device_get(scsi->drive)) |
| 106 | if (ide_device_get(scsi->drive)) { | ||
| 107 | scsi_host_put(scsi->host); | ||
| 108 | scsi = NULL; | 106 | scsi = NULL; |
| 109 | } | 107 | else |
| 108 | scsi_host_get(scsi->host); | ||
| 110 | } | 109 | } |
| 111 | mutex_unlock(&idescsi_ref_mutex); | 110 | mutex_unlock(&idescsi_ref_mutex); |
| 112 | return scsi; | 111 | return scsi; |
| @@ -114,9 +113,11 @@ static struct ide_scsi_obj *ide_scsi_get(struct gendisk *disk) | |||
| 114 | 113 | ||
| 115 | static void ide_scsi_put(struct ide_scsi_obj *scsi) | 114 | static void ide_scsi_put(struct ide_scsi_obj *scsi) |
| 116 | { | 115 | { |
| 116 | ide_drive_t *drive = scsi->drive; | ||
| 117 | |||
| 117 | mutex_lock(&idescsi_ref_mutex); | 118 | mutex_lock(&idescsi_ref_mutex); |
| 118 | ide_device_put(scsi->drive); | ||
| 119 | scsi_host_put(scsi->host); | 119 | scsi_host_put(scsi->host); |
| 120 | ide_device_put(drive); | ||
| 120 | mutex_unlock(&idescsi_ref_mutex); | 121 | mutex_unlock(&idescsi_ref_mutex); |
| 121 | } | 122 | } |
| 122 | 123 | ||
diff --git a/drivers/scsi/ips.c b/drivers/scsi/ips.c index 7c615c70ec5c..bc9e6ddf41df 100644 --- a/drivers/scsi/ips.c +++ b/drivers/scsi/ips.c | |||
| @@ -165,7 +165,6 @@ | |||
| 165 | #include <asm/byteorder.h> | 165 | #include <asm/byteorder.h> |
| 166 | #include <asm/page.h> | 166 | #include <asm/page.h> |
| 167 | #include <linux/stddef.h> | 167 | #include <linux/stddef.h> |
| 168 | #include <linux/version.h> | ||
| 169 | #include <linux/string.h> | 168 | #include <linux/string.h> |
| 170 | #include <linux/errno.h> | 169 | #include <linux/errno.h> |
| 171 | #include <linux/kernel.h> | 170 | #include <linux/kernel.h> |
diff --git a/drivers/scsi/ips.h b/drivers/scsi/ips.h index e0657b6f009c..4e49fbcfe8af 100644 --- a/drivers/scsi/ips.h +++ b/drivers/scsi/ips.h | |||
| @@ -50,7 +50,6 @@ | |||
| 50 | #ifndef _IPS_H_ | 50 | #ifndef _IPS_H_ |
| 51 | #define _IPS_H_ | 51 | #define _IPS_H_ |
| 52 | 52 | ||
| 53 | #include <linux/version.h> | ||
| 54 | #include <linux/nmi.h> | 53 | #include <linux/nmi.h> |
| 55 | #include <asm/uaccess.h> | 54 | #include <asm/uaccess.h> |
| 56 | #include <asm/io.h> | 55 | #include <asm/io.h> |
diff --git a/drivers/scsi/lpfc/lpfc_debugfs.c b/drivers/scsi/lpfc/lpfc_debugfs.c index 90272e65957a..094b47e94b29 100644 --- a/drivers/scsi/lpfc/lpfc_debugfs.c +++ b/drivers/scsi/lpfc/lpfc_debugfs.c | |||
| @@ -27,7 +27,6 @@ | |||
| 27 | #include <linux/pci.h> | 27 | #include <linux/pci.h> |
| 28 | #include <linux/spinlock.h> | 28 | #include <linux/spinlock.h> |
| 29 | #include <linux/ctype.h> | 29 | #include <linux/ctype.h> |
| 30 | #include <linux/version.h> | ||
| 31 | 30 | ||
| 32 | #include <scsi/scsi.h> | 31 | #include <scsi/scsi.h> |
| 33 | #include <scsi/scsi_device.h> | 32 | #include <scsi/scsi_device.h> |
diff --git a/drivers/scsi/megaraid/megaraid_sas.c b/drivers/scsi/megaraid/megaraid_sas.c index fc7ac158476c..97b763378e7d 100644 --- a/drivers/scsi/megaraid/megaraid_sas.c +++ b/drivers/scsi/megaraid/megaraid_sas.c | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | * 2 of the License, or (at your option) any later version. | 10 | * 2 of the License, or (at your option) any later version. |
| 11 | * | 11 | * |
| 12 | * FILE : megaraid_sas.c | 12 | * FILE : megaraid_sas.c |
| 13 | * Version : v00.00.03.20-rc1 | 13 | * Version : v00.00.04.01-rc1 |
| 14 | * | 14 | * |
| 15 | * Authors: | 15 | * Authors: |
| 16 | * (email-id : megaraidlinux@lsi.com) | 16 | * (email-id : megaraidlinux@lsi.com) |
| @@ -71,6 +71,10 @@ static struct pci_device_id megasas_pci_table[] = { | |||
| 71 | /* ppc IOP */ | 71 | /* ppc IOP */ |
| 72 | {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS1078DE)}, | 72 | {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS1078DE)}, |
| 73 | /* ppc IOP */ | 73 | /* ppc IOP */ |
| 74 | {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS1078GEN2)}, | ||
| 75 | /* gen2*/ | ||
| 76 | {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS0079GEN2)}, | ||
| 77 | /* gen2*/ | ||
| 74 | {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_VERDE_ZCR)}, | 78 | {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_VERDE_ZCR)}, |
| 75 | /* xscale IOP, vega */ | 79 | /* xscale IOP, vega */ |
| 76 | {PCI_DEVICE(PCI_VENDOR_ID_DELL, PCI_DEVICE_ID_DELL_PERC5)}, | 80 | {PCI_DEVICE(PCI_VENDOR_ID_DELL, PCI_DEVICE_ID_DELL_PERC5)}, |
| @@ -198,6 +202,9 @@ megasas_clear_intr_xscale(struct megasas_register_set __iomem * regs) | |||
| 198 | */ | 202 | */ |
| 199 | writel(status, ®s->outbound_intr_status); | 203 | writel(status, ®s->outbound_intr_status); |
| 200 | 204 | ||
| 205 | /* Dummy readl to force pci flush */ | ||
| 206 | readl(®s->outbound_intr_status); | ||
| 207 | |||
| 201 | return 0; | 208 | return 0; |
| 202 | } | 209 | } |
| 203 | 210 | ||
| @@ -293,6 +300,9 @@ megasas_clear_intr_ppc(struct megasas_register_set __iomem * regs) | |||
| 293 | */ | 300 | */ |
| 294 | writel(status, ®s->outbound_doorbell_clear); | 301 | writel(status, ®s->outbound_doorbell_clear); |
| 295 | 302 | ||
| 303 | /* Dummy readl to force pci flush */ | ||
| 304 | readl(®s->outbound_doorbell_clear); | ||
| 305 | |||
| 296 | return 0; | 306 | return 0; |
| 297 | } | 307 | } |
| 298 | /** | 308 | /** |
| @@ -318,6 +328,99 @@ static struct megasas_instance_template megasas_instance_template_ppc = { | |||
| 318 | }; | 328 | }; |
| 319 | 329 | ||
| 320 | /** | 330 | /** |
| 331 | * The following functions are defined for gen2 (deviceid : 0x78 0x79) | ||
| 332 | * controllers | ||
| 333 | */ | ||
| 334 | |||
| 335 | /** | ||
| 336 | * megasas_enable_intr_gen2 - Enables interrupts | ||
| 337 | * @regs: MFI register set | ||
| 338 | */ | ||
| 339 | static inline void | ||
| 340 | megasas_enable_intr_gen2(struct megasas_register_set __iomem *regs) | ||
| 341 | { | ||
| 342 | writel(0xFFFFFFFF, &(regs)->outbound_doorbell_clear); | ||
| 343 | |||
| 344 | /* write ~0x00000005 (4 & 1) to the intr mask*/ | ||
| 345 | writel(~MFI_GEN2_ENABLE_INTERRUPT_MASK, &(regs)->outbound_intr_mask); | ||
| 346 | |||
| 347 | /* Dummy readl to force pci flush */ | ||
| 348 | readl(®s->outbound_intr_mask); | ||
| 349 | } | ||
| 350 | |||
| 351 | /** | ||
| 352 | * megasas_disable_intr_gen2 - Disables interrupt | ||
| 353 | * @regs: MFI register set | ||
| 354 | */ | ||
| 355 | static inline void | ||
| 356 | megasas_disable_intr_gen2(struct megasas_register_set __iomem *regs) | ||
| 357 | { | ||
| 358 | u32 mask = 0xFFFFFFFF; | ||
| 359 | writel(mask, ®s->outbound_intr_mask); | ||
| 360 | /* Dummy readl to force pci flush */ | ||
| 361 | readl(®s->outbound_intr_mask); | ||
| 362 | } | ||
| 363 | |||
| 364 | /** | ||
| 365 | * megasas_read_fw_status_reg_gen2 - returns the current FW status value | ||
| 366 | * @regs: MFI register set | ||
| 367 | */ | ||
| 368 | static u32 | ||
| 369 | megasas_read_fw_status_reg_gen2(struct megasas_register_set __iomem *regs) | ||
| 370 | { | ||
| 371 | return readl(&(regs)->outbound_scratch_pad); | ||
| 372 | } | ||
| 373 | |||
| 374 | /** | ||
| 375 | * megasas_clear_interrupt_gen2 - Check & clear interrupt | ||
| 376 | * @regs: MFI register set | ||
| 377 | */ | ||
| 378 | static int | ||
| 379 | megasas_clear_intr_gen2(struct megasas_register_set __iomem *regs) | ||
| 380 | { | ||
| 381 | u32 status; | ||
| 382 | /* | ||
| 383 | * Check if it is our interrupt | ||
| 384 | */ | ||
| 385 | status = readl(®s->outbound_intr_status); | ||
| 386 | |||
| 387 | if (!(status & MFI_GEN2_ENABLE_INTERRUPT_MASK)) | ||
| 388 | return 1; | ||
| 389 | |||
| 390 | /* | ||
| 391 | * Clear the interrupt by writing back the same value | ||
| 392 | */ | ||
| 393 | writel(status, ®s->outbound_doorbell_clear); | ||
| 394 | |||
| 395 | /* Dummy readl to force pci flush */ | ||
| 396 | readl(®s->outbound_intr_status); | ||
| 397 | |||
| 398 | return 0; | ||
| 399 | } | ||
| 400 | /** | ||
| 401 | * megasas_fire_cmd_gen2 - Sends command to the FW | ||
| 402 | * @frame_phys_addr : Physical address of cmd | ||
| 403 | * @frame_count : Number of frames for the command | ||
| 404 | * @regs : MFI register set | ||
| 405 | */ | ||
| 406 | static inline void | ||
| 407 | megasas_fire_cmd_gen2(dma_addr_t frame_phys_addr, u32 frame_count, | ||
| 408 | struct megasas_register_set __iomem *regs) | ||
| 409 | { | ||
| 410 | writel((frame_phys_addr | (frame_count<<1))|1, | ||
| 411 | &(regs)->inbound_queue_port); | ||
| 412 | } | ||
| 413 | |||
| 414 | static struct megasas_instance_template megasas_instance_template_gen2 = { | ||
| 415 | |||
| 416 | .fire_cmd = megasas_fire_cmd_gen2, | ||
| 417 | .enable_intr = megasas_enable_intr_gen2, | ||
| 418 | .disable_intr = megasas_disable_intr_gen2, | ||
| 419 | .clear_intr = megasas_clear_intr_gen2, | ||
| 420 | .read_fw_status_reg = megasas_read_fw_status_reg_gen2, | ||
| 421 | }; | ||
| 422 | |||
| 423 | /** | ||
| 321 | * This is the end of set of functions & definitions | 424 | * This is the end of set of functions & definitions |
| 322 | * specific to ppc (deviceid : 0x60) controllers | 425 | * specific to ppc (deviceid : 0x60) controllers |
| 323 | */ | 426 | */ |
| @@ -1976,7 +2079,12 @@ static int megasas_init_mfi(struct megasas_instance *instance) | |||
| 1976 | /* | 2079 | /* |
| 1977 | * Map the message registers | 2080 | * Map the message registers |
| 1978 | */ | 2081 | */ |
| 1979 | instance->base_addr = pci_resource_start(instance->pdev, 0); | 2082 | if ((instance->pdev->device == PCI_DEVICE_ID_LSI_SAS1078GEN2) || |
| 2083 | (instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0079GEN2)) { | ||
| 2084 | instance->base_addr = pci_resource_start(instance->pdev, 1); | ||
| 2085 | } else { | ||
| 2086 | instance->base_addr = pci_resource_start(instance->pdev, 0); | ||
| 2087 | } | ||
| 1980 | 2088 | ||
| 1981 | if (pci_request_regions(instance->pdev, "megasas: LSI")) { | 2089 | if (pci_request_regions(instance->pdev, "megasas: LSI")) { |
| 1982 | printk(KERN_DEBUG "megasas: IO memory region busy!\n"); | 2090 | printk(KERN_DEBUG "megasas: IO memory region busy!\n"); |
| @@ -1998,6 +2106,10 @@ static int megasas_init_mfi(struct megasas_instance *instance) | |||
| 1998 | case PCI_DEVICE_ID_LSI_SAS1078DE: | 2106 | case PCI_DEVICE_ID_LSI_SAS1078DE: |
| 1999 | instance->instancet = &megasas_instance_template_ppc; | 2107 | instance->instancet = &megasas_instance_template_ppc; |
| 2000 | break; | 2108 | break; |
| 2109 | case PCI_DEVICE_ID_LSI_SAS1078GEN2: | ||
| 2110 | case PCI_DEVICE_ID_LSI_SAS0079GEN2: | ||
| 2111 | instance->instancet = &megasas_instance_template_gen2; | ||
| 2112 | break; | ||
| 2001 | case PCI_DEVICE_ID_LSI_SAS1064R: | 2113 | case PCI_DEVICE_ID_LSI_SAS1064R: |
| 2002 | case PCI_DEVICE_ID_DELL_PERC5: | 2114 | case PCI_DEVICE_ID_DELL_PERC5: |
| 2003 | default: | 2115 | default: |
| @@ -2857,6 +2969,7 @@ static void megasas_shutdown(struct pci_dev *pdev) | |||
| 2857 | { | 2969 | { |
| 2858 | struct megasas_instance *instance = pci_get_drvdata(pdev); | 2970 | struct megasas_instance *instance = pci_get_drvdata(pdev); |
| 2859 | megasas_flush_cache(instance); | 2971 | megasas_flush_cache(instance); |
| 2972 | megasas_shutdown_controller(instance, MR_DCMD_CTRL_SHUTDOWN); | ||
| 2860 | } | 2973 | } |
| 2861 | 2974 | ||
| 2862 | /** | 2975 | /** |
| @@ -3292,7 +3405,7 @@ megasas_sysfs_set_dbg_lvl(struct device_driver *dd, const char *buf, size_t coun | |||
| 3292 | return retval; | 3405 | return retval; |
| 3293 | } | 3406 | } |
| 3294 | 3407 | ||
| 3295 | static DRIVER_ATTR(dbg_lvl, S_IRUGO|S_IWUGO, megasas_sysfs_show_dbg_lvl, | 3408 | static DRIVER_ATTR(dbg_lvl, S_IRUGO|S_IWUSR, megasas_sysfs_show_dbg_lvl, |
| 3296 | megasas_sysfs_set_dbg_lvl); | 3409 | megasas_sysfs_set_dbg_lvl); |
| 3297 | 3410 | ||
| 3298 | static ssize_t | 3411 | static ssize_t |
diff --git a/drivers/scsi/megaraid/megaraid_sas.h b/drivers/scsi/megaraid/megaraid_sas.h index b0c41e671702..0d033248fdf1 100644 --- a/drivers/scsi/megaraid/megaraid_sas.h +++ b/drivers/scsi/megaraid/megaraid_sas.h | |||
| @@ -18,9 +18,9 @@ | |||
| 18 | /* | 18 | /* |
| 19 | * MegaRAID SAS Driver meta data | 19 | * MegaRAID SAS Driver meta data |
| 20 | */ | 20 | */ |
| 21 | #define MEGASAS_VERSION "00.00.03.20-rc1" | 21 | #define MEGASAS_VERSION "00.00.04.01" |
| 22 | #define MEGASAS_RELDATE "March 10, 2008" | 22 | #define MEGASAS_RELDATE "July 24, 2008" |
| 23 | #define MEGASAS_EXT_VERSION "Mon. March 10 11:02:31 PDT 2008" | 23 | #define MEGASAS_EXT_VERSION "Thu July 24 11:41:51 PST 2008" |
| 24 | 24 | ||
| 25 | /* | 25 | /* |
| 26 | * Device IDs | 26 | * Device IDs |
| @@ -28,6 +28,8 @@ | |||
| 28 | #define PCI_DEVICE_ID_LSI_SAS1078R 0x0060 | 28 | #define PCI_DEVICE_ID_LSI_SAS1078R 0x0060 |
| 29 | #define PCI_DEVICE_ID_LSI_SAS1078DE 0x007C | 29 | #define PCI_DEVICE_ID_LSI_SAS1078DE 0x007C |
| 30 | #define PCI_DEVICE_ID_LSI_VERDE_ZCR 0x0413 | 30 | #define PCI_DEVICE_ID_LSI_VERDE_ZCR 0x0413 |
| 31 | #define PCI_DEVICE_ID_LSI_SAS1078GEN2 0x0078 | ||
| 32 | #define PCI_DEVICE_ID_LSI_SAS0079GEN2 0x0079 | ||
| 31 | 33 | ||
| 32 | /* | 34 | /* |
| 33 | * ===================================== | 35 | * ===================================== |
| @@ -580,6 +582,8 @@ struct megasas_ctrl_info { | |||
| 580 | #define MEGASAS_COMPLETION_TIMER_INTERVAL (HZ/10) | 582 | #define MEGASAS_COMPLETION_TIMER_INTERVAL (HZ/10) |
| 581 | 583 | ||
| 582 | #define MFI_REPLY_1078_MESSAGE_INTERRUPT 0x80000000 | 584 | #define MFI_REPLY_1078_MESSAGE_INTERRUPT 0x80000000 |
| 585 | #define MFI_REPLY_GEN2_MESSAGE_INTERRUPT 0x00000001 | ||
| 586 | #define MFI_GEN2_ENABLE_INTERRUPT_MASK (0x00000001 | 0x00000004) | ||
| 583 | 587 | ||
| 584 | /* | 588 | /* |
| 585 | * register set for both 1068 and 1078 controllers | 589 | * register set for both 1068 and 1078 controllers |
diff --git a/drivers/scsi/nsp32.c b/drivers/scsi/nsp32.c index edf9fdb3cb3c..22052bb7becb 100644 --- a/drivers/scsi/nsp32.c +++ b/drivers/scsi/nsp32.c | |||
| @@ -23,7 +23,6 @@ | |||
| 23 | * 1.2: PowerPC (big endian) support. | 23 | * 1.2: PowerPC (big endian) support. |
| 24 | */ | 24 | */ |
| 25 | 25 | ||
| 26 | #include <linux/version.h> | ||
| 27 | #include <linux/module.h> | 26 | #include <linux/module.h> |
| 28 | #include <linux/init.h> | 27 | #include <linux/init.h> |
| 29 | #include <linux/kernel.h> | 28 | #include <linux/kernel.h> |
diff --git a/drivers/scsi/nsp32.h b/drivers/scsi/nsp32.h index 6715ecb3bfca..9565acf1aa72 100644 --- a/drivers/scsi/nsp32.h +++ b/drivers/scsi/nsp32.h | |||
| @@ -16,7 +16,6 @@ | |||
| 16 | #ifndef _NSP32_H | 16 | #ifndef _NSP32_H |
| 17 | #define _NSP32_H | 17 | #define _NSP32_H |
| 18 | 18 | ||
| 19 | #include <linux/version.h> | ||
| 20 | //#define NSP32_DEBUG 9 | 19 | //#define NSP32_DEBUG 9 |
| 21 | 20 | ||
| 22 | /* | 21 | /* |
diff --git a/drivers/scsi/pcmcia/nsp_cs.c b/drivers/scsi/pcmcia/nsp_cs.c index a221b6ef9fa9..24e6cb8396e3 100644 --- a/drivers/scsi/pcmcia/nsp_cs.c +++ b/drivers/scsi/pcmcia/nsp_cs.c | |||
| @@ -25,7 +25,6 @@ | |||
| 25 | 25 | ||
| 26 | ***********************************************************************/ | 26 | ***********************************************************************/ |
| 27 | 27 | ||
| 28 | #include <linux/version.h> | ||
| 29 | #include <linux/module.h> | 28 | #include <linux/module.h> |
| 30 | #include <linux/kernel.h> | 29 | #include <linux/kernel.h> |
| 31 | #include <linux/init.h> | 30 | #include <linux/init.h> |
diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c index a319a20ed440..45e7dcb4b34d 100644 --- a/drivers/scsi/qla2xxx/qla_attr.c +++ b/drivers/scsi/qla2xxx/qla_attr.c | |||
| @@ -993,6 +993,17 @@ qla2x00_terminate_rport_io(struct fc_rport *rport) | |||
| 993 | { | 993 | { |
| 994 | fc_port_t *fcport = *(fc_port_t **)rport->dd_data; | 994 | fc_port_t *fcport = *(fc_port_t **)rport->dd_data; |
| 995 | 995 | ||
| 996 | /* | ||
| 997 | * At this point all fcport's software-states are cleared. Perform any | ||
| 998 | * final cleanup of firmware resources (PCBs and XCBs). | ||
| 999 | */ | ||
| 1000 | if (fcport->loop_id != FC_NO_LOOP_ID) { | ||
| 1001 | fcport->ha->isp_ops->fabric_logout(fcport->ha, fcport->loop_id, | ||
| 1002 | fcport->d_id.b.domain, fcport->d_id.b.area, | ||
| 1003 | fcport->d_id.b.al_pa); | ||
| 1004 | fcport->loop_id = FC_NO_LOOP_ID; | ||
| 1005 | } | ||
| 1006 | |||
| 996 | qla2x00_abort_fcport_cmds(fcport); | 1007 | qla2x00_abort_fcport_cmds(fcport); |
| 997 | scsi_target_unblock(&rport->dev); | 1008 | scsi_target_unblock(&rport->dev); |
| 998 | } | 1009 | } |
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index 6da31ba94404..94a720eabfd8 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h | |||
| @@ -2237,6 +2237,7 @@ typedef struct scsi_qla_host { | |||
| 2237 | #define REGISTER_FDMI_NEEDED 26 | 2237 | #define REGISTER_FDMI_NEEDED 26 |
| 2238 | #define FCPORT_UPDATE_NEEDED 27 | 2238 | #define FCPORT_UPDATE_NEEDED 27 |
| 2239 | #define VP_DPC_NEEDED 28 /* wake up for VP dpc handling */ | 2239 | #define VP_DPC_NEEDED 28 /* wake up for VP dpc handling */ |
| 2240 | #define UNLOADING 29 | ||
| 2240 | 2241 | ||
| 2241 | uint32_t device_flags; | 2242 | uint32_t device_flags; |
| 2242 | #define DFLG_LOCAL_DEVICES BIT_0 | 2243 | #define DFLG_LOCAL_DEVICES BIT_0 |
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 601a6b29750c..ee89ddd64aae 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c | |||
| @@ -976,8 +976,9 @@ qla2x00_setup_chip(scsi_qla_host_t *ha) | |||
| 976 | &ha->fw_attributes, &ha->fw_memory_size); | 976 | &ha->fw_attributes, &ha->fw_memory_size); |
| 977 | qla2x00_resize_request_q(ha); | 977 | qla2x00_resize_request_q(ha); |
| 978 | ha->flags.npiv_supported = 0; | 978 | ha->flags.npiv_supported = 0; |
| 979 | if ((IS_QLA24XX(ha) || IS_QLA25XX(ha)) && | 979 | if ((IS_QLA24XX(ha) || IS_QLA25XX(ha) || |
| 980 | (ha->fw_attributes & BIT_2)) { | 980 | IS_QLA84XX(ha)) && |
| 981 | (ha->fw_attributes & BIT_2)) { | ||
| 981 | ha->flags.npiv_supported = 1; | 982 | ha->flags.npiv_supported = 1; |
| 982 | if ((!ha->max_npiv_vports) || | 983 | if ((!ha->max_npiv_vports) || |
| 983 | ((ha->max_npiv_vports + 1) % | 984 | ((ha->max_npiv_vports + 1) % |
| @@ -3251,6 +3252,7 @@ qla2x00_abort_isp(scsi_qla_host_t *ha) | |||
| 3251 | { | 3252 | { |
| 3252 | int rval; | 3253 | int rval; |
| 3253 | uint8_t status = 0; | 3254 | uint8_t status = 0; |
| 3255 | scsi_qla_host_t *vha; | ||
| 3254 | 3256 | ||
| 3255 | if (ha->flags.online) { | 3257 | if (ha->flags.online) { |
| 3256 | ha->flags.online = 0; | 3258 | ha->flags.online = 0; |
| @@ -3265,6 +3267,8 @@ qla2x00_abort_isp(scsi_qla_host_t *ha) | |||
| 3265 | if (atomic_read(&ha->loop_state) != LOOP_DOWN) { | 3267 | if (atomic_read(&ha->loop_state) != LOOP_DOWN) { |
| 3266 | atomic_set(&ha->loop_state, LOOP_DOWN); | 3268 | atomic_set(&ha->loop_state, LOOP_DOWN); |
| 3267 | qla2x00_mark_all_devices_lost(ha, 0); | 3269 | qla2x00_mark_all_devices_lost(ha, 0); |
| 3270 | list_for_each_entry(vha, &ha->vp_list, vp_list) | ||
| 3271 | qla2x00_mark_all_devices_lost(vha, 0); | ||
| 3268 | } else { | 3272 | } else { |
| 3269 | if (!atomic_read(&ha->loop_down_timer)) | 3273 | if (!atomic_read(&ha->loop_down_timer)) |
| 3270 | atomic_set(&ha->loop_down_timer, | 3274 | atomic_set(&ha->loop_down_timer, |
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index 874d802edb7d..bf41887cdd65 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c | |||
| @@ -879,11 +879,12 @@ qla2x00_handle_sense(srb_t *sp, uint8_t *sense_data, uint32_t sense_len) | |||
| 879 | sp->request_sense_ptr += sense_len; | 879 | sp->request_sense_ptr += sense_len; |
| 880 | sp->request_sense_length -= sense_len; | 880 | sp->request_sense_length -= sense_len; |
| 881 | if (sp->request_sense_length != 0) | 881 | if (sp->request_sense_length != 0) |
| 882 | sp->ha->status_srb = sp; | 882 | sp->fcport->ha->status_srb = sp; |
| 883 | 883 | ||
| 884 | DEBUG5(printk("%s(): Check condition Sense data, scsi(%ld:%d:%d:%d) " | 884 | DEBUG5(printk("%s(): Check condition Sense data, scsi(%ld:%d:%d:%d) " |
| 885 | "cmd=%p pid=%ld\n", __func__, sp->ha->host_no, cp->device->channel, | 885 | "cmd=%p pid=%ld\n", __func__, sp->fcport->ha->host_no, |
| 886 | cp->device->id, cp->device->lun, cp, cp->serial_number)); | 886 | cp->device->channel, cp->device->id, cp->device->lun, cp, |
| 887 | cp->serial_number)); | ||
| 887 | if (sense_len) | 888 | if (sense_len) |
| 888 | DEBUG5(qla2x00_dump_buffer(cp->sense_buffer, | 889 | DEBUG5(qla2x00_dump_buffer(cp->sense_buffer, |
| 889 | CMD_ACTUAL_SNSLEN(cp))); | 890 | CMD_ACTUAL_SNSLEN(cp))); |
| @@ -1184,9 +1185,8 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt) | |||
| 1184 | atomic_read(&fcport->state))); | 1185 | atomic_read(&fcport->state))); |
| 1185 | 1186 | ||
| 1186 | cp->result = DID_BUS_BUSY << 16; | 1187 | cp->result = DID_BUS_BUSY << 16; |
| 1187 | if (atomic_read(&fcport->state) == FCS_ONLINE) { | 1188 | if (atomic_read(&fcport->state) == FCS_ONLINE) |
| 1188 | qla2x00_mark_device_lost(ha, fcport, 1, 1); | 1189 | qla2x00_mark_device_lost(fcport->ha, fcport, 1, 1); |
| 1189 | } | ||
| 1190 | break; | 1190 | break; |
| 1191 | 1191 | ||
| 1192 | case CS_RESET: | 1192 | case CS_RESET: |
| @@ -1229,7 +1229,7 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt) | |||
| 1229 | 1229 | ||
| 1230 | /* Check to see if logout occurred. */ | 1230 | /* Check to see if logout occurred. */ |
| 1231 | if ((le16_to_cpu(sts->status_flags) & SF_LOGOUT_SENT)) | 1231 | if ((le16_to_cpu(sts->status_flags) & SF_LOGOUT_SENT)) |
| 1232 | qla2x00_mark_device_lost(ha, fcport, 1, 1); | 1232 | qla2x00_mark_device_lost(fcport->ha, fcport, 1, 1); |
| 1233 | break; | 1233 | break; |
| 1234 | 1234 | ||
| 1235 | default: | 1235 | default: |
| @@ -1834,7 +1834,6 @@ clear_risc_ints: | |||
| 1834 | WRT_REG_WORD(®->isp.hccr, HCCR_CLR_HOST_INT); | 1834 | WRT_REG_WORD(®->isp.hccr, HCCR_CLR_HOST_INT); |
| 1835 | } | 1835 | } |
| 1836 | spin_unlock_irq(&ha->hardware_lock); | 1836 | spin_unlock_irq(&ha->hardware_lock); |
| 1837 | ha->isp_ops->enable_intrs(ha); | ||
| 1838 | 1837 | ||
| 1839 | fail: | 1838 | fail: |
| 1840 | return ret; | 1839 | return ret; |
diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c index bc90d6b8d0a0..813bc7784c0a 100644 --- a/drivers/scsi/qla2xxx/qla_mbx.c +++ b/drivers/scsi/qla2xxx/qla_mbx.c | |||
| @@ -2686,7 +2686,7 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *ha, | |||
| 2686 | set_bit(VP_IDX_ACQUIRED, &vha->vp_flags); | 2686 | set_bit(VP_IDX_ACQUIRED, &vha->vp_flags); |
| 2687 | set_bit(VP_DPC_NEEDED, &ha->dpc_flags); | 2687 | set_bit(VP_DPC_NEEDED, &ha->dpc_flags); |
| 2688 | 2688 | ||
| 2689 | wake_up_process(ha->dpc_thread); | 2689 | qla2xxx_wake_dpc(ha); |
| 2690 | } | 2690 | } |
| 2691 | } | 2691 | } |
| 2692 | 2692 | ||
diff --git a/drivers/scsi/qla2xxx/qla_mid.c b/drivers/scsi/qla2xxx/qla_mid.c index 50baf6a1d67c..93560cd72784 100644 --- a/drivers/scsi/qla2xxx/qla_mid.c +++ b/drivers/scsi/qla2xxx/qla_mid.c | |||
| @@ -6,7 +6,6 @@ | |||
| 6 | */ | 6 | */ |
| 7 | #include "qla_def.h" | 7 | #include "qla_def.h" |
| 8 | 8 | ||
| 9 | #include <linux/version.h> | ||
| 10 | #include <linux/moduleparam.h> | 9 | #include <linux/moduleparam.h> |
| 11 | #include <linux/vmalloc.h> | 10 | #include <linux/vmalloc.h> |
| 12 | #include <linux/smp_lock.h> | 11 | #include <linux/smp_lock.h> |
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 7c8af7ed2a5d..6d0f0e5f2827 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
| @@ -780,7 +780,8 @@ qla2x00_eh_wait_for_pending_commands(scsi_qla_host_t *ha, unsigned int t, | |||
| 780 | sp = pha->outstanding_cmds[cnt]; | 780 | sp = pha->outstanding_cmds[cnt]; |
| 781 | if (!sp) | 781 | if (!sp) |
| 782 | continue; | 782 | continue; |
| 783 | if (ha->vp_idx != sp->ha->vp_idx) | 783 | |
| 784 | if (ha->vp_idx != sp->fcport->ha->vp_idx) | ||
| 784 | continue; | 785 | continue; |
| 785 | match = 0; | 786 | match = 0; |
| 786 | switch (type) { | 787 | switch (type) { |
| @@ -1080,9 +1081,7 @@ qla2x00_abort_all_cmds(scsi_qla_host_t *ha, int res) | |||
| 1080 | sp = ha->outstanding_cmds[cnt]; | 1081 | sp = ha->outstanding_cmds[cnt]; |
| 1081 | if (sp) { | 1082 | if (sp) { |
| 1082 | ha->outstanding_cmds[cnt] = NULL; | 1083 | ha->outstanding_cmds[cnt] = NULL; |
| 1083 | sp->flags = 0; | ||
| 1084 | sp->cmd->result = res; | 1084 | sp->cmd->result = res; |
| 1085 | sp->cmd->host_scribble = (unsigned char *)NULL; | ||
| 1086 | qla2x00_sp_compl(ha, sp); | 1085 | qla2x00_sp_compl(ha, sp); |
| 1087 | } | 1086 | } |
| 1088 | } | 1087 | } |
| @@ -1741,6 +1740,8 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
| 1741 | if (ret) | 1740 | if (ret) |
| 1742 | goto probe_failed; | 1741 | goto probe_failed; |
| 1743 | 1742 | ||
| 1743 | ha->isp_ops->enable_intrs(ha); | ||
| 1744 | |||
| 1744 | scsi_scan_host(host); | 1745 | scsi_scan_host(host); |
| 1745 | 1746 | ||
| 1746 | qla2x00_alloc_sysfs_attr(ha); | 1747 | qla2x00_alloc_sysfs_attr(ha); |
| @@ -1776,10 +1777,15 @@ probe_out: | |||
| 1776 | static void | 1777 | static void |
| 1777 | qla2x00_remove_one(struct pci_dev *pdev) | 1778 | qla2x00_remove_one(struct pci_dev *pdev) |
| 1778 | { | 1779 | { |
| 1779 | scsi_qla_host_t *ha; | 1780 | scsi_qla_host_t *ha, *vha, *temp; |
| 1780 | 1781 | ||
| 1781 | ha = pci_get_drvdata(pdev); | 1782 | ha = pci_get_drvdata(pdev); |
| 1782 | 1783 | ||
| 1784 | list_for_each_entry_safe(vha, temp, &ha->vp_list, vp_list) | ||
| 1785 | fc_vport_terminate(vha->fc_vport); | ||
| 1786 | |||
| 1787 | set_bit(UNLOADING, &ha->dpc_flags); | ||
| 1788 | |||
| 1783 | qla2x00_dfs_remove(ha); | 1789 | qla2x00_dfs_remove(ha); |
| 1784 | 1790 | ||
| 1785 | qla84xx_put_chip(ha); | 1791 | qla84xx_put_chip(ha); |
| @@ -2451,8 +2457,10 @@ qla2x00_do_dpc(void *data) | |||
| 2451 | void | 2457 | void |
| 2452 | qla2xxx_wake_dpc(scsi_qla_host_t *ha) | 2458 | qla2xxx_wake_dpc(scsi_qla_host_t *ha) |
| 2453 | { | 2459 | { |
| 2454 | if (ha->dpc_thread) | 2460 | struct task_struct *t = ha->dpc_thread; |
| 2455 | wake_up_process(ha->dpc_thread); | 2461 | |
| 2462 | if (!test_bit(UNLOADING, &ha->dpc_flags) && t) | ||
| 2463 | wake_up_process(t); | ||
| 2456 | } | 2464 | } |
| 2457 | 2465 | ||
| 2458 | /* | 2466 | /* |
diff --git a/drivers/scsi/qla2xxx/qla_version.h b/drivers/scsi/qla2xxx/qla_version.h index 676c390db354..4160e4caa7b9 100644 --- a/drivers/scsi/qla2xxx/qla_version.h +++ b/drivers/scsi/qla2xxx/qla_version.h | |||
| @@ -7,7 +7,7 @@ | |||
| 7 | /* | 7 | /* |
| 8 | * Driver version | 8 | * Driver version |
| 9 | */ | 9 | */ |
| 10 | #define QLA2XXX_VERSION "8.02.01-k6" | 10 | #define QLA2XXX_VERSION "8.02.01-k7" |
| 11 | 11 | ||
| 12 | #define QLA_DRIVER_MAJOR_VER 8 | 12 | #define QLA_DRIVER_MAJOR_VER 8 |
| 13 | #define QLA_DRIVER_MINOR_VER 2 | 13 | #define QLA_DRIVER_MINOR_VER 2 |
diff --git a/drivers/scsi/qlogicpti.c b/drivers/scsi/qlogicpti.c index 4a1cf6377f6c..905350896725 100644 --- a/drivers/scsi/qlogicpti.c +++ b/drivers/scsi/qlogicpti.c | |||
| @@ -914,6 +914,7 @@ static inline int load_cmd(struct scsi_cmnd *Cmnd, struct Command_Entry *cmd, | |||
| 914 | ds[i].d_count = sg_dma_len(s); | 914 | ds[i].d_count = sg_dma_len(s); |
| 915 | } | 915 | } |
| 916 | sg_count -= n; | 916 | sg_count -= n; |
| 917 | sg = s; | ||
| 917 | } | 918 | } |
| 918 | } else { | 919 | } else { |
| 919 | cmd->dataseg[0].d_base = 0; | 920 | cmd->dataseg[0].d_base = 0; |
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c index 880051c89bde..39ce3aba1dac 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c | |||
| @@ -391,7 +391,7 @@ static int scsi_check_sense(struct scsi_cmnd *scmd) | |||
| 391 | 391 | ||
| 392 | case HARDWARE_ERROR: | 392 | case HARDWARE_ERROR: |
| 393 | if (scmd->device->retry_hwerror) | 393 | if (scmd->device->retry_hwerror) |
| 394 | return NEEDS_RETRY; | 394 | return ADD_TO_MLQUEUE; |
| 395 | else | 395 | else |
| 396 | return SUCCESS; | 396 | return SUCCESS; |
| 397 | 397 | ||
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index ff5d56b3ee4d..62307bd794a9 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
| @@ -852,7 +852,7 @@ static void scsi_end_bidi_request(struct scsi_cmnd *cmd) | |||
| 852 | void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes) | 852 | void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes) |
| 853 | { | 853 | { |
| 854 | int result = cmd->result; | 854 | int result = cmd->result; |
| 855 | int this_count = scsi_bufflen(cmd); | 855 | int this_count; |
| 856 | struct request_queue *q = cmd->device->request_queue; | 856 | struct request_queue *q = cmd->device->request_queue; |
| 857 | struct request *req = cmd->request; | 857 | struct request *req = cmd->request; |
| 858 | int error = 0; | 858 | int error = 0; |
| @@ -908,6 +908,7 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes) | |||
| 908 | */ | 908 | */ |
| 909 | if (scsi_end_request(cmd, error, good_bytes, result == 0) == NULL) | 909 | if (scsi_end_request(cmd, error, good_bytes, result == 0) == NULL) |
| 910 | return; | 910 | return; |
| 911 | this_count = blk_rq_bytes(req); | ||
| 911 | 912 | ||
| 912 | /* good_bytes = 0, or (inclusive) there were leftovers and | 913 | /* good_bytes = 0, or (inclusive) there were leftovers and |
| 913 | * result = 0, so scsi_end_request couldn't retry. | 914 | * result = 0, so scsi_end_request couldn't retry. |
diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c index 84b4879cff11..34d0de6cd511 100644 --- a/drivers/scsi/scsi_scan.c +++ b/drivers/scsi/scsi_scan.c | |||
| @@ -1080,7 +1080,8 @@ static int scsi_probe_and_add_lun(struct scsi_target *starget, | |||
| 1080 | * PDT=1Fh none (no FDD connected to the requested logical unit) | 1080 | * PDT=1Fh none (no FDD connected to the requested logical unit) |
| 1081 | */ | 1081 | */ |
| 1082 | if (((result[0] >> 5) == 1 || starget->pdt_1f_for_no_lun) && | 1082 | if (((result[0] >> 5) == 1 || starget->pdt_1f_for_no_lun) && |
| 1083 | (result[0] & 0x1f) == 0x1f) { | 1083 | (result[0] & 0x1f) == 0x1f && |
| 1084 | !scsi_is_wlun(lun)) { | ||
| 1084 | SCSI_LOG_SCAN_BUS(3, printk(KERN_INFO | 1085 | SCSI_LOG_SCAN_BUS(3, printk(KERN_INFO |
| 1085 | "scsi scan: peripheral device type" | 1086 | "scsi scan: peripheral device type" |
| 1086 | " of 31, no device added\n")); | 1087 | " of 31, no device added\n")); |
diff --git a/drivers/scsi/scsi_transport_spi.c b/drivers/scsi/scsi_transport_spi.c index 75a64a6cae8c..b29360ed0bdc 100644 --- a/drivers/scsi/scsi_transport_spi.c +++ b/drivers/scsi/scsi_transport_spi.c | |||
| @@ -366,12 +366,14 @@ spi_transport_rd_attr(rti, "%d\n"); | |||
| 366 | spi_transport_rd_attr(pcomp_en, "%d\n"); | 366 | spi_transport_rd_attr(pcomp_en, "%d\n"); |
| 367 | spi_transport_rd_attr(hold_mcs, "%d\n"); | 367 | spi_transport_rd_attr(hold_mcs, "%d\n"); |
| 368 | 368 | ||
| 369 | /* we only care about the first child device so we return 1 */ | 369 | /* we only care about the first child device that's a real SCSI device |
| 370 | * so we return 1 to terminate the iteration when we find it */ | ||
| 370 | static int child_iter(struct device *dev, void *data) | 371 | static int child_iter(struct device *dev, void *data) |
| 371 | { | 372 | { |
| 372 | struct scsi_device *sdev = to_scsi_device(dev); | 373 | if (!scsi_is_sdev_device(dev)) |
| 374 | return 0; | ||
| 373 | 375 | ||
| 374 | spi_dv_device(sdev); | 376 | spi_dv_device(to_scsi_device(dev)); |
| 375 | return 1; | 377 | return 1; |
| 376 | } | 378 | } |
| 377 | 379 | ||
diff --git a/drivers/scsi/ses.c b/drivers/scsi/ses.c index 0fe031f003e7..1bcf3c33d7ff 100644 --- a/drivers/scsi/ses.c +++ b/drivers/scsi/ses.c | |||
| @@ -345,14 +345,14 @@ static int ses_enclosure_find_by_addr(struct enclosure_device *edev, | |||
| 345 | return 0; | 345 | return 0; |
| 346 | } | 346 | } |
| 347 | 347 | ||
| 348 | #define VPD_INQUIRY_SIZE 512 | 348 | #define VPD_INQUIRY_SIZE 36 |
| 349 | 349 | ||
| 350 | static void ses_match_to_enclosure(struct enclosure_device *edev, | 350 | static void ses_match_to_enclosure(struct enclosure_device *edev, |
| 351 | struct scsi_device *sdev) | 351 | struct scsi_device *sdev) |
| 352 | { | 352 | { |
| 353 | unsigned char *buf = kmalloc(VPD_INQUIRY_SIZE, GFP_KERNEL); | 353 | unsigned char *buf = kmalloc(VPD_INQUIRY_SIZE, GFP_KERNEL); |
| 354 | unsigned char *desc; | 354 | unsigned char *desc; |
| 355 | int len; | 355 | u16 vpd_len; |
| 356 | struct efd efd = { | 356 | struct efd efd = { |
| 357 | .addr = 0, | 357 | .addr = 0, |
| 358 | }; | 358 | }; |
| @@ -372,9 +372,19 @@ static void ses_match_to_enclosure(struct enclosure_device *edev, | |||
| 372 | VPD_INQUIRY_SIZE, NULL, SES_TIMEOUT, SES_RETRIES)) | 372 | VPD_INQUIRY_SIZE, NULL, SES_TIMEOUT, SES_RETRIES)) |
| 373 | goto free; | 373 | goto free; |
| 374 | 374 | ||
| 375 | len = (buf[2] << 8) + buf[3]; | 375 | vpd_len = (buf[2] << 8) + buf[3]; |
| 376 | kfree(buf); | ||
| 377 | buf = kmalloc(vpd_len, GFP_KERNEL); | ||
| 378 | if (!buf) | ||
| 379 | return; | ||
| 380 | cmd[3] = vpd_len >> 8; | ||
| 381 | cmd[4] = vpd_len & 0xff; | ||
| 382 | if (scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, buf, | ||
| 383 | vpd_len, NULL, SES_TIMEOUT, SES_RETRIES)) | ||
| 384 | goto free; | ||
| 385 | |||
| 376 | desc = buf + 4; | 386 | desc = buf + 4; |
| 377 | while (desc < buf + len) { | 387 | while (desc < buf + vpd_len) { |
| 378 | enum scsi_protocol proto = desc[0] >> 4; | 388 | enum scsi_protocol proto = desc[0] >> 4; |
| 379 | u8 code_set = desc[0] & 0x0f; | 389 | u8 code_set = desc[0] & 0x0f; |
| 380 | u8 piv = desc[1] & 0x80; | 390 | u8 piv = desc[1] & 0x80; |
diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index d3b8ebb83776..661f9f21650a 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c | |||
| @@ -217,6 +217,18 @@ static int sg_last_dev(void); | |||
| 217 | #define SZ_SG_IOVEC sizeof(sg_iovec_t) | 217 | #define SZ_SG_IOVEC sizeof(sg_iovec_t) |
| 218 | #define SZ_SG_REQ_INFO sizeof(sg_req_info_t) | 218 | #define SZ_SG_REQ_INFO sizeof(sg_req_info_t) |
| 219 | 219 | ||
| 220 | static int sg_allow_access(struct file *filp, unsigned char *cmd) | ||
| 221 | { | ||
| 222 | struct sg_fd *sfp = (struct sg_fd *)filp->private_data; | ||
| 223 | struct request_queue *q = sfp->parentdp->device->request_queue; | ||
| 224 | |||
| 225 | if (sfp->parentdp->device->type == TYPE_SCANNER) | ||
| 226 | return 0; | ||
| 227 | |||
| 228 | return blk_verify_command(&q->cmd_filter, | ||
| 229 | cmd, filp->f_mode & FMODE_WRITE); | ||
| 230 | } | ||
| 231 | |||
| 220 | static int | 232 | static int |
| 221 | sg_open(struct inode *inode, struct file *filp) | 233 | sg_open(struct inode *inode, struct file *filp) |
| 222 | { | 234 | { |
| @@ -689,7 +701,7 @@ sg_new_write(Sg_fd *sfp, struct file *file, const char __user *buf, | |||
| 689 | sg_remove_request(sfp, srp); | 701 | sg_remove_request(sfp, srp); |
| 690 | return -EFAULT; | 702 | return -EFAULT; |
| 691 | } | 703 | } |
| 692 | if (read_only && !blk_verify_command(file, cmnd)) { | 704 | if (read_only && sg_allow_access(file, cmnd)) { |
| 693 | sg_remove_request(sfp, srp); | 705 | sg_remove_request(sfp, srp); |
| 694 | return -EPERM; | 706 | return -EPERM; |
| 695 | } | 707 | } |
| @@ -793,6 +805,7 @@ sg_ioctl(struct inode *inode, struct file *filp, | |||
| 793 | 805 | ||
| 794 | if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp))) | 806 | if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp))) |
| 795 | return -ENXIO; | 807 | return -ENXIO; |
| 808 | |||
| 796 | SCSI_LOG_TIMEOUT(3, printk("sg_ioctl: %s, cmd=0x%x\n", | 809 | SCSI_LOG_TIMEOUT(3, printk("sg_ioctl: %s, cmd=0x%x\n", |
| 797 | sdp->disk->disk_name, (int) cmd_in)); | 810 | sdp->disk->disk_name, (int) cmd_in)); |
| 798 | read_only = (O_RDWR != (filp->f_flags & O_ACCMODE)); | 811 | read_only = (O_RDWR != (filp->f_flags & O_ACCMODE)); |
| @@ -1061,7 +1074,7 @@ sg_ioctl(struct inode *inode, struct file *filp, | |||
| 1061 | 1074 | ||
| 1062 | if (copy_from_user(&opcode, siocp->data, 1)) | 1075 | if (copy_from_user(&opcode, siocp->data, 1)) |
| 1063 | return -EFAULT; | 1076 | return -EFAULT; |
| 1064 | if (!blk_verify_command(filp, &opcode)) | 1077 | if (sg_allow_access(filp, &opcode)) |
| 1065 | return -EPERM; | 1078 | return -EPERM; |
| 1066 | } | 1079 | } |
| 1067 | return sg_scsi_ioctl(filp, sdp->device->request_queue, NULL, p); | 1080 | return sg_scsi_ioctl(filp, sdp->device->request_queue, NULL, p); |
| @@ -1747,7 +1760,7 @@ st_map_user_pages(struct scatterlist *sgl, const unsigned int max_pages, | |||
| 1747 | */ | 1760 | */ |
| 1748 | flush_dcache_page(pages[i]); | 1761 | flush_dcache_page(pages[i]); |
| 1749 | /* ?? Is locking needed? I don't think so */ | 1762 | /* ?? Is locking needed? I don't think so */ |
| 1750 | /* if (TestSetPageLocked(pages[i])) | 1763 | /* if (!trylock_page(pages[i])) |
| 1751 | goto out_unlock; */ | 1764 | goto out_unlock; */ |
| 1752 | } | 1765 | } |
| 1753 | 1766 | ||
